github.com/opencontainers/runc@v1.2.0-rc.1.0.20240520010911-492dc558cdd6/libcontainer/system/kernelparam/lookup.go (about)

     1  package kernelparam
     2  
     3  import (
     4  	"io/fs"
     5  	"strings"
     6  )
     7  
     8  func runeFilter(c rune) bool {
     9  	return c < '!' || c > '~'
    10  }
    11  
    12  // LookupKernelBootParameters returns the selected kernel parameters specified
    13  // in the kernel command line. The parameters are returned as a map of key-value pairs.
    14  func LookupKernelBootParameters(rootFS fs.FS, lookupParameters ...string) (map[string]string, error) {
    15  	cmdline, err := fs.ReadFile(rootFS, "proc/cmdline")
    16  	if err != nil {
    17  		return nil, err
    18  	}
    19  
    20  	kernelParameters := make(map[string]string)
    21  	remaining := len(lookupParameters)
    22  
    23  	for _, parameter := range strings.FieldsFunc(string(cmdline), runeFilter) {
    24  		if remaining == 0 {
    25  			break
    26  		}
    27  		idx := strings.IndexByte(parameter, '=')
    28  		if idx == -1 {
    29  			continue
    30  		}
    31  		for _, lookupParam := range lookupParameters {
    32  			if lookupParam == parameter[:idx] {
    33  				kernelParameters[lookupParam] = parameter[idx+1:]
    34  				remaining--
    35  				break
    36  			}
    37  		}
    38  	}
    39  
    40  	return kernelParameters, nil
    41  }