static int unmount_fuse_locked(const char *mnt, int quiet, int lazy)
{
	char *copy;
	const char *last;
	int res;

	if (getuid() != 0) {
		res = may_unmount(mnt, quiet);
		if (res == -1)
			return -1;
	}

	copy = strdup(mnt);
	if (copy == NULL) {
		fprintf(stderr, "%s: failed to allocate memory\n", progname);
		return -1;
	}

	res = chdir_to_parent(copy, &last);
	if (res == -1)
		goto out;

	res = check_is_mount(last, mnt);
	if (res == -1)
		goto out;

	res = fuse_mnt_umount(progname, mnt, last, lazy);

out:
	free(copy);

	return res;
}
Beispiel #2
0
static int unmount_fuse(const char *mnt, int quiet, int lazy)
{
    if (getuid() != 0) {
        struct mntent *entp;
        FILE *fp;
        const char *user = NULL;
        char uidstr[32];
        unsigned uidlen = 0;
        int found;
        const char *mtab = _PATH_MOUNTED;

        user = get_user_name();
        if (user == NULL)
            return -1;

        fp = setmntent(mtab, "r");
        if (fp == NULL) {
            fprintf(stderr, "%s: failed to open %s: %s\n", progname, mtab,
                    strerror(errno));
            return -1;
        }

        uidlen = sprintf(uidstr, "%u", getuid());

        found = 0;
        while ((entp = getmntent(fp)) != NULL) {
            if (!found && strcmp(entp->mnt_dir, mnt) == 0 &&
                (strcmp(entp->mnt_type, "fuse") == 0 ||
                 strcmp(entp->mnt_type, "fuseblk") == 0 ||
                 strncmp(entp->mnt_type, "fuse.", 5) == 0 ||
                 strncmp(entp->mnt_type, "fuseblk.", 8) == 0)) {
                char *p = strstr(entp->mnt_opts, "user="******"user_id=")) &&
                         (p == entp->mnt_opts || *(p-1) == ',') &&
                         strncmp(p + 8, uidstr, uidlen) == 0 &&
                         (*(p+8+uidlen) == ',' || *(p+8+uidlen) == '\0')) {
                    found = 1;
                    break;
                }
            }
        }
        endmntent(fp);

        if (!found) {
            if (!quiet)
                fprintf(stderr, "%s: entry for %s not found in %s\n", progname,
                        mnt, mtab);
            return -1;
        }
    }

    return fuse_mnt_umount(progname, mnt, lazy);
}
Beispiel #3
0
void fuse_kern_unmount(const char *mountpoint, int fd)
{
	int res;
	int pid;

	if (!mountpoint)
		return;

	if (fd != -1) {
		struct pollfd pfd;

		pfd.fd = fd;
		pfd.events = 0;
		res = poll(&pfd, 1, 0);

		/* Need to close file descriptor, otherwise synchronous umount
		   would recurse into filesystem, and deadlock.

		   Caller expects fuse_kern_unmount to close the fd, so close it
		   anyway. */
		close(fd);

		/* If file poll returns POLLERR on the device file descriptor,
		   then the filesystem is already unmounted */
		if (res == 1 && (pfd.revents & POLLERR))
			return;
	}

	if (geteuid() == 0) {
		fuse_mnt_umount("fuse", mountpoint, mountpoint,  1);
		return;
	}

	res = umount2(mountpoint, 2);
	if (res == 0)
		return;

	pid = fork();
	if(pid == -1)
		return;

	if(pid == 0) {
		const char *argv[] = { FUSERMOUNT_PROG, "-u", "-q", "-z",
				       "--", mountpoint, NULL };

		exec_fusermount(argv);
		_exit(1);
	}
	waitpid(pid, NULL, 0);
}
Beispiel #4
0
void fuse_kern_unmount(const char *mountpoint, int fd)
{
    int res;
    int pid;

    if (!mountpoint)
        return;

    if (fd != -1) {
        struct pollfd pfd;

        pfd.fd = fd;
        pfd.events = 0;
        res = poll(&pfd, 1, 0);
        /* If file poll returns POLLERR on the device file descriptor,
           then the filesystem is already unmounted */
        if (res == 1 && (pfd.revents & POLLERR))
            return;
    }

    if (geteuid() == 0) {
        fuse_mnt_umount("fuse", mountpoint, 1);
        return;
    }

    res = umount2(mountpoint, 2);
    if (res == 0)
        return;

    pid = fork();
    if(pid == -1)
        return;

    if(pid == 0) {
        const char *argv[] =
            { FUSERMOUNT_PROG, "-u", "-q", "-z", "--", mountpoint, NULL };

        exec_fusermount(argv);
        _exit(1);
    }
    waitpid(pid, NULL, 0);
}
static int unmount_fuse(const char *mnt, int quiet, int lazy)
{
	return fuse_mnt_umount(progname, mnt, mnt, lazy);
}