12 #include "mount_util.h" 23 #if !defined( __NetBSD__) && !defined(__FreeBSD__) 30 #include <sys/mount.h> 31 #include <sys/param.h> 33 #if defined(__NetBSD__) || defined(__FreeBSD__) 34 #define umount2(mnt, flags) unmount(mnt, (flags == 2) ? MNT_FORCE : 0) 38 #define mtab_needs_update(mnt) 0 40 static int mtab_needs_update(
const char *mnt)
46 if (strncmp(mnt, _PATH_MOUNTED, strlen(mnt)) == 0 &&
47 _PATH_MOUNTED[strlen(mnt)] ==
'/')
57 res = lstat(_PATH_MOUNTED, &stbuf);
65 if (S_ISLNK(stbuf.st_mode))
72 res = access(_PATH_MOUNTED, W_OK);
73 err = (res == -1) ? errno : 0;
85 static int add_mount(
const char *progname,
const char *fsname,
86 const char *mnt,
const char *type,
const char *opts)
93 sigemptyset(&blockmask);
94 sigaddset(&blockmask, SIGCHLD);
95 res = sigprocmask(SIG_BLOCK, &blockmask, &oldmask);
97 fprintf(stderr,
"%s: sigprocmask: %s\n", progname, strerror(errno));
103 fprintf(stderr,
"%s: fork: %s\n", progname, strerror(errno));
109 sigprocmask(SIG_SETMASK, &oldmask, NULL);
111 if(setuid(geteuid()) == -1) {
112 fprintf(stderr,
"%s: setuid: %s\n", progname, strerror(errno));
117 execle(
"/bin/mount",
"/bin/mount",
"--no-canonicalize",
"-i",
118 "-f",
"-t", type,
"-o", opts, fsname, mnt, NULL, &env);
119 fprintf(stderr,
"%s: failed to execute /bin/mount: %s\n",
120 progname, strerror(errno));
123 res = waitpid(res, &status, 0);
125 fprintf(stderr,
"%s: waitpid: %s\n", progname, strerror(errno));
131 sigprocmask(SIG_SETMASK, &oldmask, NULL);
136 int fuse_mnt_add_mount(
const char *progname,
const char *fsname,
137 const char *mnt,
const char *type,
const char *opts)
139 if (!mtab_needs_update(mnt))
142 return add_mount(progname, fsname, mnt, type, opts);
145 static int exec_umount(
const char *progname,
const char *rel_mnt,
int lazy)
152 sigemptyset(&blockmask);
153 sigaddset(&blockmask, SIGCHLD);
154 res = sigprocmask(SIG_BLOCK, &blockmask, &oldmask);
156 fprintf(stderr,
"%s: sigprocmask: %s\n", progname, strerror(errno));
162 fprintf(stderr,
"%s: fork: %s\n", progname, strerror(errno));
168 sigprocmask(SIG_SETMASK, &oldmask, NULL);
170 if(setuid(geteuid()) == -1) {
171 fprintf(stderr,
"%s: setuid: %s\n", progname, strerror(errno));
177 execle(
"/bin/umount",
"/bin/umount",
"-i", rel_mnt,
180 execle(
"/bin/umount",
"/bin/umount",
"-i", rel_mnt,
183 fprintf(stderr,
"%s: failed to execute /bin/umount: %s\n",
184 progname, strerror(errno));
187 res = waitpid(res, &status, 0);
189 fprintf(stderr,
"%s: waitpid: %s\n", progname, strerror(errno));
196 sigprocmask(SIG_SETMASK, &oldmask, NULL);
201 int fuse_mnt_umount(
const char *progname,
const char *abs_mnt,
202 const char *rel_mnt,
int lazy)
206 if (!mtab_needs_update(abs_mnt)) {
207 res = umount2(rel_mnt, lazy ? 2 : 0);
209 fprintf(stderr,
"%s: failed to unmount %s: %s\n",
210 progname, abs_mnt, strerror(errno));
214 return exec_umount(progname, rel_mnt, lazy);
217 static int remove_mount(
const char *progname,
const char *mnt)
224 sigemptyset(&blockmask);
225 sigaddset(&blockmask, SIGCHLD);
226 res = sigprocmask(SIG_BLOCK, &blockmask, &oldmask);
228 fprintf(stderr,
"%s: sigprocmask: %s\n", progname, strerror(errno));
234 fprintf(stderr,
"%s: fork: %s\n", progname, strerror(errno));
240 sigprocmask(SIG_SETMASK, &oldmask, NULL);
242 if(setuid(geteuid()) == -1) {
243 fprintf(stderr,
"%s: setuid: %s\n", progname, strerror(errno));
248 execle(
"/bin/umount",
"/bin/umount",
"--no-canonicalize",
"-i",
249 "--fake", mnt, NULL, &env);
250 fprintf(stderr,
"%s: failed to execute /bin/umount: %s\n",
251 progname, strerror(errno));
254 res = waitpid(res, &status, 0);
256 fprintf(stderr,
"%s: waitpid: %s\n", progname, strerror(errno));
262 sigprocmask(SIG_SETMASK, &oldmask, NULL);
266 int fuse_mnt_remove_mount(
const char *progname,
const char *mnt)
268 if (!mtab_needs_update(mnt))
271 return remove_mount(progname, mnt);
274 char *fuse_mnt_resolve_path(
const char *progname,
const char *orig)
281 const char *toresolv;
284 fprintf(stderr,
"%s: invalid mountpoint '%s'\n", progname,
291 fprintf(stderr,
"%s: failed to allocate memory\n", progname);
297 for (end = copy + strlen(copy) - 1; end > copy && *end ==
'/'; end --);
301 tmp = strrchr(copy,
'/');
310 if (strcmp(lastcomp,
".") == 0 || strcmp(lastcomp,
"..") == 0) {
317 if (realpath(toresolv, buf) == NULL) {
318 fprintf(stderr,
"%s: bad mount point %s: %s\n", progname, orig,
323 if (lastcomp == NULL)
326 dst = (
char *) malloc(strlen(buf) + 1 + strlen(lastcomp) + 1);
328 unsigned buflen = strlen(buf);
329 if (buflen && buf[buflen-1] ==
'/')
330 sprintf(dst,
"%s%s", buf, lastcomp);
332 sprintf(dst,
"%s/%s", buf, lastcomp);
337 fprintf(stderr,
"%s: failed to allocate memory\n", progname);
341 int fuse_mnt_check_fuseblk(
void)
344 FILE *f = fopen(
"/proc/filesystems",
"r");
348 while (fgets(buf,
sizeof(buf), f))
349 if (strstr(buf,
"fuseblk\n")) {
358 int fuse_mnt_parse_fuse_fd(
const char *mountpoint)
363 if (sscanf(mountpoint,
"/dev/fd/%u%n", &fd, &len) == 1 &&
364 len == strlen(mountpoint)) {