mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
Mac FUSE support (thanks to Jeff Sickel)
This commit is contained in:
parent
e290e875f3
commit
9b3fcf01c5
5 changed files with 59 additions and 3 deletions
|
@ -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]
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue