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  }