| //go:build freebsd || openbsd || darwin | |
| // +build freebsd openbsd darwin | |
| package mountinfo | |
| import "golang.org/x/sys/unix" | |
| // parseMountTable returns information about mounted filesystems | |
| func parseMountTable(filter FilterFunc) ([]*Info, error) { | |
| count, err := unix.Getfsstat(nil, unix.MNT_WAIT) | |
| if err != nil { | |
| return nil, err | |
| } | |
| entries := make([]unix.Statfs_t, count) | |
| _, err = unix.Getfsstat(entries, unix.MNT_WAIT) | |
| if err != nil { | |
| return nil, err | |
| } | |
| var out []*Info | |
| for _, entry := range entries { | |
| var skip, stop bool | |
| mountinfo := getMountinfo(&entry) | |
| 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 | |
| } | |
| func mounted(path string) (bool, error) { | |
| path, err := normalizePath(path) | |
| if err != nil { | |
| return false, err | |
| } | |
| // Fast path: compare st.st_dev fields. | |
| // This should always work for FreeBSD and OpenBSD. | |
| mounted, err := mountedByStat(path) | |
| if err == nil { | |
| return mounted, nil | |
| } | |
| // Fallback to parsing mountinfo | |
| return mountedByMountinfo(path) | |
| } |