aboutsummaryrefslogtreecommitdiffhomepage
path: root/cmd/sharefs/fuse.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/sharefs/fuse.go')
-rw-r--r--cmd/sharefs/fuse.go25
1 files changed, 25 insertions, 0 deletions
diff --git a/cmd/sharefs/fuse.go b/cmd/sharefs/fuse.go
index bbbc1446..9a0a0149 100644
--- a/cmd/sharefs/fuse.go
+++ b/cmd/sharefs/fuse.go
@@ -53,6 +53,9 @@ type (
// Whether sharefs_init failed.
initFailed bool
+ // Whether to create source directory as root.
+ mkdir bool
+
// Open file descriptor to fuse.
Fuse int
@@ -157,6 +160,9 @@ func parseOpts(args *fuseArgs, setup *setupState, log *log.Logger) (ok bool) {
// Pathname to writable source directory.
source *C.char
+ // Whether to create source directory as root.
+ mkdir C.int
+
// Decimal string representation of uid to set when running as root.
setuid *C.char
// Decimal string representation of gid to set when running as root.
@@ -169,6 +175,7 @@ func parseOpts(args *fuseArgs, setup *setupState, log *log.Logger) (ok bool) {
if C.fuse_opt_parse(args, unsafe.Pointer(&unsafeOpts), &[]C.struct_fuse_opt{
{templ: C.CString("source=%s"), offset: C.ulong(unsafe.Offsetof(unsafeOpts.source)), value: 0},
+ {templ: C.CString("mkdir"), offset: C.ulong(unsafe.Offsetof(unsafeOpts.mkdir)), value: 1},
{templ: C.CString("setuid=%s"), offset: C.ulong(unsafe.Offsetof(unsafeOpts.setuid)), value: 0},
{templ: C.CString("setgid=%s"), offset: C.ulong(unsafe.Offsetof(unsafeOpts.setgid)), value: 0},
@@ -223,6 +230,7 @@ func parseOpts(args *fuseArgs, setup *setupState, log *log.Logger) (ok bool) {
} else {
setup.Source = a
}
+ setup.mkdir = unsafeOpts.mkdir != 0
if unsafeOpts.setuid == nil {
setup.Setuid = -1
@@ -339,6 +347,9 @@ func _main(s ...string) (exitCode int) {
} else if setup.Fuse < 3 && (setup.Setuid > 0 || setup.Setgid > 0) {
log.Println("setuid and setgid has no effect when not starting as root")
return 1
+ } else if setup.mkdir {
+ log.Println("mkdir has no effect when not starting as root")
+ return 1
}
op := C.struct_fuse_operations{
@@ -387,6 +398,20 @@ func _main(s ...string) (exitCode int) {
log.Println("setuid and setgid must not be 0")
return 5
}
+
+ if setup.mkdir {
+ if err := os.MkdirAll(setup.Source.String(), 0700); err != nil {
+ if !errors.Is(err, os.ErrExist) {
+ log.Println(err)
+ return 5
+ }
+ // skip setup for existing source directory
+ } else if err = os.Chown(setup.Source.String(), setup.Setuid, setup.Setgid); err != nil {
+ log.Println(err)
+ return 5
+ }
+ }
+
if err := syscall.Setresgid(setup.Setgid, setup.Setgid, setup.Setgid); err != nil {
log.Printf("cannot set gid: %v", err)
return 5