mounted_unix.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. //go:build linux || freebsd || openbsd || darwin
  2. // +build linux freebsd openbsd darwin
  3. package mountinfo
  4. import (
  5. "os"
  6. "path/filepath"
  7. "golang.org/x/sys/unix"
  8. )
  9. func mountedByStat(path string) (bool, error) {
  10. var st unix.Stat_t
  11. if err := unix.Lstat(path, &st); err != nil {
  12. return false, &os.PathError{Op: "stat", Path: path, Err: err}
  13. }
  14. dev := st.Dev
  15. parent := filepath.Dir(path)
  16. if err := unix.Lstat(parent, &st); err != nil {
  17. return false, &os.PathError{Op: "stat", Path: parent, Err: err}
  18. }
  19. if dev != st.Dev {
  20. // Device differs from that of parent,
  21. // so definitely a mount point.
  22. return true, nil
  23. }
  24. // NB: this does not detect bind mounts on Linux.
  25. return false, nil
  26. }
  27. func normalizePath(path string) (realPath string, err error) {
  28. if realPath, err = filepath.Abs(path); err != nil {
  29. return "", err
  30. }
  31. if realPath, err = filepath.EvalSymlinks(realPath); err != nil {
  32. return "", err
  33. }
  34. if _, err := os.Stat(realPath); err != nil {
  35. return "", err
  36. }
  37. return realPath, nil
  38. }
  39. func mountedByMountinfo(path string) (bool, error) {
  40. entries, err := GetMounts(SingleEntryFilter(path))
  41. if err != nil {
  42. return false, err
  43. }
  44. return len(entries) > 0, nil
  45. }