chiark / gitweb /
fstab-generator: use more appropriate checks for swap and device availability
[elogind.git] / src / fstab-generator / fstab-generator.c
index 1c85a729b82093392dbf85608b704de24a558488..496657bdc176a25b170788d8304bf306ceff5b1b 100644 (file)
@@ -87,6 +87,11 @@ 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;
@@ -148,10 +153,8 @@ static int add_swap(
                         return log_oom();
 
                 mkdir_parents_label(lnk, 0755);
-                if (symlink(unit, lnk) < 0) {
-                        log_error_errno(errno, "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;
@@ -268,10 +271,8 @@ static int add_mount(
                 fprintf(f, "Options=%s\n", filtered);
 
         fflush(f);
-        if (ferror(f)) {
-                log_error_errno(errno, "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);
 
         if (!noauto && post) {
                 lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL);
@@ -279,10 +280,8 @@ static int add_mount(
                         return log_oom();
 
                 mkdir_parents_label(lnk, 0755);
-                if (symlink(unit, lnk) < 0) {
-                        log_error_errno(errno, "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);
         }
 
         if (automount) {
@@ -296,10 +295,8 @@ static int add_mount(
 
                 fclose(f);
                 f = fopen(automount_unit, "wxe");
-                if (!f) {
-                        log_error_errno(errno, "Failed to create unit file %s: %m", automount_unit);
-                        return -errno;
-                }
+                if (!f)
+                        return log_error_errno(errno, "Failed to create unit file %s: %m", automount_unit);
 
                 fprintf(f,
                         "# Automatically generated by systemd-fstab-generator\n\n"
@@ -319,10 +316,8 @@ static int add_mount(
                         where);
 
                 fflush(f);
-                if (ferror(f)) {
-                        log_error_errno(errno, "Failed to write unit file %s: %m", automount_unit);
-                        return -errno;
-                }
+                if (ferror(f))
+                        return log_error_errno(errno, "Failed to write unit file %s: %m", automount_unit);
 
                 free(lnk);
                 lnk = strjoin(arg_dest, "/", post, nofail ? ".wants/" : ".requires/", automount_name, NULL);
@@ -330,10 +325,8 @@ static int add_mount(
                         return log_oom();
 
                 mkdir_parents_label(lnk, 0755);
-                if (symlink(automount_unit, lnk) < 0) {
-                        log_error_errno(errno, "Failed to create symlink %s: %m", lnk);
-                        return -errno;
-                }
+                if (symlink(automount_unit, lnk) < 0)
+                        return log_error_errno(errno, "Failed to create symlink %s: %m", lnk);
         }
 
         return 0;
@@ -367,7 +360,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;
                 }
@@ -488,7 +481,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);
@@ -497,7 +490,13 @@ 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 (!mount_test_option(arg_usr_options, "ro") &&
+                 !mount_test_option(arg_usr_options, "rw"))
+                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,
@@ -629,6 +628,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;
 }