1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
--- lib/mount.c.orig Sun Oct 2 11:16:12 2005
+++ lib/mount.c Sun Oct 9 22:05:09 2005
@@ -21,7 +21,7 @@
#define FUSERMOUNT_PROG "fusermount"
#define FUSE_COMMFD_ENV "_FUSE_COMMFD"
-
+#ifndef __FreeBSD__
/* return value:
* >= 0 => fd
* -1 => error
@@ -66,9 +66,11 @@
}
return *(int*)CMSG_DATA(cmsg);
}
+#endif
void fuse_unmount(const char *mountpoint)
{
+#ifndef __FreeBSD__
const char *mountprog = FUSERMOUNT_PROG;
char umount_cmd[1024];
@@ -77,10 +79,53 @@
umount_cmd[sizeof(umount_cmd) - 1] = '\0';
system(umount_cmd);
+#else
+ /*
+ * This is how we could do unmount-by-the-daemon in FreeBSD.
+ * Alas, by the time we get here, fuse_kern_chan_destroy
+ * has closed up the device, so this will fail.
+ * Maybe fuse_kern_chan_destroy should be castrated for FreeBSD?
+ * Well, let's stay on the safe side for now.
+ */
+#if 0
+ /*
+ * We keep on not wanting to rely on the mountpoint argument
+ * so let's just look up our device as in mount_fusefs(8)...
+ * we don't trust the environment here though.
+ */
+ char dev[128];
+ char *ssc, *umount_cmd;
+ FILE *sf;
+ int rv;
+ char *seekscript =
+ "/usr/bin/fstat /dev/fuse* |\n"
+ "/usr/bin/awk '{if ($3 == %d) print $10}' |\n"
+ "/usr/bin/sort |\n"
+ "/usr/bin/uniq |\n"
+ "/usr/bin/awk '{ i+=1; if(i > 1){ exit (1); }; printf; }; END{if (i==0) exit (1)}'";
+
+ asprintf(&ssc, seekscript, getpid());
+
+ errno = 0;
+ sf = popen(ssc, "r");
+ if (! sf)
+ return;
+
+ fgets(dev, sizeof(dev), sf);
+ rv = pclose(sf);
+ if (rv)
+ return;
+
+ asprintf(&umount_cmd, "/sbin/umount %s", dev);
+ system(umount_cmd);
+#endif
+ (void)mountpoint;
+#endif
}
int fuse_mount(const char *mountpoint, const char *opts)
{
+#ifndef __FreeBSD__
const char *mountprog = FUSERMOUNT_PROG;
int fds[2], pid;
int res;
@@ -133,6 +178,40 @@
waitpid(pid, NULL, 0); /* bury zombie */
return rv;
+#else
+ int fd;
+ char *dev;
+
+ (void)mountpoint;
+ (void)opts;
+
+ dev = getenv("FUSE_DEV_FD");
+
+ if (dev) {
+ errno = 0;
+ fd = strtol(dev, NULL, 10);
+
+ if (errno) {
+ perror("bad value given in FUSE_DEV_FD");
+ return -1;
+ }
+
+ if (fd < 0)
+ return -1;
+
+ return fd;
+ }
+
+ dev = getenv("FUSE_DEV_NAME");
+
+ if (! dev)
+ dev = "/dev/fuse";
+
+ if ((fd = open(dev, O_RDWR)) < 0)
+ perror("failed to open fuse device");
+
+ return fd;
+#endif
}
int fuse_mount_compat1(const char *mountpoint, const char *args[])
|