| package mount |
| |
| import ( |
| "bufio" |
| "fmt" |
| "io" |
| "os" |
| ) |
| |
| const ( |
| // We only parse upto the mountinfo because that is all we |
| // care about right now |
| mountinfoFormat = "%d %d %d:%d %s %s %s" |
| ) |
| |
| // Represents one line from /proc/self/mountinfo |
| type procEntry struct { |
| id, parent, major, minor int |
| source, mountpoint, opts string |
| } |
| |
| // Parse /proc/self/mountinfo because comparing Dev and ino does not work from bind mounts |
| func parseMountTable() ([]*procEntry, error) { |
| f, err := os.Open("/proc/self/mountinfo") |
| if err != nil { |
| return nil, err |
| } |
| defer f.Close() |
| |
| return parseInfoFile(f) |
| } |
| |
| func parseInfoFile(r io.Reader) ([]*procEntry, error) { |
| var ( |
| s = bufio.NewScanner(r) |
| out = []*procEntry{} |
| ) |
| |
| for s.Scan() { |
| if err := s.Err(); err != nil { |
| return nil, err |
| } |
| |
| var ( |
| p = &procEntry{} |
| text = s.Text() |
| ) |
| if _, err := fmt.Sscanf(text, mountinfoFormat, |
| &p.id, &p.parent, &p.major, &p.minor, |
| &p.source, &p.mountpoint, &p.opts); err != nil { |
| return nil, fmt.Errorf("Scanning '%s' failed: %s", text, err) |
| } |
| out = append(out, p) |
| } |
| return out, nil |
| } |