mirror of
https://github.com/openharmony/third_party_libfuse.git
synced 2026-07-18 18:44:26 -04:00
libfuse: call umount(8) directly...
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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
@@ -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 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user