Skip to content

Commit

Permalink
Create proper mounter for OpenBSD
Browse files Browse the repository at this point in the history
OpenBSD's mount(2) works differently since it uses separate structs to
present options for different filesystems, unlike in FreeBSD. It also
means that support for other filesystems need to be added explicitly.

I'm not sure which ones are required for now so I just write support
for only FFS, which is the go-to filesystem used by OpenBSD systems.

Signed-off-by: Muhammad Kaisar Arkhan <hi@yukiisbo.red>
  • Loading branch information
yukiisbored committed Jan 5, 2021
1 parent 5a29239 commit eff8446
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 eff8446

Please sign in to comment.