X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fgpt-auto-generator%2Fgpt-auto-generator.c;h=5c58b58f8a35c3144ba7d59234b48efcb6df7407;hb=dbffab87f1504abc9f189dd253111693c99fbd9a;hp=0e935b30b9707f4fae1cd439a88d0118ac064dc7;hpb=23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41;p=elogind.git diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c index 0e935b30b..5c58b58f8 100644 --- a/src/gpt-auto-generator/gpt-auto-generator.c +++ b/src/gpt-auto-generator/gpt-auto-generator.c @@ -26,10 +26,6 @@ #include #include -#ifdef HAVE_LINUX_BTRFS_H -#include -#endif - #include "sd-id128.h" #include "libudev.h" #include "path-util.h" @@ -45,6 +41,7 @@ #include "fileio.h" #include "efivars.h" #include "blkid-util.h" +#include "btrfs-util.h" static const char *arg_dest = "/tmp"; static bool arg_enabled = true; @@ -68,10 +65,8 @@ static int add_swap(const char *path) { return log_oom(); f = fopen(unit, "wxe"); - if (!f) { - log_error("Failed to create unit file %s: %m", unit); - return -errno; - } + if (!f) + return log_error_errno(errno, "Failed to create unit file %s: %m", unit); fprintf(f, "# Automatically generated by systemd-gpt-auto-generator\n\n" @@ -83,20 +78,16 @@ static int add_swap(const char *path) { path); fflush(f); - if (ferror(f)) { - log_error("Failed to write unit file %s: %m", unit); - return -errno; - } + if (ferror(f)) + return log_error_errno(errno, "Failed to write unit file %s: %m", unit); lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET ".wants/", name, NULL); if (!lnk) return log_oom(); mkdir_parents_label(lnk, 0755); - if (symlink(unit, lnk) < 0) { - log_error("Failed to create symlink %s: %m", lnk); - return -errno; - } + if (symlink(unit, lnk) < 0) + return log_error_errno(errno, "Failed to create symlink %s: %m", lnk); return 0; } @@ -128,10 +119,8 @@ static int add_cryptsetup(const char *id, const char *what, bool rw, char **devi return log_oom(); f = fopen(p, "wxe"); - if (!f) { - log_error("Failed to create unit file %s: %m", p); - return -errno; - } + if (!f) + return log_error_errno(errno, "Failed to create unit file %s: %m", p); fprintf(f, "# Automatically generated by systemd-gpt-auto-generator\n\n" @@ -155,22 +144,18 @@ static int add_cryptsetup(const char *id, const char *what, bool rw, char **devi id); fflush(f); - if (ferror(f)) { - log_error("Failed to write file %s: %m", p); - return -errno; - } + if (ferror(f)) + return log_error_errno(errno, "Failed to write file %s: %m", p); - from = strappenda("../", n); + from = strjoina("../", n); to = strjoin(arg_dest, "/", d, ".wants/", n, NULL); if (!to) return log_oom(); mkdir_parents_label(to, 0755); - if (symlink(from, to) < 0) { - log_error("Failed to create symlink %s: %m", to); - return -errno; - } + if (symlink(from, to) < 0) + return log_error_errno(errno, "Failed to create symlink %s: %m", to); free(to); to = strjoin(arg_dest, "/cryptsetup.target.requires/", n, NULL); @@ -178,10 +163,8 @@ static int add_cryptsetup(const char *id, const char *what, bool rw, char **devi return log_oom(); mkdir_parents_label(to, 0755); - if (symlink(from, to) < 0) { - log_error("Failed to create symlink %s: %m", to); - return -errno; - } + if (symlink(from, to) < 0) + return log_error_errno(errno, "Failed to create symlink %s: %m", to); free(to); to = strjoin(arg_dest, "/dev-mapper-", e, ".device.requires/", n, NULL); @@ -189,10 +172,8 @@ static int add_cryptsetup(const char *id, const char *what, bool rw, char **devi return log_oom(); mkdir_parents_label(to, 0755); - if (symlink(from, to) < 0) { - log_error("Failed to create symlink %s: %m", to); - return -errno; - } + if (symlink(from, to) < 0) + return log_error_errno(errno, "Failed to create symlink %s: %m", to); free(p); p = strjoin(arg_dest, "/dev-mapper-", e, ".device.d/50-job-timeout-sec-0.conf", NULL); @@ -254,10 +235,8 @@ static int add_mount( return log_oom(); f = fopen(p, "wxe"); - if (!f) { - log_error("Failed to create unit file %s: %m", unit); - return -errno; - } + if (!f) + return log_error_errno(errno, "Failed to create unit file %s: %m", unit); fprintf(f, "# Automatically generated by systemd-gpt-auto-generator\n\n" @@ -286,10 +265,8 @@ static int add_mount( fprintf(f, "Options=%s\n", rw ? "rw" : "ro"); fflush(f); - if (ferror(f)) { - log_error("Failed to write unit file %s: %m", p); - return -errno; - } + if (ferror(f)) + return log_error_errno(errno, "Failed to write unit file %s: %m", p); if (post) { lnk = strjoin(arg_dest, "/", post, ".requires/", unit, NULL); @@ -297,10 +274,8 @@ static int add_mount( return log_oom(); mkdir_parents_label(lnk, 0755); - if (symlink(p, lnk) < 0) { - log_error("Failed to create symlink %s: %m", lnk); - return -errno; - } + if (symlink(p, lnk) < 0) + return log_error_errno(errno, "Failed to create symlink %s: %m", lnk); } return 0; @@ -337,7 +312,7 @@ static int probe_and_add_mount( if (!b) { if (errno == 0) return log_oom(); - log_error("Failed to allocate prober: %m"); + log_error_errno(errno, "Failed to allocate prober: %m"); return -errno; } @@ -351,7 +326,7 @@ static int probe_and_add_mount( else if (r != 0) { if (errno == 0) errno = EIO; - log_error("Failed to probe %s: %m", what); + log_error_errno(errno, "Failed to probe %s: %m", what); return -errno; } @@ -429,7 +404,7 @@ static int enumerate_partitions(dev_t devnum) { if (errno == 0) return log_oom(); - log_error("Failed allocate prober: %m"); + log_error_errno(errno, "Failed allocate prober: %m"); return -errno; } @@ -443,7 +418,7 @@ static int enumerate_partitions(dev_t devnum) { else if (r != 0) { if (errno == 0) errno = EIO; - log_error("Failed to probe %s: %m", node); + log_error_errno(errno, "Failed to probe %s: %m", node); return -errno; } @@ -452,7 +427,7 @@ static int enumerate_partitions(dev_t devnum) { if (r != 0) { if (errno == 0) errno = EIO; - log_error("Failed to determine partition table type of %s: %m", node); + log_error_errno(errno, "Failed to determine partition table type of %s: %m", node); return -errno; } @@ -468,7 +443,7 @@ static int enumerate_partitions(dev_t devnum) { if (errno == 0) return log_oom(); - log_error("Failed to list partitions of %s: %m", node); + log_error_errno(errno, "Failed to list partitions of %s: %m", node); return -errno; } @@ -594,54 +569,6 @@ static int enumerate_partitions(dev_t devnum) { return r; } -static int get_btrfs_block_device(const char *path, dev_t *dev) { - struct btrfs_ioctl_fs_info_args fsi = {}; - _cleanup_close_ int fd = -1; - uint64_t id; - - assert(path); - assert(dev); - - fd = open(path, O_DIRECTORY|O_CLOEXEC); - if (fd < 0) - return -errno; - - if (ioctl(fd, BTRFS_IOC_FS_INFO, &fsi) < 0) - return -errno; - - /* We won't do this for btrfs RAID */ - if (fsi.num_devices != 1) - return 0; - - for (id = 1; id <= fsi.max_id; id++) { - struct btrfs_ioctl_dev_info_args di = { - .devid = id, - }; - struct stat st; - - if (ioctl(fd, BTRFS_IOC_DEV_INFO, &di) < 0) { - if (errno == ENODEV) - continue; - - return -errno; - } - - if (stat((char*) di.path, &st) < 0) - return -errno; - - if (!S_ISBLK(st.st_mode)) - return -ENODEV; - - if (major(st.st_rdev) == 0) - return -ENODEV; - - *dev = st.st_rdev; - return 1; - } - - return -ENODEV; -} - static int get_block_device(const char *path, dev_t *dev) { struct stat st; struct statfs sfs; @@ -661,7 +588,7 @@ static int get_block_device(const char *path, dev_t *dev) { return -errno; if (F_TYPE_EQUAL(sfs.f_type, BTRFS_SUPER_MAGIC)) - return get_btrfs_block_device(path, dev); + return btrfs_get_block_device(path, dev); return 0; }