Skip to content

Commit

Permalink
mountinfo: BSDs no longer need cgo nor reflect
Browse files Browse the repository at this point in the history
Signed-off-by: 谢致邦 (XIE Zhibang) <Yeking@Red54.com>
  • Loading branch information
Red54 committed Apr 19, 2022
1 parent 7335f4f commit bdd2e0c
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 31 deletions.
4 changes: 2 additions & 2 deletions mountinfo/mounted_unix.go
@@ -1,5 +1,5 @@
//go:build linux || (freebsd && cgo) || (openbsd && cgo) || (darwin && cgo)
// +build linux freebsd,cgo openbsd,cgo darwin,cgo
//go:build linux || freebsd || openbsd || darwin
// +build linux freebsd openbsd darwin

package mountinfo

Expand Down
50 changes: 23 additions & 27 deletions mountinfo/mountinfo_bsd.go
@@ -1,43 +1,39 @@
//go:build (freebsd && cgo) || (openbsd && cgo) || (darwin && cgo)
// +build freebsd,cgo openbsd,cgo darwin,cgo
//go:build freebsd || openbsd || darwin
// +build freebsd openbsd darwin

package mountinfo

/*
#include <sys/param.h>
#include <sys/ucred.h>
#include <sys/mount.h>
*/
import "C"
import "syscall"

import (
"fmt"
"reflect"
"unsafe"
)
func int8SliceToString(is []int8) string {
var bs []byte
for _, i := range is {
if i == 0 {
break
}
bs = append(bs, byte(i))
}
return string(bs)
}

// 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")
const MNT_WAIT = 1
count, err := syscall.Getfsstat(nil, MNT_WAIT)
if err != nil {
return nil, err
}

var entries []C.struct_statfs
header := (*reflect.SliceHeader)(unsafe.Pointer(&entries))
header.Cap = count
header.Len = count
header.Data = uintptr(unsafe.Pointer(rawEntries))
entries := make([]syscall.Statfs_t, count)
_, err = syscall.Getfsstat(entries, MNT_WAIT)
if err != nil {
return nil, err
}

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])
mountinfo := getMountinfo(entry)

if filter != nil {
// filter out entries we're not interested in
Expand Down
13 changes: 13 additions & 0 deletions mountinfo/mountinfo_freebsdlike.go
@@ -0,0 +1,13 @@
//go:build freebsd || darwin
// +build freebsd darwin

package mountinfo

import "syscall"

func getMountinfo(entry syscall.Statfs_t) (mountinfo Info) {
mountinfo.Mountpoint = int8SliceToString(entry.Mntonname[:])
mountinfo.FSType = int8SliceToString(entry.Fstypename[:])
mountinfo.Source = int8SliceToString(entry.Mntfromname[:])
return
}
10 changes: 10 additions & 0 deletions mountinfo/mountinfo_openbsd.go
@@ -0,0 +1,10 @@
package mountinfo

import "syscall"

func getMountinfo(entry syscall.Statfs_t) (mountinfo Info) {
mountinfo.Mountpoint = int8SliceToString(entry.F_mntonname[:])
mountinfo.FSType = int8SliceToString(entry.F_fstypename[:])
mountinfo.Source = int8SliceToString(entry.F_mntfromname[:])
return
}
4 changes: 2 additions & 2 deletions mountinfo/mountinfo_unsupported.go
@@ -1,5 +1,5 @@
//go:build (!windows && !linux && !freebsd && !openbsd && !darwin) || (freebsd && !cgo) || (openbsd && !cgo) || (darwin && !cgo)
// +build !windows,!linux,!freebsd,!openbsd,!darwin freebsd,!cgo openbsd,!cgo darwin,!cgo
//go:build !windows && !linux && !freebsd && !openbsd && !darwin
// +build !windows,!linux,!freebsd,!openbsd,!darwin

package mountinfo

Expand Down

0 comments on commit bdd2e0c

Please sign in to comment.