Skip to content

Commit 08fab1c

Browse files
committed
Fix kernelArgs not parsing kernel 'init' parameters
Signed-off-by: Juan Fernández <[email protected]>
1 parent 3a6ac02 commit 08fab1c

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

kernelargs.go

+23-5
Original file line numberDiff line numberDiff line change
@@ -23,36 +23,54 @@ import "strings"
2323
// "key" will result in map["key"] = nil
2424
type kernelArgs map[string]*string
2525

26+
const initSeparator = "--"
27+
const initKey = "init"
28+
2629
// serialize the kernelArgs back to a string that can be provided
2730
// to the kernel
2831
func (kargs kernelArgs) String() string {
2932
var fields []string
33+
var initField string
34+
if initValue, ok := kargs[initKey]; ok && initValue != nil {
35+
initField = initKey + "=" + *initValue
36+
}
3037
for key, value := range kargs {
38+
if key == initKey {
39+
continue
40+
}
3141
field := key
3242
if value != nil {
3343
field += "=" + *value
3444
}
3545
fields = append(fields, field)
3646
}
47+
fields = append(fields, initField)
3748
return strings.Join(fields, " ")
3849
}
3950

4051
// deserialize the provided string to a kernelArgs map
4152
func parseKernelArgs(rawString string) kernelArgs {
4253
argMap := make(map[string]*string)
43-
for _, kv := range strings.Fields(rawString) {
44-
// only split into up to 2 fields (before and after the first "=")
45-
kvSplit := strings.SplitN(kv, "=", 2)
54+
fields := strings.Fields(rawString)
55+
passToInit := false
4656

57+
for i := 0; i < len(fields); i++ {
58+
kvSplit := strings.SplitN(fields[i], "=", 2)
4759
key := kvSplit[0]
60+
if key == initSeparator {
61+
passToInit = true
62+
}
4863

4964
var value *string
50-
if len(kvSplit) == 2 {
65+
if passToInit {
66+
key = initKey
67+
initValue := *argMap[key] + " " + kvSplit[0]
68+
value = &initValue
69+
} else if len(kvSplit) == 2 {
5170
value = &kvSplit[1]
5271
}
5372

5473
argMap[key] = value
5574
}
56-
5775
return argMap
5876
}

kernelargs_test.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,22 @@ func TestKernelArgsSerder(t *testing.T) {
2424
fooVal := "bar"
2525
booVal := "far"
2626
dooVal := "a=silly=val"
27+
initVal := "/bin/sh -- -c \"echo hello\""
2728
emptyVal := ""
2829

29-
argsString := fmt.Sprintf("foo=%s blah doo=%s huh=%s bleh duh=%s boo=%s",
30+
argsString := fmt.Sprintf("foo=%s blah doo=%s huh=%s bleh duh=%s boo=%s init=%s",
3031
fooVal,
3132
dooVal,
3233
emptyVal,
3334
emptyVal,
3435
booVal,
36+
initVal,
3537
)
3638

3739
expectedParsedArgs := kernelArgs(map[string]*string{
3840
"foo": &fooVal,
3941
"doo": &dooVal,
42+
"init": &initVal,
4043
"blah": nil,
4144
"huh": &emptyVal,
4245
"bleh": nil,
@@ -45,6 +48,8 @@ func TestKernelArgsSerder(t *testing.T) {
4548
})
4649

4750
actualParsedArgs := parseKernelArgs(argsString)
51+
fmt.Printf("%v\n", actualParsedArgs)
52+
fmt.Printf("%v\n", expectedParsedArgs)
4853
require.Equal(t, expectedParsedArgs, actualParsedArgs, "kernel args parsed to unexpected values")
4954

5055
reparsedArgs := parseKernelArgs(actualParsedArgs.String())

0 commit comments

Comments
 (0)