Skip to content

Commit

Permalink
Merge pull request #59 from yukiisbored/yuki_is_bored/openbsd_mounter
Browse files Browse the repository at this point in the history
Create proper mounter for OpenBSD
  • Loading branch information
kolyshkin committed Feb 24, 2021
2 parents 5a29239 + eff8446 commit 4fda0b7
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 1 deletion.
2 changes: 1 addition & 1 deletion mount/mounter_bsd.go → mount/mounter_freebsd.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// +build freebsd,cgo openbsd,cgo
// +build freebsd,cgo

package mount

Expand Down
77 changes: 77 additions & 0 deletions mount/mounter_openbsd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// +build openbsd,cgo

/*
Due to how OpenBSD mount(2) works, filesystem types need to be
supported explicitly since it uses separate structs to pass
filesystem-specific arguments.
For now only UFS/FFS is supported as it's the default fs
on OpenBSD systems.
See: https://man.openbsd.org/mount.2
*/

package mount

/*
#include <sys/types.h>
#include <sys/mount.h>
*/
import "C"

import (
"fmt"
"syscall"
"unsafe"
)

func createExportInfo(readOnly bool) C.struct_export_args {
exportFlags := C.int(0)
if readOnly {
exportFlags = C.MNT_EXRDONLY
}
out := C.struct_export_args{
ex_root: 0,
ex_flags: exportFlags,
}
return out
}

func createUfsArgs(device string, readOnly bool) unsafe.Pointer {
out := &C.struct_ufs_args{
fspec: C.CString(device),
export_info: createExportInfo(readOnly),
}
return unsafe.Pointer(out)
}

func mount(device, target, mType string, flag uintptr, data string) error {
readOnly := flag&RDONLY != 0

var fsArgs unsafe.Pointer

switch mType {
case "ffs":
fsArgs = createUfsArgs(device, readOnly)
default:
return &mountError{
op: "mount",
source: device,
target: target,
flags: flag,
err: fmt.Errorf("unsupported file system type: %s", mType),
}
}

if errno := C.mount(C.CString(mType), C.CString(target), C.int(flag), fsArgs); errno != 0 {
return &mountError{
op: "mount",
source: device,
target: target,
flags: flag,
err: syscall.Errno(errno),
}
}

return nil
}

0 comments on commit 4fda0b7

Please sign in to comment.