summaryrefslogtreecommitdiff
path: root/src/fstab-generator/fstab-generator.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fstab-generator/fstab-generator.c')
-rw-r--r--src/fstab-generator/fstab-generator.c175
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[]) {