diff --git a/disk/disk_netbsd.go b/disk/disk_netbsd.go index 6f1ba3f..062d773 100644 --- a/disk/disk_netbsd.go +++ b/disk/disk_netbsd.go @@ -14,23 +14,41 @@ import ( func PartitionsWithContext(ctx context.Context, all bool) ([]PartitionStat, error) { var ret []PartitionStat + + flag := uint64(1) // ST_WAIT/MNT_WAIT, see sys/fstypes.h // get required buffer size r, _, err = unix.Syscall6( 483, // SYS___getvfsstat90 syscall nil, 0, - 1, // ST_WAIT/MNT_WAIT, see sys/fstypes.h + uintptr(unsafe.Pointer(&flag)), ) if err != nil { return ret, err } mountedFsCount := uint64(r) + // calculate the buffer size + bufSize := sizeOfStatvfs * mountedFsCount + buf := make([]Statvfs, bufSize) + + // request agian to get desired mount data + _, _, err = unix.Syscall6( + 483, + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&bufSize)), + uintptr(unsafe.Pointer(&flag)), + ) + if err != nil { + return ret, err + } + + for _, stat := range buf { d := PartitionStat{ - Device: common.ByteToString(stat.F_mntfromname[:]), - Mountpoint: common.ByteToString(stat.F_mntonname[:]), - Fstype: common.ByteToString(stat.F_fstypename[:]), + Device: common.ByteToString([]byte(stat.Mntfromname[:])), + Mountpoint: common.ByteToString([]byte(stat.Mntonname[:])), + Fstype: common.ByteToString([]byte(stat.Fstypename[:])), Opts: opts, } diff --git a/disk/disk_netbsd_arm64.go b/disk/disk_netbsd_arm64.go new file mode 100644 index 0000000..9d364d4 --- /dev/null +++ b/disk/disk_netbsd_arm64.go @@ -0,0 +1,38 @@ +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs types_netbsd.go + +package disk + +const ( + sizeOfStatvfs = 0xce0 +) + +type ( + Statvfs struct { + Flag uint64 + Bsize uint64 + Frsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Bresvd uint64 + Files uint64 + Ffree uint64 + Favail uint64 + Fresvd uint64 + Syncreads uint64 + Syncwrites uint64 + Asyncreads uint64 + Asyncwrites uint64 + Fsidx _Ctype_struct___0 + Fsid uint64 + Namemax uint64 + Owner uint32 + Spare [4]uint64 + Fstypename [32]uint8 + Mntonname [1024]uint8 + Mntfromname [1024]uint8 + Mntfromlabel [1024]uint8 + } +) diff --git a/disk/types_netbsd.go b/disk/types_netbsd.go new file mode 100644 index 0000000..25217a0 --- /dev/null +++ b/disk/types_netbsd.go @@ -0,0 +1,30 @@ +//go:build ignore +// +build ignore + +// Hand writing: _Ctype_struct_statvfs + +/* +Input to cgo -godefs. +*/ + +package disk + +/* +#include +#include +#include +#include +#include +#include +#include +#include +*/ +import "C" + +const ( + sizeOfStatvfs = C.sizeof_struct_statvfs +) + +type ( + Statvfs C.struct_statvfs +)