github.com/opencontainers/runtime-tools@v0.9.0/generate/seccomp/parse_arguments.go (about) 1 package seccomp 2 3 import ( 4 "fmt" 5 "strconv" 6 7 rspec "github.com/opencontainers/runtime-spec/specs-go" 8 ) 9 10 // parseArguments takes a list of arguments (delimArgs). It parses and fills out 11 // the argument information and returns a slice of arg structs 12 func parseArguments(delimArgs []string) ([]rspec.LinuxSeccompArg, error) { 13 nilArgSlice := []rspec.LinuxSeccompArg{} 14 numberOfArgs := len(delimArgs) 15 16 // No parameters passed with syscall 17 if numberOfArgs == 1 { 18 return nilArgSlice, nil 19 } 20 21 // Correct number of parameters passed with syscall 22 if numberOfArgs == 5 { 23 syscallIndex, err := strconv.ParseUint(delimArgs[1], 10, 0) 24 if err != nil { 25 return nilArgSlice, err 26 } 27 28 syscallValue, err := strconv.ParseUint(delimArgs[2], 10, 64) 29 if err != nil { 30 return nilArgSlice, err 31 } 32 33 syscallValueTwo, err := strconv.ParseUint(delimArgs[3], 10, 64) 34 if err != nil { 35 return nilArgSlice, err 36 } 37 38 syscallOp, err := parseOperator(delimArgs[4]) 39 if err != nil { 40 return nilArgSlice, err 41 } 42 43 argStruct := rspec.LinuxSeccompArg{ 44 Index: uint(syscallIndex), 45 Value: syscallValue, 46 ValueTwo: syscallValueTwo, 47 Op: syscallOp, 48 } 49 50 argSlice := []rspec.LinuxSeccompArg{} 51 argSlice = append(argSlice, argStruct) 52 return argSlice, nil 53 } 54 55 return nilArgSlice, fmt.Errorf("incorrect number of arguments passed with syscall: %d", numberOfArgs) 56 } 57 58 func parseOperator(operator string) (rspec.LinuxSeccompOperator, error) { 59 operators := map[string]rspec.LinuxSeccompOperator{ 60 "NE": rspec.OpNotEqual, 61 "LT": rspec.OpLessThan, 62 "LE": rspec.OpLessEqual, 63 "EQ": rspec.OpEqualTo, 64 "GE": rspec.OpGreaterEqual, 65 "GT": rspec.OpGreaterThan, 66 "ME": rspec.OpMaskedEqual, 67 } 68 o, ok := operators[operator] 69 if !ok { 70 return "", fmt.Errorf("unrecognized operator: %s", operator) 71 } 72 return o, nil 73 }