| //go:build linux || freebsd || openbsd || darwin | |
| // +build linux freebsd openbsd darwin | |
| package mountinfo | |
| import ( | |
| "os" | |
| "path/filepath" | |
| "golang.org/x/sys/unix" | |
| ) | |
| func mountedByStat(path string) (bool, error) { | |
| var st unix.Stat_t | |
| if err := unix.Lstat(path, &st); err != nil { | |
| return false, &os.PathError{Op: "stat", Path: path, Err: err} | |
| } | |
| dev := st.Dev | |
| parent := filepath.Dir(path) | |
| if err := unix.Lstat(parent, &st); err != nil { | |
| return false, &os.PathError{Op: "stat", Path: parent, Err: err} | |
| } | |
| if dev != st.Dev { | |
| // Device differs from that of parent, | |
| // so definitely a mount point. | |
| return true, nil | |
| } | |
| // NB: this does not detect bind mounts on Linux. | |
| return false, nil | |
| } | |
| func normalizePath(path string) (realPath string, err error) { | |
| if realPath, err = filepath.Abs(path); err != nil { | |
| return "", err | |
| } | |
| if realPath, err = filepath.EvalSymlinks(realPath); err != nil { | |
| return "", err | |
| } | |
| if _, err := os.Stat(realPath); err != nil { | |
| return "", err | |
| } | |
| return realPath, nil | |
| } | |
| func mountedByMountinfo(path string) (bool, error) { | |
| entries, err := GetMounts(SingleEntryFilter(path)) | |
| if err != nil { | |
| return false, err | |
| } | |
| return len(entries) > 0, nil | |
| } |