From 9b3fcf01c5d22d7be320a0e194cc54579f71c409 Mon Sep 17 00:00:00 2001 From: rsc Date: Thu, 18 Jan 2007 12:52:54 +0000 Subject: Mac FUSE support (thanks to Jeff Sickel) --- bin/mount | 5 +++++ bin/unmount | 4 ++-- man/man4/9pfuse.4 | 3 +++ src/cmd/9pfuse/fuse.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++ src/libthread/Darwin-386.c | 1 - 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 +#include +#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; -- cgit v1.2.3