From 38ee83e45b4de7edf89bf9f0ef629eb4c6ad0fa8 Mon Sep 17 00:00:00 2001 From: Christopher Speller Date: Thu, 12 May 2016 23:56:07 -0400 Subject: Moving to glide --- .../github.com/mattermost/rsc/fuse/mount_darwin.go | 122 +++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 vendor/github.com/mattermost/rsc/fuse/mount_darwin.go (limited to 'vendor/github.com/mattermost/rsc/fuse/mount_darwin.go') diff --git a/vendor/github.com/mattermost/rsc/fuse/mount_darwin.go b/vendor/github.com/mattermost/rsc/fuse/mount_darwin.go new file mode 100644 index 000000000..5e2caaa76 --- /dev/null +++ b/vendor/github.com/mattermost/rsc/fuse/mount_darwin.go @@ -0,0 +1,122 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// TODO: Rewrite using package syscall not cgo + +package fuse + +/* + +// Adapted from Plan 9 from User Space's src/cmd/9pfuse/fuse.c, +// which carries this notice: +// +// The files in this directory are subject to the following license. +// +// The author of this software is Russ Cox. +// +// Copyright (c) 2006 Russ Cox +// +// Permission to use, copy, modify, and distribute this software for any +// purpose without fee is hereby granted, provided that this entire notice +// is included in all copies of any software which is or includes a copy +// or modification of this software and in all copies of the supporting +// documentation for such software. +// +// THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED +// WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION OR WARRANTY +// OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS SOFTWARE OR ITS +// FITNESS FOR ANY PARTICULAR PURPOSE. + +#include +#include +#include +#include +#include +#include +#include +#include + +#define nil ((void*)0) + +static int +mountfuse(char *mtpt, char **err) +{ + int i, pid, fd, r; + char buf[200]; + struct vfsconf vfs; + char *f; + + if(getvfsbyname("fusefs", &vfs) < 0){ + if(access(f="/Library/Filesystems/osxfusefs.fs" + "/Support/load_osxfusefs", 0) < 0){ + *err = strdup("cannot find load_fusefs"); + return -1; + } + if((r=system(f)) < 0){ + snprintf(buf, sizeof buf, "%s: %s", f, strerror(errno)); + *err = strdup(buf); + return -1; + } + if(r != 0){ + snprintf(buf, sizeof buf, "load_fusefs failed: exit %d", r); + *err = strdup(buf); + return -1; + } + if(getvfsbyname("osxfusefs", &vfs) < 0){ + snprintf(buf, sizeof buf, "getvfsbyname osxfusefs: %s", strerror(errno)); + *err = strdup(buf); + return -1; + } + } + + // Look for available FUSE device. + for(i=0;; i++){ + snprintf(buf, sizeof buf, "/dev/osxfuse%d", i); + if(access(buf, 0) < 0){ + *err = strdup("no available fuse devices"); + return -1; + } + if((fd = open(buf, O_RDWR)) >= 0) + break; + } + + pid = fork(); + if(pid < 0) + return -1; + if(pid == 0){ + snprintf(buf, sizeof buf, "%d", fd); + setenv("MOUNT_FUSEFS_CALL_BY_LIB", "", 1); + // Different versions of MacFUSE put the + // mount_fusefs binary in different places. + // Try all. + // Leopard location + setenv("MOUNT_FUSEFS_DAEMON_PATH", + "/Library/Filesystems/osxfusefs.fs/Support/mount_osxfusefs", 1); + execl("/Library/Filesystems/osxfusefs.fs/Support/mount_osxfusefs", + "mount_osxfusefs", + "-o", "iosize=4096", buf, mtpt, nil); + fprintf(stderr, "exec mount_osxfusefs: %s\n", strerror(errno)); + _exit(1); + } + return fd; +} + +*/ +import "C" + +import "unsafe" + +func mount(dir string) (int, string) { + errp := (**C.char)(C.malloc(16)) + *errp = nil + defer C.free(unsafe.Pointer(errp)) + cdir := C.CString(dir) + defer C.free(unsafe.Pointer(cdir)) + fd := C.mountfuse(cdir, errp) + var err string + if *errp != nil { + err = C.GoString(*errp) + } + return int(fd), err +} -- cgit v1.2.3-1-g7c22