static const char *arg_dest = "/tmp";
static bool arg_enabled = true;
-static int device_name(const char *path, char **unit) {
- char *p;
-
- assert(path);
-
- if (!is_device_path(path))
- return 0;
-
- p = unit_name_from_path(path, ".device");
- if (!p)
- return log_oom();
-
- *unit = p;
- return 1;
-}
-
static int mount_find_pri(struct mntent *me, int *ret) {
char *end, *pri;
unsigned long r;
}
static int add_swap(const char *what, struct mntent *me) {
- _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL;
+ _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL;
_cleanup_fclose_ FILE *f = NULL;
- bool noauto, nofail;
+ bool noauto;
int r, pri = -1;
assert(what);
}
noauto = !!hasmntopt(me, "noauto");
- nofail = !!hasmntopt(me, "nofail");
name = unit_name_from_path(what, ".swap");
if (!name)
return -errno;
}
- fputs("# Automatically generated by systemd-fstab-generator\n\n"
- "[Unit]\n"
- "SourcePath=/etc/fstab\n", f);
-
- if (!noauto && !nofail)
- fputs("Before=" SPECIAL_SWAP_TARGET "\n", f);
-
fprintf(f,
- "\n"
+ "# Automatically generated by systemd-fstab-generator\n\n"
+ "[Unit]\n"
+ "SourcePath=/etc/fstab\n\n"
"[Swap]\n"
"What=%s\n",
what);
log_error("Failed to create symlink %s: %m", lnk);
return -errno;
}
-
- r = device_name(what, &device);
- if (r < 0)
- return r;
-
- if (r > 0) {
- free(lnk);
- lnk = strjoin(arg_dest, "/", device, ".wants/", name, NULL);
- if (!lnk)
- return log_oom();
-
- mkdir_parents_label(lnk, 0755);
- if (symlink(unit, lnk) < 0) {
- log_error("Failed to create symlink %s: %m", lnk);
- return -errno;
- }
- }
}
return 0;
const char *post,
const char *source) {
_cleanup_free_ char
- *name = NULL, *unit = NULL, *lnk = NULL, *device = NULL,
+ *name = NULL, *unit = NULL, *lnk = NULL,
*automount_name = NULL, *automount_unit = NULL;
_cleanup_fclose_ FILE *f = NULL;
"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"))
if (!noauto) {
if (post) {
+ free(lnk);
lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL);
if (!lnk)
return log_oom();
}
static int parse_fstab(const char *prefix, bool initrd) {
- _cleanup_free_ char *fstab_path = NULL;
- FILE *f;
+ char *fstab_path;
+ _cleanup_endmntent_ FILE *f;
int r = 0;
struct mntent *me;
- fstab_path = strjoin(strempty(prefix), "/etc/fstab", NULL);
- if (!fstab_path)
- return log_oom();
-
+ fstab_path = strappenda(strempty(prefix), "/etc/fstab");
f = setmntent(fstab_path, "r");
if (!f) {
if (errno == ENOENT)
what = fstab_node_to_udev_node(me->mnt_fsname);
where = strjoin(strempty(prefix), me->mnt_dir, NULL);
- if (!what || !where) {
- r = log_oom();
- goto finish;
- }
+ if (!what || !where)
+ return log_oom();
if (is_path(where))
path_kill_slashes(where);
r = k;
}
-finish:
- endmntent(f);
return r;
}
}
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;