- opts = strdup("defaults");
- if (!opts)
- return log_oom();
- type = strdup("auto");
- if (!type)
- return log_oom();
-
- /* root= and roofstype= may occur more than once, the last instance should take precedence.
- * In the case of multiple rootflags= the arguments should be concatenated */
- FOREACH_WORD_QUOTED(w, l, line, state) {
- char *word, *tmp_word;
-
- word = strndup(w, l);
- if (!word)
- return log_oom();
-
- else if (startswith(word, "root=")) {
- free(what);
- what = fstab_node_to_udev_node(word+5);
- if (!what)
- return log_oom();
-
- } else if (startswith(word, "rootfstype=")) {
- free(type);
- type = strdup(word + 11);
- if (!type)
- return log_oom();
-
- } else if (startswith(word, "rootflags=")) {
- tmp_word = opts;
- opts = strjoin(opts, ",", word + 10, NULL);
- free(tmp_word);
- if (!opts)
- return log_oom();
-
- } else if (streq(word, "ro") || streq(word, "rw")) {
- tmp_word = opts;
- opts = strjoin(opts, ",", word, NULL);
- free(tmp_word);
- if (!opts)
- return log_oom();
-
- } else if (streq(word, "rootwait"))
- wait = true;
-
- free(word);
- }
-
- if (what) {
-
- log_debug("Found entry what=%s where=/new_root type=%s", what, type);
- r = add_mount(what, "/new_root", type, opts, 0, wait, false, false,
- false, false, false, "/proc/cmdline");
-
- if (r < 0)
- return r;
- } else
- log_error("Could not find a root= entry on the kernel commandline.");