diff options
Diffstat (limited to 'src/fstab-generator')
-rw-r--r-- | src/fstab-generator/fstab-generator.c | 175 |
1 files changed, 52 insertions, 123 deletions
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index a0173d821e..f3ecc24be6 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -79,8 +79,8 @@ static int mount_find_pri(struct mntent *me, int *ret) { } static int add_swap(const char *what, struct mntent *me) { - char *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL; - FILE *f = NULL; + char _cleanup_free_ *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL; + FILE _cleanup_fclose_ *f = NULL; bool noauto, nofail; int r, pri = -1; @@ -97,25 +97,20 @@ static int add_swap(const char *what, struct mntent *me) { nofail = !!hasmntopt(me, "nofail"); name = unit_name_from_path(what, ".swap"); - if (!name) { - r = log_oom(); - goto finish; - } + if (!name) + return log_oom(); unit = strjoin(arg_dest, "/", name, NULL); - if (!unit) { - r = log_oom(); - goto finish; - } + if (!unit) + return log_oom(); f = fopen(unit, "wxe"); if (!f) { - r = -errno; if (errno == EEXIST) log_error("Failed to create swap unit file %s, as it already exists. Duplicate entry in /etc/fstab?", unit); else log_error("Failed to create unit file %s: %m", unit); - goto finish; + return -errno; } fputs("# Automatically generated by systemd-fstab-generator\n\n" @@ -142,56 +137,39 @@ static int add_swap(const char *what, struct mntent *me) { fflush(f); if (ferror(f)) { log_error("Failed to write unit file %s: %m", unit); - r = -errno; - goto finish; + return -errno; } if (!noauto) { lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET ".wants/", name, NULL); - if (!lnk) { - r = log_oom(); - goto finish; - } + if (!lnk) + return log_oom(); mkdir_parents_label(lnk, 0755); if (symlink(unit, lnk) < 0) { log_error("Failed to create symlink %s: %m", lnk); - r = -errno; - goto finish; + return -errno; } r = device_name(what, &device); if (r < 0) - goto finish; + return r; if (r > 0) { free(lnk); lnk = strjoin(arg_dest, "/", device, ".wants/", name, NULL); - if (!lnk) { - r = log_oom(); - goto finish; - } + if (!lnk) + return log_oom(); mkdir_parents_label(lnk, 0755); if (symlink(unit, lnk) < 0) { log_error("Failed to create symlink %s: %m", lnk); - r = -errno; - goto finish; + return -errno; } } } - r = 0; -finish: - if (f) - fclose(f); - - free(unit); - free(lnk); - free(name); - free(device); - - return r; + return 0; } static bool mount_is_bind(struct mntent *me) { @@ -213,8 +191,10 @@ static bool mount_is_network(struct mntent *me) { static int add_mount(const char *what, const char *where, const char *type, const char *opts, int passno, bool wait, bool noauto, bool nofail, bool automount, bool isbind, bool isnetwork, const char *source) { - char *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL, *automount_name = NULL, *automount_unit = NULL; - FILE *f = NULL; + char _cleanup_free_ + *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL, + *automount_name = NULL, *automount_unit = NULL; + FILE _cleanup_fclose_ *f = NULL; int r; const char *post, *pre; @@ -245,25 +225,20 @@ static int add_mount(const char *what, const char *where, const char *type, cons } name = unit_name_from_path(where, ".mount"); - if (!name) { - r = log_oom(); - goto finish; - } + if (!name) + return log_oom(); unit = strjoin(arg_dest, "/", name, NULL); - if (!unit) { - r = log_oom(); - goto finish; - } + if (!unit) + return log_oom(); f = fopen(unit, "wxe"); if (!f) { - r = -errno; if (errno == EEXIST) log_error("Failed to create mount unit file %s, as it already exists. Duplicate entry in /etc/fstab?", unit); else log_error("Failed to create unit file %s: %m", unit); - goto finish; + return -errno; } fprintf(f, @@ -313,22 +288,18 @@ static int add_mount(const char *what, const char *where, const char *type, cons fflush(f); if (ferror(f)) { log_error("Failed to write unit file %s: %m", unit); - r = -errno; - goto finish; + return -errno; } if (!noauto) { lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL); - if (!lnk) { - r = log_oom(); - goto finish; - } + if (!lnk) + return log_oom(); mkdir_parents_label(lnk, 0755); if (symlink(unit, lnk) < 0) { log_error("Failed to create symlink %s: %m", lnk); - r = -errno; - goto finish; + return -errno; } if (!isbind && @@ -336,21 +307,18 @@ static int add_mount(const char *what, const char *where, const char *type, cons r = device_name(what, &device); if (r < 0) - goto finish; + return r; if (r > 0) { free(lnk); lnk = strjoin(arg_dest, "/", device, ".wants/", name, NULL); - if (!lnk) { - r = log_oom(); - goto finish; - } + if (!lnk) + return log_oom(); mkdir_parents_label(lnk, 0755); if (symlink(unit, lnk) < 0) { log_error("Failed to create symlink %s: %m", lnk); - r = -errno; - goto finish; + return -errno; } } } @@ -358,23 +326,18 @@ static int add_mount(const char *what, const char *where, const char *type, cons if (automount && !path_equal(where, "/")) { automount_name = unit_name_from_path(where, ".automount"); - if (!name) { - r = log_oom(); - goto finish; - } + if (!name) + return log_oom(); automount_unit = strjoin(arg_dest, "/", automount_name, NULL); - if (!automount_unit) { - r = log_oom(); - goto finish; - } + if (!automount_unit) + return log_oom(); fclose(f); f = fopen(automount_unit, "wxe"); if (!f) { - r = -errno; log_error("Failed to create unit file %s: %m", automount_unit); - goto finish; + return -errno; } fprintf(f, @@ -393,38 +356,22 @@ static int add_mount(const char *what, const char *where, const char *type, cons fflush(f); if (ferror(f)) { log_error("Failed to write unit file %s: %m", automount_unit); - r = -errno; - goto finish; + return -errno; } free(lnk); lnk = strjoin(arg_dest, "/", post, nofail ? ".wants/" : ".requires/", automount_name, NULL); - if (!lnk) { - r = log_oom(); - goto finish; - } + if (!lnk) + return log_oom(); mkdir_parents_label(lnk, 0755); if (symlink(automount_unit, lnk) < 0) { log_error("Failed to create symlink %s: %m", lnk); - r = -errno; - goto finish; + return -errno; } } - r = 0; -finish: - if (f) - fclose(f); - - free(unit); - free(lnk); - free(name); - free(device); - free(automount_name); - free(automount_unit); - - return r; + return 0; } static int parse_fstab(void) { @@ -443,19 +390,13 @@ static int parse_fstab(void) { } while ((me = getmntent(f))) { - char *where, *what; + char _cleanup_free_ *where = NULL, *what = NULL; int k; what = fstab_node_to_udev_node(me->mnt_fsname); - if (!what) { - r = log_oom(); - goto finish; - } - where = strdup(me->mnt_dir); - if (!where) { + if (!what || !where) { r = log_oom(); - free(what); goto finish; } @@ -483,9 +424,6 @@ static int parse_fstab(void) { "/etc/fstab"); } - free(what); - free(where); - if (k < 0) r = k; } @@ -509,10 +447,8 @@ static int parse_new_root_from_proc_cmdline(void) { } opts = strdup("defaults"); - if (!opts) - return log_oom(); type = strdup("auto"); - if (!type) + if (!opts || !type) return log_oom(); /* root= and roofstype= may occur more than once, the last instance should take precedence. @@ -571,7 +507,8 @@ static int parse_new_root_from_proc_cmdline(void) { } static int parse_proc_cmdline(void) { - char *line, *w, *state; + char _cleanup_free_ *line = NULL; + char *w, *state; int r; size_t l; @@ -585,13 +522,11 @@ static int parse_proc_cmdline(void) { } FOREACH_WORD_QUOTED(w, l, line, state) { - char *word; + char _cleanup_free_ *word = NULL; word = strndup(w, l); - if (!word) { - r = log_oom(); - goto finish; - } + if (!word) + return log_oom(); if (startswith(word, "fstab=")) { r = parse_boolean(word + 6); @@ -615,15 +550,9 @@ static int parse_proc_cmdline(void) { log_warning("Unknown kernel switch %s. Ignoring.", word); } - - free(word); } - r = 0; - -finish: - free(line); - return r; + return 0; } int main(int argc, char *argv[]) { |