@@ -23,36 +23,54 @@ import "strings"
2323// "key" will result in map["key"] = nil
2424type 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
2831func (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
4152func 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}
0 commit comments