diff --git a/disk/disk_fallback.go b/disk/disk_fallback.go index 4768733..36525f6 100644 --- a/disk/disk_fallback.go +++ b/disk/disk_fallback.go @@ -1,5 +1,5 @@ -//go:build !darwin && !linux && !freebsd && !openbsd && !windows && !solaris && !aix -// +build !darwin,!linux,!freebsd,!openbsd,!windows,!solaris,!aix +//go:build !darwin && !linux && !freebsd && !openbsd && !netbsd && !windows && !solaris && !aix +// +build !darwin,!linux,!freebsd,!openbsd,!netbsd,!windows,!solaris,!aix package disk diff --git a/disk/disk_netbsd.go b/disk/disk_netbsd.go index 2f9a39a..94ff76e 100644 --- a/disk/disk_netbsd.go +++ b/disk/disk_netbsd.go @@ -1,5 +1,5 @@ -//go:build openbsd -// +build openbsd +//go:build netbsd +// +build netbsd package disk @@ -7,24 +7,37 @@ import ( "bytes" "context" "encoding/binary" + "unsafe" "github.com/shirou/gopsutil/v3/internal/common" "golang.org/x/sys/unix" ) +const ( + // see sys/fstypes.h and `man 5 statvfs` + MNT_RDONLY = 0x00000001 /* read only filesystem */ + MNT_SYNCHRONOUS = 0x00000002 /* file system written synchronously */ + MNT_NOEXEC = 0x00000004 /* can't exec from filesystem */ + MNT_NOSUID = 0x00000008 /* don't honor setuid bits on fs */ + MNT_NODEV = 0x00000010 /* don't interpret special files */ + MNT_ASYNC = 0x00000040 /* file system written asynchronously */ + MNT_NOATIME = 0x04000000 /* Never update access times in fs */ + MNT_SOFTDEP = 0x80000000 /* Use soft dependencies */ +) + 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( + r, _, err := unix.Syscall( 483, // SYS___getvfsstat90 syscall - nil, 0, - uintptr(unsafe.Pointer(&flag)), + 0, + uintptr(unsafe.Pointer(&flag)), ) - if err != nil { + if err != 0 { return ret, err } mountedFsCount := uint64(r) @@ -34,17 +47,43 @@ func PartitionsWithContext(ctx context.Context, all bool) ([]PartitionStat, erro buf := make([]Statvfs, bufSize) // request agian to get desired mount data - _, _, err = unix.Syscall6( + _, _, err = unix.Syscall( 483, uintptr(unsafe.Pointer(&buf[0])), uintptr(unsafe.Pointer(&bufSize)), uintptr(unsafe.Pointer(&flag)), ) - if err != nil { + if err != 0 { return ret, err } for _, stat := range buf { + opts := []string{"rw"} + if stat.Flag&MNT_RDONLY != 0 { + opts = []string{"rw"} + } + if stat.Flag&MNT_SYNCHRONOUS != 0 { + opts = append(opts, "sync") + } + if stat.Flag&MNT_NOEXEC != 0 { + opts = append(opts, "noexec") + } + if stat.Flag&MNT_NOSUID != 0 { + opts = append(opts, "nosuid") + } + if stat.Flag&MNT_NODEV != 0 { + opts = append(opts, "nodev") + } + if stat.Flag&MNT_ASYNC != 0 { + opts = append(opts, "async") + } + if stat.Flag&MNT_SOFTDEP != 0 { + opts = append(opts, "softdep") + } + if stat.Flag&MNT_NOATIME != 0 { + opts = append(opts, "noatime") + } + d := PartitionStat{ Device: common.ByteToString([]byte(stat.Mntfromname[:])), Mountpoint: common.ByteToString([]byte(stat.Mntonname[:])), @@ -68,13 +107,13 @@ func UsageWithContext(ctx context.Context, path string) (*UsageStat, error) { flag := uint64(1) // ST_WAIT/MNT_WAIT, see sys/fstypes.h // request agian to get desired mount data - ret, _, err = unix.Syscall6( + ret, _, err := unix.Syscall( 485, // SYS___fstatvfs190, see sys/syscall.h uintptr(unsafe.Pointer(&path)), uintptr(unsafe.Pointer(&stat)), uintptr(unsafe.Pointer(&flag)), ) - if err != nil { + if err != 0 { return ret, err } diff --git a/disk/disk_netbsd_arm64.go b/disk/disk_netbsd_arm64.go index 9d364d4..c98be60 100644 --- a/disk/disk_netbsd_arm64.go +++ b/disk/disk_netbsd_arm64.go @@ -1,3 +1,6 @@ +//go:build netbsd && arm64 +// +build netbsd,arm64 + // Code generated by cmd/cgo -godefs; DO NOT EDIT. // cgo -godefs types_netbsd.go @@ -36,3 +39,7 @@ type ( Mntfromlabel [1024]uint8 } ) + +type _Ctype_struct___0 struct { + FsidVal [32]int32 +} diff --git a/disk/types_netbsd.go b/disk/types_netbsd.go index 25217a0..c0326f5 100644 --- a/disk/types_netbsd.go +++ b/disk/types_netbsd.go @@ -1,7 +1,7 @@ //go:build ignore // +build ignore -// Hand writing: _Ctype_struct_statvfs +// Hand writing: _Ctype_struct___0 /* Input to cgo -godefs. @@ -17,7 +17,7 @@ package disk #include <sys/stdint.h> #include <machine/ansi.h> #include <sys/ansi.h> -#include <sys/fstypes.h> + */ import "C"