@@ -23,36 +23,54 @@ import "strings"
23
23
// "key" will result in map["key"] = nil
24
24
type kernelArgs map [string ]* string
25
25
26
+ const initSeparator = "--"
27
+ const initKey = "init"
28
+
26
29
// serialize the kernelArgs back to a string that can be provided
27
30
// to the kernel
28
31
func (kargs kernelArgs ) String () string {
29
32
var fields []string
33
+ var initField string
34
+ if initValue , ok := kargs [initKey ]; ok && initValue != nil {
35
+ initField = initKey + "=" + * initValue
36
+ }
30
37
for key , value := range kargs {
38
+ if key == initKey {
39
+ continue
40
+ }
31
41
field := key
32
42
if value != nil {
33
43
field += "=" + * value
34
44
}
35
45
fields = append (fields , field )
36
46
}
47
+ fields = append (fields , initField )
37
48
return strings .Join (fields , " " )
38
49
}
39
50
40
51
// deserialize the provided string to a kernelArgs map
41
52
func parseKernelArgs (rawString string ) kernelArgs {
42
53
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
46
56
57
+ for i := 0 ; i < len (fields ); i ++ {
58
+ kvSplit := strings .SplitN (fields [i ], "=" , 2 )
47
59
key := kvSplit [0 ]
60
+ if key == initSeparator {
61
+ passToInit = true
62
+ }
48
63
49
64
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 {
51
70
value = & kvSplit [1 ]
52
71
}
53
72
54
73
argMap [key ] = value
55
74
}
56
-
57
75
return argMap
58
76
}
0 commit comments