chiark / gitweb /
clients: unify how we invoke getopt_long()
[elogind.git] / src / fstab-generator / fstab-generator.c
index 9e7d55d177650e1a4f2642013dd0ac10d2eafc35..96b090614944228afbe4cea1d7efe77a12d66ae9 100644 (file)
@@ -32,7 +32,6 @@
 #include "mount-setup.h"
 #include "special.h"
 #include "mkdir.h"
-#include "virt.h"
 #include "fileio.h"
 
 static const char *arg_dest = "/tmp";
@@ -209,17 +208,42 @@ static int add_mount(
                         "Before=%s\n",
                         post);
 
+        if (passno > 0) {
+                if (streq(where, "/")) {
+                        lnk = strjoin(arg_dest, "/", SPECIAL_LOCAL_FS_TARGET, ".wants/", "systemd-fsck-root.service", NULL);
+                        if (!lnk)
+                                return log_oom();
+
+                        mkdir_parents_label(lnk, 0755);
+                        if (symlink("systemd-fsck-root.service", lnk) < 0) {
+                                log_error("Failed to create symlink %s: %m", lnk);
+                                return -errno;
+                        }
+                } else {
+                        _cleanup_free_ char *fsck = NULL;
+
+                        fsck = unit_name_from_path_instance("systemd-fsck", what, ".service");
+                        if (!fsck)
+                                return log_oom();
+
+                        fprintf(f,
+                                "Requires=%s\n"
+                                "After=%s\n",
+                                fsck,
+                                fsck);
+                }
+        }
+
+
         fprintf(f,
                 "\n"
                 "[Mount]\n"
                 "What=%s\n"
                 "Where=%s\n"
-                "Type=%s\n"
-                "FsckPassNo=%i\n",
+                "Type=%s\n",
                 what,
                 where,
-                type,
-                passno);
+                type);
 
         if (!isempty(opts) &&
             !streq(opts, "defaults"))
@@ -235,6 +259,7 @@ static int add_mount(
 
         if (!noauto) {
                 if (post) {
+                        free(lnk);
                         lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL);
                         if (!lnk)
                                 return log_oom();
@@ -369,16 +394,16 @@ static int parse_fstab(const char *prefix, bool initrd) {
 
 static int parse_new_root_from_proc_cmdline(void) {
         _cleanup_free_ char *what = NULL, *type = NULL, *opts = NULL, *line = NULL;
+        bool noauto, nofail;
         char *w, *state;
-        int r;
         size_t l;
-        bool noauto, nofail;
+        int r;
 
-        r = read_one_line_file("/proc/cmdline", &line);
-        if (r < 0) {
-                log_error("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
+        r = proc_cmdline(&line);
+        if (r < 0)
+                log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
+        if (r <= 0)
                 return 0;
-        }
 
         opts = strdup("ro");
         type = strdup("auto");
@@ -442,7 +467,7 @@ static int parse_new_root_from_proc_cmdline(void) {
         }
 
         log_debug("Found entry what=%s where=/sysroot type=%s", what, type);
-        r = add_mount(what, "/sysroot", type, opts, 0, noauto, nofail, false,
+        r = add_mount(what, "/sysroot", type, opts, 1, noauto, nofail, false,
                       SPECIAL_INITRD_ROOT_FS_TARGET, "/proc/cmdline");
 
         return (r < 0) ? r : 0;
@@ -451,17 +476,14 @@ static int parse_new_root_from_proc_cmdline(void) {
 static int parse_proc_cmdline(void) {
         _cleanup_free_ char *line = NULL;
         char *w, *state;
-        int r;
         size_t l;
+        int r;
 
-        if (detect_container(NULL) > 0)
-                return 0;
-
-        r = read_one_line_file("/proc/cmdline", &line);
-        if (r < 0) {
+        r = proc_cmdline(&line);
+        if (r < 0)
                 log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
+        if (r <= 0)
                 return 0;
-        }
 
         FOREACH_WORD_QUOTED(w, l, line, state) {
                 _cleanup_free_ char *word = NULL;