git.annexia.org
/
libguestfs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
umount-all: Use /proc/mounts instead of output of 'mount' command.
[libguestfs.git]
/
daemon
/
mount.c
diff --git
a/daemon/mount.c
b/daemon/mount.c
index
c584f81
..
fd0f6b2
100644
(file)
--- a/
daemon/mount.c
+++ b/
daemon/mount.c
@@
-40,9
+40,12
@@
is_root_mounted (void)
FILE *fp;
struct mntent *m;
FILE *fp;
struct mntent *m;
- fp = setmntent ("/etc/mtab", "r");
+ /* NB: Eventually we should aim to parse /proc/self/mountinfo, but
+ * that requires custom parsing code.
+ */
+ fp = setmntent ("/proc/mounts", "r");
if (fp == NULL) {
if (fp == NULL) {
- perror ("/
etc/mtab
");
+ perror ("/
proc/mounts
");
exit (EXIT_FAILURE);
}
exit (EXIT_FAILURE);
}
@@
-80,7
+83,7
@@
do_mount_vfs (const char *options, const char *vfstype,
char *error;
struct stat statbuf;
char *error;
struct stat statbuf;
- ABS_PATH (mountpoint,
0
, return -1);
+ ABS_PATH (mountpoint, , return -1);
mp = sysroot_path (mountpoint);
if (!mp) {
mp = sysroot_path (mountpoint);
if (!mp) {
@@
-155,7
+158,7
@@
do_umount (const char *pathordevice)
}
if (is_dev)
}
if (is_dev)
- RESOLVE_DEVICE (buf,
0
, { free (buf); return -1; });
+ RESOLVE_DEVICE (buf, , { free (buf); return -1; });
r = command (NULL, &err, "umount", buf, NULL);
free (buf);
r = command (NULL, &err, "umount", buf, NULL);
free (buf);
@@
-295,50
+298,40
@@
compare_longest_first (const void *vp1, const void *vp2)
int
do_umount_all (void)
{
int
do_umount_all (void)
{
-
char *out, *err
;
-
int i, r
;
+
FILE *fp
;
+
struct mntent *m
;
char **mounts = NULL;
int size = 0, alloc = 0;
char **mounts = NULL;
int size = 0, alloc = 0;
- char *p, *p2, *p3, *pend;
- char matching[5 + sysroot_len];
-
- r = command (&out, &err, "mount", NULL);
- if (r == -1) {
- reply_with_error ("mount: %s", err);
- free (out);
- free (err);
- return -1;
- }
-
- free (err);
+ char *err;
+ int i, r;
- /*
Lines have the format:
- *
/dev/foo on /mountpoint type ..
.
+ /*
NB: Eventually we should aim to parse /proc/self/mountinfo, but
+ *
that requires custom parsing code
.
*/
*/
- snprintf (matching, 5 + sysroot_len, " on %s", sysroot);
+ fp = setmntent ("/proc/mounts", "r");
+ if (fp == NULL) {
+ perror ("/proc/mounts");
+ exit (EXIT_FAILURE);
+ }
- p = out;
- while (p) {
- pend = strchr (p, '\n');
- if (pend) {
- *pend = '\0';
- pend++;
+ while ((m = getmntent (fp)) != NULL) {
+ /* Allow a mount directory like "/sysroot". */
+ if (sysroot_len > 0 && STREQ (m->mnt_dir, sysroot)) {
+ if (add_string (&mounts, &size, &alloc, m->mnt_dir) == -1) {
+ endmntent (fp);
+ return -1;
+ }
}
}
-
- p2 = strstr (p, matching);
- if (p2 != NULL) {
- p2 += 4;
- p3 = p2 + strcspn (p2, " ");
- *p3 = '\0';
- if (add_string (&mounts, &size, &alloc, p2) == -1) {
- free (out);
+ /* Or allow a mount directory like "/sysroot/...". */
+ if (STRPREFIX (m->mnt_dir, sysroot) && m->mnt_dir[sysroot_len] == '/') {
+ if (add_string (&mounts, &size, &alloc, m->mnt_dir) == -1) {
+ endmntent (fp);
return -1;
}
}
return -1;
}
}
-
- p = pend;
}
}
- free (out);
+
+ endmntent (fp);
qsort (mounts, size, sizeof (char *), compare_longest_first);
qsort (mounts, size, sizeof (char *), compare_longest_first);
@@
-406,7
+399,7
@@
do_mkmountpoint (const char *path)
int r;
/* NEED_ROOT (return -1); - we don't want this test for this call. */
int r;
/* NEED_ROOT (return -1); - we don't want this test for this call. */
- ABS_PATH (path,
0
, return -1);
+ ABS_PATH (path, , return -1);
CHROOT_IN;
r = mkdir (path, 0777);
CHROOT_IN;
r = mkdir (path, 0777);
@@
-426,7
+419,7
@@
do_rmmountpoint (const char *path)
int r;
/* NEED_ROOT (return -1); - we don't want this test for this call. */
int r;
/* NEED_ROOT (return -1); - we don't want this test for this call. */
- ABS_PATH (path,
0
, return -1);
+ ABS_PATH (path, , return -1);
CHROOT_IN;
r = rmdir (path);
CHROOT_IN;
r = rmdir (path);