github.com/Cloud-Foundations/Dominator@v0.3.4/lib/fsutil/mounts/impl.go (about) 1 package mounts 2 3 import ( 4 "bufio" 5 "fmt" 6 "os" 7 "strings" 8 ) 9 10 const ( 11 procMounts = "/proc/mounts" 12 ) 13 14 func getMountTable() (*MountTable, error) { 15 file, err := os.Open(procMounts) 16 if err != nil { 17 return nil, err 18 } 19 defer file.Close() 20 scanner := bufio.NewScanner(file) 21 table := &MountTable{} 22 for scanner.Scan() { 23 line := scanner.Text() 24 var junk string 25 var entry MountEntry 26 nScanned, err := fmt.Sscanf(line, "%s %s %s %s %s", 27 &entry.Device, &entry.MountPoint, &entry.Type, &entry.Options, 28 &junk) 29 if err != nil { 30 return nil, err 31 } 32 if nScanned < 4 { 33 return nil, fmt.Errorf("only read %d values from %s", 34 nScanned, line) 35 } 36 table.Entries = append(table.Entries, &entry) 37 } 38 if err := scanner.Err(); err != nil { 39 return nil, err 40 } 41 return table, nil 42 } 43 44 func (mt *MountTable) findEntry(path string) *MountEntry { 45 var lastMatch *MountEntry 46 var lastLength int 47 for _, entry := range mt.Entries { 48 length := len(entry.MountPoint) 49 if strings.HasPrefix(path, entry.MountPoint) && length > lastLength { 50 lastMatch = entry 51 lastLength = length 52 } 53 } 54 return lastMatch 55 }