X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Ffstab-generator%2Ffstab-generator.c;h=bc4c1556ca467c26ea3236f03448e2a66b3d2290;hp=e8a21f7fff75078fb2d848deb30172493fc50c59;hb=b9f111b93f9f442f00266f338b14f25ca8685352;hpb=4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4f diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index e8a21f7ff..bc4c1556c 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -29,6 +29,7 @@ #include "util.h" #include "unit-name.h" #include "path-util.h" +#include "fstab-util.h" #include "mount-setup.h" #include "special.h" #include "mkdir.h" @@ -47,33 +48,6 @@ static char *arg_usr_what = NULL; static char *arg_usr_fstype = NULL; static char *arg_usr_options = NULL; -static int mount_find_pri(struct mntent *me, int *ret) { - char *end, *opt; - unsigned long r; - - assert(me); - assert(ret); - - opt = hasmntopt(me, "pri"); - if (!opt) - return 0; - - opt += strlen("pri"); - if (*opt != '=') - return -EINVAL; - - errno = 0; - r = strtoul(opt + 1, &end, 10); - if (errno > 0) - return -errno; - - if (end == opt + 1 || (*end != ',' && *end != 0)) - return -EINVAL; - - *ret = (int) r; - return 1; -} - static int add_swap( const char *what, struct mntent *me, @@ -87,16 +61,19 @@ static int add_swap( assert(what); assert(me); + if (access("/proc/swaps", F_OK) < 0) { + log_info("Swap not supported, ignoring fstab swap entry for %s.", what); + return 0; + } + if (detect_container(NULL) > 0) { log_info("Running in a container, ignoring fstab swap entry for %s.", what); return 0; } - r = mount_find_pri(me, &pri); - if (r < 0) { - log_error("Failed to parse priority"); - return r; - } + r = fstab_find_pri(me->mnt_opts, &pri); + if (r < 0) + return log_error_errno(r, "Failed to parse priority: %m"); name = unit_name_from_path(what, ".swap"); if (!name) @@ -158,17 +135,15 @@ static int add_swap( static bool mount_is_network(struct mntent *me) { assert(me); - return - hasmntopt(me, "_netdev") || - fstype_is_network(me->mnt_type); + return fstab_test_option(me->mnt_opts, "_netdev\0") || + fstype_is_network(me->mnt_type); } static bool mount_in_initrd(struct mntent *me) { assert(me); - return - hasmntopt(me, "x-initrd.mount") || - streq(me->mnt_dir, "/usr"); + return fstab_test_option(me->mnt_opts, "x-initrd.mount\0") || + streq(me->mnt_dir, "/usr"); } static int add_mount( @@ -355,7 +330,7 @@ static int parse_fstab(bool initrd) { if (!what) return log_oom(); - if (detect_container(NULL) > 0 && is_device_path(what)) { + if (is_device_path(what) && path_is_read_only_fs("sys") > 0) { log_info("Running in a container, ignoring fstab device entry for %s.", what); continue; } @@ -367,8 +342,8 @@ static int parse_fstab(bool initrd) { if (is_path(where)) path_kill_slashes(where); - noauto = !!hasmntopt(me, "noauto"); - nofail = !!hasmntopt(me, "nofail"); + noauto = fstab_test_yes_no_option(me->mnt_opts, "noauto\0" "auto\0"); + nofail = fstab_test_yes_no_option(me->mnt_opts, "nofail\0" "fail\0"); log_debug("Found entry what=%s where=%s type=%s nofail=%s noauto=%s", what, where, me->mnt_type, yes_no(noauto), yes_no(nofail)); @@ -379,10 +354,9 @@ static int parse_fstab(bool initrd) { bool automount; const char *post; - automount = - hasmntopt(me, "comment=systemd.automount") || - hasmntopt(me, "x-systemd.automount"); - + automount = fstab_test_option(me->mnt_opts, + "comment=systemd.automount\0" + "x-systemd.automount\0"); if (initrd) post = SPECIAL_INITRD_FS_TARGET; else if (mount_in_initrd(me)) @@ -429,8 +403,7 @@ static int add_root_mount(void) { if (!arg_root_options) opts = arg_root_rw > 0 ? "rw" : "ro"; else if (arg_root_rw >= 0 || - (!mount_test_option(arg_root_options, "ro") && - !mount_test_option(arg_root_options, "rw"))) + !fstab_test_option(arg_root_options, "ro\0" "rw\0")) opts = strappenda(arg_root_options, ",", arg_root_rw > 0 ? "rw" : "ro"); else opts = arg_root_options; @@ -476,7 +449,7 @@ static int add_usr_mount(void) { return log_oom(); } - if (!arg_usr_what || !arg_usr_options) + if (!arg_usr_what) return 0; what = fstab_node_to_udev_node(arg_usr_what); @@ -485,7 +458,12 @@ static int add_usr_mount(void) { return -1; } - opts = arg_usr_options; + if (!arg_usr_options) + opts = arg_root_rw > 0 ? "rw" : "ro"; + else if (!fstab_test_option(arg_usr_options, "ro\0" "rw\0")) + opts = strappenda(arg_usr_options, ",", arg_root_rw > 0 ? "rw" : "ro"); + else + opts = arg_usr_options; log_debug("Found entry what=%s where=/sysroot/usr type=%s", what, strna(arg_usr_fstype)); return add_mount(what, @@ -617,6 +595,12 @@ int main(int argc, char *argv[]) { } free(arg_root_what); + free(arg_root_fstype); + free(arg_root_options); + + free(arg_usr_what); + free(arg_usr_fstype); + free(arg_usr_options); return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; }