341
365
mnt->fsck_pid = -1;
342
366
mnt->device_ready = FALSE;
369
if (! strncmp (mnt->device, "UUID=", 5)) {
370
dequote (mnt->device + 5);
371
} else if (! strncmp (mnt->device, "LABEL=", 6)) {
372
dequote (mnt->device + 6);
374
dequote (mnt->device);
344
378
mnt->type = type ? NIH_MUST (nih_strdup (mounts, type)) : NULL;
345
379
mnt->virtual = FALSE;
346
380
mnt->opts = opts ? NIH_MUST (nih_strdup (mounts, opts)) : NULL;
1408
1456
&& strcmp (mnt->type, "ntfs")
1409
1457
&& strcmp (mnt->type, "ntfs-3g")) {
1410
1458
NIH_MUST (nih_str_array_add (&args, NULL, &args_len, "-n"));
1459
} else if (has_showthrough (mnt)) {
1460
NIH_MUST (nih_str_array_add (&args, NULL, &args_len, "-n"));
1412
1462
NIH_MUST (nih_str_array_add (&args, NULL, &args_len, "-a"));
1413
1463
NIH_MUST (nih_str_array_add (&args, NULL, &args_len, "-t"));
2028
int dev_hook_walk (const char * fpath,
2029
const struct stat *sb,
2031
struct FTW * ftwbuf)
2033
Mount * mnt = nftw_hook_args.mnt;
2034
char dest[PATH_MAX];
2036
strcpy (dest, mnt->mountpoint);
2037
strcat (dest, fpath + 17);
2039
if (S_ISDIR (sb->st_mode)) {
2040
if ((mkdir (dest, sb->st_mode & ~S_IFMT) < 0)
2041
&& (errno != EEXIST))
2042
nih_warn ("%s: %s", dest, strerror (errno));
2043
} else if (S_ISLNK (sb->st_mode)) {
2044
char target[PATH_MAX];
2047
len = readlink (fpath, target, sizeof target);
2050
if ((symlink (target, dest) < 0)
2051
&& (errno != EEXIST))
2052
nih_warn ("%s: %s", dest, strerror (errno));
2054
if ((mknod (dest, sb->st_mode, sb->st_rdev) < 0)
2055
&& (errno != EEXIST))
2056
nih_warn ("%s: %s", dest, strerror (errno));
2059
return FTW_CONTINUE;
1976
2064
dev_hook (Mount *mnt)
1980
2068
nih_debug ("populating %s", mnt->mountpoint);
1982
int dev_hook_walk (const char * fpath,
1983
const struct stat *sb,
1985
struct FTW * ftwbuf)
1987
char dest[PATH_MAX];
1989
strcpy (dest, mnt->mountpoint);
1990
strcat (dest, fpath + 17);
1992
if (S_ISDIR (sb->st_mode)) {
1993
if ((mkdir (dest, sb->st_mode & ~S_IFMT) < 0)
1994
&& (errno != EEXIST))
1995
nih_warn ("%s: %s", dest, strerror (errno));
1996
} else if (S_ISLNK (sb->st_mode)) {
1997
char target[PATH_MAX];
2000
len = readlink (fpath, target, sizeof target);
2003
if ((symlink (target, dest) < 0)
2004
&& (errno != EEXIST))
2005
nih_warn ("%s: %s", dest, strerror (errno));
2007
if ((mknod (dest, sb->st_mode, sb->st_rdev) < 0)
2008
&& (errno != EEXIST))
2009
nih_warn ("%s: %s", dest, strerror (errno));
2012
return FTW_CONTINUE;
2070
nftw_hook_args.mnt = mnt;
2016
2071
nftw ("/lib/udev/devices", dev_hook_walk, 1024,
2017
2072
FTW_ACTIONRETVAL | FTW_PHYS | FTW_MOUNT);
2073
nftw_hook_args.mnt = NULL;
2078
int tmp_hook_walk (const char * fpath,
2079
const struct stat *sb,
2081
struct FTW * ftwbuf)
2083
Mount * mnt = nftw_hook_args.mnt;
2084
const char *name = fpath + ftwbuf->base;
2086
if (! ftwbuf->level)
2087
return FTW_CONTINUE;
2089
if (S_ISDIR (sb->st_mode)) {
2090
if (strcmp (name, "lost+found")
2091
&& (nftw_hook_args.purge
2092
|| ((sb->st_mtime < nftw_hook_args.barrier
2093
&& (sb->st_ctime < nftw_hook_args.barrier)))))
2095
if (rmdir (fpath) < 0)
2096
nih_warn ("%s: %s", fpath, strerror (errno));
2100
if (strcmp (name, "quota.user")
2101
&& strcmp (name, "aquota.user")
2102
&& strcmp (name, "quote.group")
2103
&& strcmp (name, "aquota.group")
2104
&& strcmp (name, ".journal")
2105
&& fnmatch ("...security*", name, FNM_PATHNAME)
2106
&& (nftw_hook_args.purge
2107
|| ((sb->st_mtime < nftw_hook_args.barrier)
2108
&& (sb->st_ctime < nftw_hook_args.barrier)
2109
&& (sb->st_atime < nftw_hook_args.barrier))
2110
|| ((ftwbuf->level == 1)
2111
&& (! fnmatch (".X*-lock", fpath + ftwbuf->base, FNM_PATHNAME)))))
2113
if (unlink (fpath) < 0)
2114
nih_warn ("%s: %s", fpath, strerror (errno));
2119
return FTW_CONTINUE;
2023
2123
tmp_hook (Mount *mnt)
2025
2125
struct stat statbuf;
2029
2127
nih_assert (mnt != NULL);
2040
2138
nih_debug ("cleaning up %s", mnt->mountpoint);
2042
2140
if (tmptime > 0) {
2043
barrier = time (NULL) - (tmptime * 3600);
2141
nftw_hook_args.purge = FALSE;
2142
nftw_hook_args.barrier = time (NULL) - (tmptime * 3600);
2049
int tmp_hook_walk (const char * fpath,
2050
const struct stat *sb,
2052
struct FTW * ftwbuf)
2054
const char *name = fpath + ftwbuf->base;
2056
if (! ftwbuf->level)
2057
return FTW_CONTINUE;
2059
if (S_ISDIR (sb->st_mode)) {
2060
if (strcmp (name, "lost+found")
2062
|| ((sb->st_mtime < barrier
2063
&& (sb->st_ctime < barrier)))))
2065
if (rmdir (fpath) < 0)
2066
nih_warn ("%s: %s", fpath, strerror (errno));
2070
if (strcmp (name, "quota.user")
2071
&& strcmp (name, "aquota.user")
2072
&& strcmp (name, "quote.group")
2073
&& strcmp (name, "aquota.group")
2074
&& strcmp (name, ".journal")
2075
&& fnmatch ("...security*", name, FNM_PATHNAME)
2077
|| ((sb->st_mtime < barrier)
2078
&& (sb->st_ctime < barrier)
2079
&& (sb->st_atime < barrier))
2080
|| ((ftwbuf->level == 1)
2081
&& (! fnmatch (".X*-lock", fpath + ftwbuf->base, FNM_PATHNAME)))))
2083
if (unlink (fpath) < 0)
2084
nih_warn ("%s: %s", fpath, strerror (errno));
2089
return FTW_CONTINUE;
2144
nftw_hook_args.purge = TRUE;
2145
nftw_hook_args.barrier = 0;
2148
nftw_hook_args.mnt = mnt;
2092
2149
nftw (mnt->mountpoint, tmp_hook_walk, 1024,
2093
2150
FTW_ACTIONRETVAL | FTW_DEPTH | FTW_PHYS | FTW_MOUNT);
2151
nftw_hook_args.mnt = NULL;
2156
int var_run_hook_walk (const char * fpath,
2157
const struct stat *sb,
2159
struct FTW * ftwbuf)
2161
Mount * mnt = nftw_hook_args.mnt;
2162
char dest[PATH_MAX];
2164
strcpy (dest, mnt->mountpoint);
2165
strcat (dest, fpath + 22);
2167
if (S_ISDIR (sb->st_mode)) {
2168
if ((mkdir (dest, sb->st_mode & ~S_IFMT) < 0)
2169
&& (errno != EEXIST))
2170
nih_warn ("%s: %s", dest, strerror (errno));
2171
} else if (S_ISLNK (sb->st_mode)) {
2172
char target[PATH_MAX];
2175
len = readlink (fpath, target, sizeof target);
2178
if ((symlink (target, dest) < 0)
2179
&& (errno != EEXIST))
2180
nih_warn ("%s: %s", dest, strerror (errno));
2187
in_fd = open (fpath, O_RDONLY);
2189
nih_warn ("%s: %s", fpath, strerror (errno));
2190
return FTW_CONTINUE;
2193
out_fd = open (dest, O_WRONLY | O_CREAT | O_TRUNC,
2196
nih_warn ("%s: %s", dest, strerror (errno));
2198
return FTW_CONTINUE;
2201
while ((len = read (in_fd, buf, sizeof buf)) > 0)
2202
write (out_fd, buf, len);
2205
if (close (out_fd) < 0)
2206
nih_warn ("%s: %s", dest, strerror (errno));
2209
return FTW_CONTINUE;
2099
2214
var_run_hook (Mount *mnt)
2164
2279
nih_debug ("populating %s from initramfs", mnt->mountpoint);
2166
int var_run_hook_walk (const char * fpath,
2167
const struct stat *sb,
2169
struct FTW * ftwbuf)
2171
char dest[PATH_MAX];
2173
strcpy (dest, mnt->mountpoint);
2174
strcat (dest, fpath + 22);
2176
if (S_ISDIR (sb->st_mode)) {
2177
if ((mkdir (dest, sb->st_mode & ~S_IFMT) < 0)
2178
&& (errno != EEXIST))
2179
nih_warn ("%s: %s", dest, strerror (errno));
2180
} else if (S_ISLNK (sb->st_mode)) {
2181
char target[PATH_MAX];
2184
len = readlink (fpath, target, sizeof target);
2187
if ((symlink (target, dest) < 0)
2188
&& (errno != EEXIST))
2189
nih_warn ("%s: %s", dest, strerror (errno));
2196
in_fd = open (fpath, O_RDONLY);
2198
nih_warn ("%s: %s", fpath, strerror (errno));
2199
return FTW_CONTINUE;
2202
out_fd = open (dest, O_WRONLY | O_CREAT | O_TRUNC,
2205
nih_warn ("%s: %s", dest, strerror (errno));
2207
return FTW_CONTINUE;
2210
while ((len = read (in_fd, buf, sizeof buf)) > 0)
2211
write (out_fd, buf, len);
2214
if (close (out_fd) < 0)
2215
nih_warn ("%s: %s", dest, strerror (errno));
2218
return FTW_CONTINUE;
2281
nftw_hook_args.mnt = mnt;
2222
2282
nftw ("/dev/.initramfs/varrun", var_run_hook_walk, 1024,
2223
2283
FTW_ACTIONRETVAL | FTW_PHYS | FTW_MOUNT);
2284
nftw_hook_args.mnt = NULL;