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  }