diff options
Diffstat (limited to 'vendor/github.com/moby/sys/mountinfo/mountinfo_freebsd.go')
-rw-r--r-- | vendor/github.com/moby/sys/mountinfo/mountinfo_freebsd.go | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/vendor/github.com/moby/sys/mountinfo/mountinfo_freebsd.go b/vendor/github.com/moby/sys/mountinfo/mountinfo_freebsd.go new file mode 100644 index 000000000..a7dbb1b46 --- /dev/null +++ b/vendor/github.com/moby/sys/mountinfo/mountinfo_freebsd.go @@ -0,0 +1,53 @@ +package mountinfo + +/* +#include <sys/param.h> +#include <sys/ucred.h> +#include <sys/mount.h> +*/ +import "C" + +import ( + "fmt" + "reflect" + "unsafe" +) + +// parseMountTable returns information about mounted filesystems +func parseMountTable(filter FilterFunc) ([]*Info, 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 []*Info + for _, entry := range entries { + var mountinfo Info + var skip, stop bool + mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0]) + mountinfo.Fstype = C.GoString(&entry.f_fstypename[0]) + mountinfo.Source = C.GoString(&entry.f_mntfromname[0]) + + if filter != nil { + // filter out entries we're not interested in + skip, stop = filter(&mountinfo) + if skip { + continue + } + } + + out = append(out, &mountinfo) + if stop { + break + } + } + return out, nil +} |