aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2007-01-18 12:52:54 +0000
committerrsc <devnull@localhost>2007-01-18 12:52:54 +0000
commit9b3fcf01c5d22d7be320a0e194cc54579f71c409 (patch)
tree62c73a298ebd2f52872ffb72ef6cec4a6b483165
parente290e875f350dbbc2288ec988d939a57cc8f9bf2 (diff)
downloadplan9port-9b3fcf01c5d22d7be320a0e194cc54579f71c409.tar.gz
plan9port-9b3fcf01c5d22d7be320a0e194cc54579f71c409.tar.bz2
plan9port-9b3fcf01c5d22d7be320a0e194cc54579f71c409.zip
Mac FUSE support (thanks to Jeff Sickel)
-rwxr-xr-xbin/mount5
-rwxr-xr-xbin/unmount4
-rw-r--r--man/man4/9pfuse.43
-rw-r--r--src/cmd/9pfuse/fuse.c49
-rw-r--r--src/libthread/Darwin-386.c1
5 files changed, 59 insertions, 3 deletions
diff --git a/bin/mount b/bin/mount
index f20304b4..3cc36adb 100755
--- a/bin/mount
+++ b/bin/mount
@@ -18,6 +18,11 @@ case FreeBSD
if(kldstat|9 grep -si ' fuse')
exec 9pfuse $1 $2
echo 'don''t know how to mount (no fuse)' >[1=2]
+case Darwin
+ if(sysctl fuse.version >[2=1] |9 grep -si 'fuse.version' ||
+ test -d /System/Library/Extensions/fusefs.kext)
+ exec 9pfuse $1 $2
+ echo 'don''t know how to mount (no fuse)' >[1=2]
case *
echo 'can''t mount on' `{uname} >[1=2]
}
diff --git a/bin/unmount b/bin/unmount
index 3d2760f8..6323e843 100755
--- a/bin/unmount
+++ b/bin/unmount
@@ -1,10 +1,10 @@
-#!/usr/local/plan9/bin/rc
+l#!/usr/local/plan9/bin/rc
if(! ~ $#* 1){
echo 'usage: unmount mtpt' >[1=2]
exit usage
}
f=`{u mount | grep $1}
-if(echo $f | 9 grep -s 'type fuse')
+if(echo $f | 9 grep -s 'type fuse' && ! ~ `{uname} Darwin)
exec fusermount -u -z $1
exec u umount $1
diff --git a/man/man4/9pfuse.4 b/man/man4/9pfuse.4
index 8d70885b..f7bd575f 100644
--- a/man/man4/9pfuse.4
+++ b/man/man4/9pfuse.4
@@ -58,5 +58,8 @@ FUSE Homepage,
.PP
FUSE for FreeBSD,
.HR http://fuse4bsd.creo.hu
+.PP
+MacFUSE,
+.HR http://code.google.com/p/macfuse
.SH SOURCE
.B \*9/src/cmd/9pfuse
diff --git a/src/cmd/9pfuse/fuse.c b/src/cmd/9pfuse/fuse.c
index 2a6d13a4..b2ccd7fc 100644
--- a/src/cmd/9pfuse/fuse.c
+++ b/src/cmd/9pfuse/fuse.c
@@ -742,6 +742,11 @@ fusefmt(Fmt *fmt)
return 0;
}
+#if defined(__APPLE__)
+#include <sys/param.h>
+#include <sys/mount.h>
+#endif
+
/*
* Mounts a fuse file system on mtpt and returns
* a file descriptor for the corresponding fuse
@@ -788,6 +793,50 @@ mountfuse(char *mtpt)
_exit(1);
}
return fd;
+#elif defined(__APPLE__)
+ int i, pid, fd, r;
+ char buf[20];
+ struct vfsconf vfs;
+
+ if(getvfsbyname("fusefs", &vfs) < 0){
+ if((r=system("/System/Library/Extensions/fusefs.kext"
+ "/Contents/Resources/load_fusefs")) < 0){
+ werrstr("load fusefs: %r");
+ return -1;
+ }
+ if(r != 0){
+ werrstr("load_fusefs failed: exit %d", r);
+ return -1;
+ }
+ if(getvfsbyname("fusefs", &vfs) < 0){
+ werrstr("getvfsbyname fusefs: %r");
+ return -1;
+ }
+ }
+
+ /* Look for available FUSE device. */
+ for(i=0;; i++){
+ snprint(buf, sizeof buf, "/dev/fuse%d", i);
+ if(access(buf, 0) < 0){
+ werrstr("no available fuse devices");
+ return -1;
+ }
+ if((fd = open(buf, ORDWR)) >= 0)
+ break;
+ }
+
+ pid = fork();
+ if(pid < 0)
+ return -1;
+ if(pid == 0){
+ snprint(buf, sizeof buf, "%d", fd);
+ putenv("MOUNT_FUSEFS_CALL_BY_LIB", "");
+ execl("mount_fusefs", "mount_fusefs", buf, mtpt, nil);
+ fprint(2, "exec mount_fusefs: %r\n");
+ _exit(1);
+ }
+ return fd;
+
#else
werrstr("cannot mount fuse on this system");
return -1;
diff --git a/src/libthread/Darwin-386.c b/src/libthread/Darwin-386.c
index 0bd3c0fd..3ad1941c 100644
--- a/src/libthread/Darwin-386.c
+++ b/src/libthread/Darwin-386.c
@@ -3,7 +3,6 @@
void
makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
{
- int n;
int *sp;
sp = (int*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/4;