github.com/geofffranks/garden-linux@v0.0.0-20160715111146-26c893169cfa/sysinfo/max_valid_uid.go (about) 1 package sysinfo 2 3 import ( 4 "bufio" 5 "fmt" 6 "os" 7 ) 8 9 type IDMap string 10 11 const DefaultUIDMap IDMap = "/proc/self/uid_map" 12 const DefaultGIDMap IDMap = "/proc/self/gid_map" 13 14 func MustGetMaxValidUID() int { 15 return must(DefaultUIDMap.MaxValid()) 16 } 17 18 func MustGetMaxValidGID() int { 19 return must(DefaultGIDMap.MaxValid()) 20 } 21 22 func (u IDMap) MaxValid() (int, error) { 23 f, err := os.Open(string(u)) 24 if err != nil { 25 return 0, err 26 } 27 28 m := 0 29 scanner := bufio.NewScanner(f) 30 for scanner.Scan() { 31 var container, host, size int 32 if _, err := fmt.Sscanf(scanner.Text(), "%d %d %d", &container, &host, &size); err != nil { 33 return 0, ParseError{Line: scanner.Text(), Err: err} 34 } 35 36 m = Max(m, container+size-1) 37 } 38 39 return m, nil 40 } 41 42 func Min(a, b int) int { 43 if a < b { 44 return a 45 } 46 47 return b 48 } 49 50 func Max(a, b int) int { 51 if a > b { 52 return a 53 } 54 55 return b 56 } 57 58 type ParseError struct { 59 Line string 60 Err error 61 } 62 63 func (p ParseError) Error() string { 64 return fmt.Sprintf(`%s while parsing line "%s"`, p.Err, p.Line) 65 } 66 67 func must(a int, err error) int { 68 if err != nil { 69 panic(err) 70 } 71 72 return a 73 }