From ccd1fa686cc1fc2faf067c8ceb10b90950175cc9 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Fri, 27 Apr 2007 18:08:15 +0000 Subject: [PATCH] libfuse: call umount(8) directly... --- ChangeLog | 5 +++++ lib/mount.c | 5 +++++ lib/mount_util.c | 29 +++++++++++++++++++++++++++++ lib/mount_util.h | 1 + util/fusermount.c | 33 ++------------------------------- 5 files changed, 42 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4f27cec..8ad2462 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-04-27 Miklos Szeredi + + * libfuse: call umount(8) directly instead of fusermount if + possible + 2007-04-26 Miklos Szeredi * In multithreaded loop, use a semaphore instead of SIGHUP to wake diff --git a/lib/mount.c b/lib/mount.c index 0587bac..24bcf8c 100644 --- a/lib/mount.c +++ b/lib/mount.c @@ -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; diff --git a/lib/mount_util.c b/lib/mount_util.c index 8aafa33..b82ab3b 100644 --- a/lib/mount_util.c +++ b/lib/mount_util.c @@ -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]; diff --git a/lib/mount_util.h b/lib/mount_util.h index c64423b..106a6f8 100644 --- a/lib/mount_util.h +++ b/lib/mount_util.h @@ -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); diff --git a/util/fusermount.c b/util/fusermount.c index 16a9f9a..8f69599 100644 --- a/util/fusermount.c +++ b/util/fusermount.c @@ -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 */ -- 2.30.2