@@ -29,19 +29,23 @@ import (
2929 "k8s.io/kops/util/pkg/reflectutils"
3030)
3131
32- // BuildFlags returns a space separated list arguments
32+ // BuildFlags returns a space- separated list of arguments.
3333// @deprecated: please use BuildFlagsList
3434func BuildFlags (options interface {}) (string , error ) {
35- flags , err := BuildFlagsList (options )
35+ flags , err := buildFlagsList (options , maybeQuote )
3636 if err != nil {
3737 return "" , err
3838 }
3939
4040 return strings .Join (flags , " " ), nil
4141}
4242
43- // BuildFlagsList reflects the options interface and extracts the flags from struct tags
43+ // BuildFlagsList reflects the options interface and extracts the flags from struct tags.
4444func BuildFlagsList (options interface {}) ([]string , error ) {
45+ return buildFlagsList (options , neverQuote )
46+ }
47+
48+ func buildFlagsList (options interface {}, quote func (string ) string ) ([]string , error ) {
4549 var flags []string
4650
4751 walker := func (path * reflectutils.FieldPath , field * reflect.StructField , val reflect.Value ) error {
@@ -143,7 +147,7 @@ func BuildFlagsList(options interface{}) ([]string, error) {
143147 case string :
144148 vString := fmt .Sprintf ("%v" , v )
145149 if vString != "" && vString != flagEmpty {
146- flag = fmt .Sprintf ("--%s=%s" , flagName , maybeQuote (vString ))
150+ flag = fmt .Sprintf ("--%s=%s" , flagName , quote (vString ))
147151 }
148152
149153 case * string :
@@ -152,10 +156,10 @@ func BuildFlagsList(options interface{}) ([]string, error) {
152156 // just like the string case above.
153157 vString := fmt .Sprintf ("%v" , * v )
154158 if flagIncludeEmpty {
155- flag = fmt .Sprintf ("--%s=%s" , flagName , maybeQuote (vString ))
159+ flag = fmt .Sprintf ("--%s=%s" , flagName , quote (vString ))
156160 } else {
157161 if vString != "" && vString != flagEmpty {
158- flag = fmt .Sprintf ("--%s=%s" , flagName , maybeQuote (vString ))
162+ flag = fmt .Sprintf ("--%s=%s" , flagName , quote (vString ))
159163 }
160164 }
161165 }
@@ -214,9 +218,16 @@ func BuildFlagsList(options interface{}) ([]string, error) {
214218 return flags , nil
215219}
216220
221+ // maybeQuote quotes s when it contains a double quote, so values survive the space-separated
222+ // string form that a shell or systemd may parse. argv values use neverQuote instead.
217223func maybeQuote (s string ) string {
218224 if strings .Contains (s , "\" " ) {
219225 return fmt .Sprintf ("%q" , s )
220226 }
221227 return s
222228}
229+
230+ // neverQuote returns s unchanged, for values used directly as exec argv.
231+ func neverQuote (s string ) string {
232+ return s
233+ }
0 commit comments