aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/moby/sys/mount/mounter_openbsd.go
blob: 3c0718b907de292ed9563c677a67074c4b6bff7d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//go:build openbsd && cgo
// +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
}