summaryrefslogtreecommitdiff
path: root/pkg/mount/mountinfo_freebsd.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/mount/mountinfo_freebsd.go')
-rw-r--r--pkg/mount/mountinfo_freebsd.go38
1 files changed, 38 insertions, 0 deletions
diff --git a/pkg/mount/mountinfo_freebsd.go b/pkg/mount/mountinfo_freebsd.go
new file mode 100644
index 0000000000..a16bdb84f8
--- /dev/null
+++ b/pkg/mount/mountinfo_freebsd.go
@@ -0,0 +1,38 @@
+package mount
+
+/*
+#include <sys/param.h>
+#include <sys/ucred.h>
+#include <sys/mount.h>
+*/
+import "C"
+
+import (
+ "fmt"
+ "reflect"
+ "unsafe"
+)
+
+// Parse /proc/self/mountinfo because comparing Dev and ino does not work from bind mounts
+func parseMountTable() ([]*MountInfo, error) {
+ var rawEntries *C.struct_statfs
+
+ count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT))
+ if count == 0 {
+ return nil, fmt.Errorf("Failed to call getmntinfo")
+ }
+
+ var entries []C.struct_statfs
+ header := (*reflect.SliceHeader)(unsafe.Pointer(&entries))
+ header.Cap = count
+ header.Len = count
+ header.Data = uintptr(unsafe.Pointer(rawEntries))
+
+ var out []*MountInfo
+ for _, entry := range entries {
+ var mountinfo MountInfo
+ mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0])
+ out = append(out, &mountinfo)
+ }
+ return out, nil
+}