int fuse_mnt_umount(const char *progname, const char *mnt, int lazy)
{
	int res;
	int status;
	sigset_t blockmask;
	sigset_t oldmask;

	if (!mtab_needs_update(mnt)) {
		res = umount2(mnt, lazy ? 2 : 0);
		if (res == -1)
			fprintf(stderr, "%s: failed to unmount %s: %s\n",
				progname, mnt, strerror(errno));
		return res;
	}

	sigemptyset(&blockmask);
	sigaddset(&blockmask, SIGCHLD);
	res = sigprocmask(SIG_BLOCK, &blockmask, &oldmask);
	if (res == -1) {
		fprintf(stderr, "%s: sigprocmask: %s\n", progname, strerror(errno));
		return -1;
	}

	res = fork();
	if (res == -1) {
		fprintf(stderr, "%s: fork: %s\n", progname, strerror(errno));
		goto out_restore;
	}
	if (res == 0) {
		sigprocmask(SIG_SETMASK, &oldmask, NULL);
		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));

	if (status != 0)
		res = -1;

 out_restore:
	sigprocmask(SIG_SETMASK, &oldmask, NULL);
	return res;
}
Example #2
0
int fuse_mnt_add_mount(const char *progname, const char *fsname,
                       const char *mnt, const char *type, const char *opts)
{
    int res;

    if (!mtab_needs_update(mnt))
        return 0;

    res = fork();
    if (res == -1) {
        fprintf(stderr, "%s: fork: %s\n", progname, strerror(errno));
        return 0;
    }
    if (res == 0) {
        char templ[] = "/tmp/fusermountXXXXXX";
        char *tmp;

        if (setuid(geteuid()))
            fprintf(stderr, "%s: failed to setuid : %s\n", progname,
                             strerror(errno));

        /* 
         * hide in a directory, where mount isn't able to resolve
         * fsname as a valid path
         */
        tmp = mkdtemp(templ);
        if (!tmp) {
            fprintf(stderr, "%s: failed to create temporary directory\n",
                    progname);
            exit(1);
        }
        if (chdir(tmp)) {
            fprintf(stderr, "%s: failed to chdir to %s: %s\n",
                    progname, tmp, strerror(errno));
            exit(1);
        }
        rmdir(tmp);
        execl("/bin/mount", "/bin/mount", "-i", "-f", "-t", type, "-o", opts,
              fsname, mnt, NULL);
        fprintf(stderr, "%s: failed to execute /bin/mount: %s\n", progname,
                strerror(errno));
        exit(1);
    }
    return 0;
}
Example #3
0
int fuse_mnt_umount(const char *progname, const char *mnt, int lazy)
{
    int res;
    int status;

    if (!mtab_needs_update(mnt)) {
        res = umount2(mnt, lazy ? 2 : 0);
        if (res == -1)
            fprintf(stderr, "%s: failed to unmount %s: %s\n", progname,
                    mnt, strerror(errno));
        return res;
    }

    res = fork();
    if (res == -1) {
        fprintf(stderr, "%s: fork: %s\n", progname, strerror(errno));
        return -1;
    }
    if (res == 0) {
        if (setuid(geteuid()))
            fprintf(stderr, "%s: failed to setuid : %s\n", progname,
                         strerror(errno));
        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;
}
Example #4
0
/* FUSE: called add_mount_legacy(); R.I.P. as of cbd3a2a8 */
int
fuse_mnt_add_mount (const char *progname, const char *fsname,
                    const char *mnt, const char *type, const char *opts)
{
        int res;
        int status;
        sigset_t blockmask;
        sigset_t oldmask;

        if (!mtab_needs_update (mnt))
                return 0;

        sigemptyset (&blockmask);
        sigaddset (&blockmask, SIGCHLD);
        res = sigprocmask (SIG_BLOCK, &blockmask, &oldmask);
        if (res == -1) {
                GFFUSE_LOGERR ("%s: sigprocmask: %s",
                               progname, strerror (errno));
                return -1;
        }

        res = fork ();
        if (res == -1) {
                GFFUSE_LOGERR ("%s: fork: %s", progname, strerror (errno));
                goto out_restore;
        }
        if (res == 0) {
                char templ[] = "/tmp/fusermountXXXXXX";
                char *tmp;

                sigprocmask (SIG_SETMASK, &oldmask, NULL);
                setuid (geteuid ());

                /*
                 * hide in a directory, where mount isn't able to resolve
                 * fsname as a valid path
                 */
                tmp = mkdtemp (templ);
                if (!tmp) {
                        GFFUSE_LOGERR ("%s: failed to create temporary directory",
                                       progname);
                        exit (1);
                }
                if (chdir (tmp)) {
                        GFFUSE_LOGERR ("%s: failed to chdir to %s: %s",
                                       progname, tmp, strerror (errno));
                        exit (1);
                }
                rmdir (tmp);
                execl (_PATH_MOUNT, _PATH_MOUNT, "-i", "-f", "-t", type,
                       "-o", opts, fsname, mnt, NULL);
                GFFUSE_LOGERR ("%s: failed to execute %s: %s",
                               progname, _PATH_MOUNT, strerror (errno));
                exit (1);
        }

        res = waitpid (res, &status, 0);
        if (res == -1)
                GFFUSE_LOGERR ("%s: waitpid: %s", progname, strerror (errno));
        res = (res != -1 && status == 0) ? 0 : -1;

 out_restore:
        sigprocmask (SIG_SETMASK, &oldmask, NULL);
        return res;
}
/* FUSE: to support some changes that were reverted since
 * then, it was split in two (fuse_mnt_umount() and
 * exec_umount()); however the actual code is same as here
 * since 0197ce40
 */
int
fuse_mnt_umount (const char *progname, const char *abs_mnt,
                 const char *rel_mnt, int lazy)
{
        int res;
        int status;
        sigset_t blockmask;
        sigset_t oldmask;

        if (!mtab_needs_update (abs_mnt)) {
                res = umount2 (rel_mnt, lazy ? 2 : 0);
                if (res == -1)
                        GFFUSE_LOGERR ("%s: failed to unmount %s: %s",
                                       progname, abs_mnt, strerror (errno));
                return res;
        }

        sigemptyset (&blockmask);
        sigaddset (&blockmask, SIGCHLD);
        res = sigprocmask (SIG_BLOCK, &blockmask, &oldmask);
        if (res == -1) {
                GFFUSE_LOGERR ("%s: sigprocmask: %s", progname,
                               strerror (errno));
                return -1;
        }

        res = fork ();
        if (res == -1) {
                GFFUSE_LOGERR ("%s: fork: %s", progname, strerror (errno));
                goto out_restore;
        }
        if (res == 0) {
                sigprocmask (SIG_SETMASK, &oldmask, NULL);
                res = setuid (geteuid ());
                if (res != 0) {
                        GFFUSE_LOGERR ("%s: setuid: %s", progname, strerror (errno));
                        exit (1);
                }
#ifdef GF_LINUX_HOST_OS
                execl ("/bin/umount", "/bin/umount", "-i", rel_mnt,
                       lazy ? "-l" : NULL, NULL);
                GFFUSE_LOGERR ("%s: failed to execute /bin/umount: %s",
                               progname, strerror (errno));
#elif __NetBSD__
                /* exitting the filesystem causes the umount */
                exit (0);
#else
                execl ("/sbin/umount", "/sbin/umount", "-f", rel_mnt, NULL);
                GFFUSE_LOGERR ("%s: failed to execute /sbin/umount: %s",
                               progname, strerror (errno));
#endif /* GF_LINUX_HOST_OS */
                exit (1);
        }
        res = waitpid (res, &status, 0);
        if (res == -1)
                GFFUSE_LOGERR ("%s: waitpid: %s", progname, strerror (errno));

        if (status != 0)
                res = -1;

 out_restore:
        sigprocmask (SIG_SETMASK, &oldmask, NULL);
        return res;
}