mount.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // +build linux
  2. package devmapper
  3. import (
  4. "bytes"
  5. "fmt"
  6. "os"
  7. "path/filepath"
  8. "golang.org/x/sys/unix"
  9. )
  10. // FIXME: this is copy-pasted from the aufs driver.
  11. // It should be moved into the core.
  12. // Mounted returns true if a mount point exists.
  13. func Mounted(mountpoint string) (bool, error) {
  14. var mntpointSt unix.Stat_t
  15. if err := unix.Stat(mountpoint, &mntpointSt); err != nil {
  16. if os.IsNotExist(err) {
  17. return false, nil
  18. }
  19. return false, err
  20. }
  21. var parentSt unix.Stat_t
  22. if err := unix.Stat(filepath.Join(mountpoint, ".."), &parentSt); err != nil {
  23. return false, err
  24. }
  25. return mntpointSt.Dev != parentSt.Dev, nil
  26. }
  27. type probeData struct {
  28. fsName string
  29. magic string
  30. offset uint64
  31. }
  32. // ProbeFsType returns the filesystem name for the given device id.
  33. func ProbeFsType(device string) (string, error) {
  34. probes := []probeData{
  35. {"btrfs", "_BHRfS_M", 0x10040},
  36. {"ext4", "\123\357", 0x438},
  37. {"xfs", "XFSB", 0},
  38. }
  39. maxLen := uint64(0)
  40. for _, p := range probes {
  41. l := p.offset + uint64(len(p.magic))
  42. if l > maxLen {
  43. maxLen = l
  44. }
  45. }
  46. file, err := os.Open(device)
  47. if err != nil {
  48. return "", err
  49. }
  50. defer file.Close()
  51. buffer := make([]byte, maxLen)
  52. l, err := file.Read(buffer)
  53. if err != nil {
  54. return "", err
  55. }
  56. if uint64(l) != maxLen {
  57. return "", fmt.Errorf("devmapper: unable to detect filesystem type of %s, short read", device)
  58. }
  59. for _, p := range probes {
  60. if bytes.Equal([]byte(p.magic), buffer[p.offset:p.offset+uint64(len(p.magic))]) {
  61. return p.fsName, nil
  62. }
  63. }
  64. return "", fmt.Errorf("devmapper: Unknown filesystem type on %s", device)
  65. }
  66. func joinMountOptions(a, b string) string {
  67. if a == "" {
  68. return b
  69. }
  70. if b == "" {
  71. return a
  72. }
  73. return a + "," + b
  74. }