+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
return;
}
+ if (geteuid() == 0) {
+ fuse_mnt_umount("fuse", mountpoint, 1);
+ return;
+ }
+
res = umount2(mountpoint, 2);
if (res == 0)
return;
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];
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);
}
}
-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)
}
}
- return do_unmount(mnt, quiet, lazy);
+ return fuse_mnt_umount(progname, mnt, lazy);
}
static int count_fuse_fs(void)
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 */