Mac FUSE support (thanks to Jeff Sickel)

This commit is contained in:
rsc 2007-01-18 12:52:54 +00:00
parent e290e875f3
commit 9b3fcf01c5
5 changed files with 59 additions and 3 deletions

View file

@ -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]
}

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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;