cmd/sharefs: handle mount -t fuse.sharefs
All checks were successful
Test / Create distribution (push) Successful in 33s
Test / ShareFS (push) Successful in 39s
Test / Sandbox (push) Successful in 46s
Test / Sandbox (race detector) (push) Successful in 45s
Test / Hpkg (push) Successful in 49s
Test / Hakurei (push) Successful in 54s
Test / Hakurei (race detector) (push) Successful in 55s
Test / Flake checks (push) Successful in 1m35s
All checks were successful
Test / Create distribution (push) Successful in 33s
Test / ShareFS (push) Successful in 39s
Test / Sandbox (push) Successful in 46s
Test / Sandbox (race detector) (push) Successful in 45s
Test / Hpkg (push) Successful in 49s
Test / Hakurei (push) Successful in 54s
Test / Hakurei (race detector) (push) Successful in 55s
Test / Flake checks (push) Successful in 1m35s
This should have been handled in a custom option parsing function, but that much extra complexity is unnecessary for this edge case. Honestly I do not know why libfuse does not handle this itself. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
@@ -314,7 +314,7 @@ func _main(s ...string) (exitCode int) {
|
|||||||
// hack to keep fuse_parse_cmdline happy in the container
|
// hack to keep fuse_parse_cmdline happy in the container
|
||||||
mountpoint := C.GoString(opts.mountpoint)
|
mountpoint := C.GoString(opts.mountpoint)
|
||||||
pathnameArg := -1
|
pathnameArg := -1
|
||||||
for i, arg := range os.Args {
|
for i, arg := range s {
|
||||||
if arg == mountpoint {
|
if arg == mountpoint {
|
||||||
pathnameArg = i
|
pathnameArg = i
|
||||||
break
|
break
|
||||||
@@ -324,7 +324,7 @@ func _main(s ...string) (exitCode int) {
|
|||||||
log.Println("mountpoint must be absolute")
|
log.Println("mountpoint must be absolute")
|
||||||
return 2
|
return 2
|
||||||
}
|
}
|
||||||
os.Args[pathnameArg] = container.Nonexistent
|
s[pathnameArg] = container.Nonexistent
|
||||||
}
|
}
|
||||||
|
|
||||||
if !parseOpts(&args, &setup, msg.GetLogger()) {
|
if !parseOpts(&args, &setup, msg.GetLogger()) {
|
||||||
@@ -421,7 +421,7 @@ func _main(s ...string) (exitCode int) {
|
|||||||
} else {
|
} else {
|
||||||
z.Path = a
|
z.Path = a
|
||||||
}
|
}
|
||||||
z.Args = os.Args
|
z.Args = s
|
||||||
z.ForwardCancel = true
|
z.ForwardCancel = true
|
||||||
z.SeccompPresets |= std.PresetStrict
|
z.SeccompPresets |= std.PresetStrict
|
||||||
z.ParentPerm = 0700
|
z.ParentPerm = 0700
|
||||||
|
|||||||
@@ -3,14 +3,29 @@ package main
|
|||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"slices"
|
||||||
)
|
)
|
||||||
|
|
||||||
// sharefsName is the prefix used by log.std in the sharefs process.
|
// sharefsName is the prefix used by log.std in the sharefs process.
|
||||||
const sharefsName = "sharefs"
|
const sharefsName = "sharefs"
|
||||||
|
|
||||||
|
// handleMountArgs returns an alternative, libfuse-compatible args slice for
|
||||||
|
// args passed by mount -t fuse.sharefs [options] sharefs <mountpoint>.
|
||||||
|
//
|
||||||
|
// In this case, args always has a length of 5 with index 0 being what comes
|
||||||
|
// after "fuse." in the filesystem type, 1 is the uninterpreted string passed
|
||||||
|
// to mount (sharefsName is used as the magic string to enable this hack),
|
||||||
|
// 2 is passed through to libfuse as mountpoint, and 3 is always "-o".
|
||||||
|
func handleMountArgs(args []string) []string {
|
||||||
|
if len(args) == 5 && args[1] == sharefsName && args[3] == "-o" {
|
||||||
|
return []string{sharefsName, args[2], "-o", args[4]}
|
||||||
|
}
|
||||||
|
return slices.Clone(args)
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.SetFlags(0)
|
log.SetFlags(0)
|
||||||
log.SetPrefix(sharefsName + ": ")
|
log.SetPrefix(sharefsName + ": ")
|
||||||
|
|
||||||
os.Exit(_main(os.Args...))
|
os.Exit(_main(handleMountArgs(os.Args)...))
|
||||||
}
|
}
|
||||||
|
|||||||
29
cmd/sharefs/main_test.go
Normal file
29
cmd/sharefs/main_test.go
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"slices"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestHandleMountArgs(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
args []string
|
||||||
|
want []string
|
||||||
|
}{
|
||||||
|
{"nil", nil, nil},
|
||||||
|
{"passthrough", []string{"sharefs", "-V"}, []string{"sharefs", "-V"}},
|
||||||
|
{"replace", []string{"/sbin/sharefs", "sharefs", "/sdcard", "-o", "rw"}, []string{"sharefs", "/sdcard", "-o", "rw"}},
|
||||||
|
}
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
if got := handleMountArgs(tc.args); !slices.Equal(got, tc.want) {
|
||||||
|
t.Errorf("handleMountArgs: %q, want %q", got, tc.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user