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) --- src/cmd/9pfuse/fuse.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to '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; -- cgit v1.2.3