libfuse: call umount(8) directly...

This commit is contained in:
Miklos Szeredi
2007-04-27 18:08:15 +00:00
parent ccf0be03c3
commit ccd1fa686c
5 changed files with 42 additions and 31 deletions
+5
View File
@@ -1,3 +1,8 @@
2007-04-27 Miklos Szeredi <miklos@szeredi.hu>
* libfuse: call umount(8) directly instead of fusermount if
possible
2007-04-26 Miklos Szeredi <miklos@szeredi.hu>
* In multithreaded loop, use a semaphore instead of SIGHUP to wake
+5
View File
@@ -276,6 +276,11 @@ void fuse_kern_unmount(const char *mountpoint, int fd)
return;
}
if (geteuid() == 0) {
fuse_mnt_umount("fuse", mountpoint, 1);
return;
}
res = umount2(mountpoint, 2);
if (res == 0)
return;
+29
View File
@@ -72,6 +72,35 @@ int fuse_mnt_add_mount(const char *progname, const char *fsname,
return 0;
}
int fuse_mnt_umount(const char *progname, const char *mnt, int lazy)
{
int res;
int status;
res = fork();
if (res == -1) {
fprintf(stderr, "%s: fork: %s\n", progname, strerror(errno));
return -1;
}
if (res == 0) {
setuid(geteuid());
execl("/bin/umount", "/bin/umount", "-i", mnt, lazy ? "-l" : NULL,
NULL);
fprintf(stderr, "%s: failed to execute /bin/umount: %s\n", progname,
strerror(errno));
exit(1);
}
res = waitpid(res, &status, 0);
if (res == -1) {
fprintf(stderr, "%s: waitpid: %s\n", progname, strerror(errno));
return -1;
}
if (status != 0)
return -1;
return 0;
}
char *fuse_mnt_resolve_path(const char *progname, const char *orig)
{
char buf[PATH_MAX];
+1
View File
@@ -10,6 +10,7 @@
int fuse_mnt_add_mount(const char *progname, const char *fsname,
const char *mnt, const char *type, const char *opts);
int fuse_mnt_umount(const char *progname, const char *mnt, int lazy);
char *fuse_mnt_resolve_path(const char *progname, const char *orig);
int fuse_mnt_check_empty(const char *progname, const char *mnt,
mode_t rootmode, off_t rootsize);
+2 -31
View File
@@ -73,35 +73,6 @@ static void restore_privs(void)
}
}
static int do_unmount(const char *mnt, int quiet, int lazy)
{
int res;
int status;
(void) quiet;
res = fork();
if (res == -1) {
perror("fork");
return -1;
}
if (res == 0) {
setuid(geteuid());
execl("/bin/umount", "/bin/umount", "-i", mnt, lazy ? "-l" : NULL,
NULL);
perror("execl /bin/umount");
exit(1);
}
res = waitpid(res, &status, 0);
if (res == -1) {
perror("waitpid");
return -1;
}
if (status != 0)
return -1;
return 0;
}
#ifndef IGNORE_MTAB
static int add_mount(const char *fsname, const char *mnt, const char *type,
const char *opts)
@@ -164,7 +135,7 @@ static int unmount_fuse(const char *mnt, int quiet, int lazy)
}
}
return do_unmount(mnt, quiet, lazy);
return fuse_mnt_umount(progname, mnt, lazy);
}
static int count_fuse_fs(void)
@@ -205,7 +176,7 @@ static int add_mount(const char *fsname, const char *mnt, const char *type,
static int unmount_fuse(const char *mnt, int quiet, int lazy)
{
return do_unmount(mnt, quiet, lazy);
return fuse_mnt_umount(progname, mnt, lazy);
}
#endif /* IGNORE_MTAB */