aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/csource
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2023-10-27 17:14:09 +0200
committerTaras Madan <tarasmadan@google.com>2023-10-30 11:13:38 +0000
commitb5729d823e22b9aada3c12f2bbb218c278df1acf (patch)
tree12ce6e01e2c2d89dc76e0eb881f50d967c3b8cd0 /pkg/csource
parent376ad51803a0e7f2bc6b1719f96fa9169568e4da (diff)
pkg/csource/options.go: refactor deserializeLegacyFormats
It contributes to #4285 unblocking.
Diffstat (limited to 'pkg/csource')
-rw-r--r--pkg/csource/options.go104
1 files changed, 45 insertions, 59 deletions
diff --git a/pkg/csource/options.go b/pkg/csource/options.go
index 9a43c65fc..9490e394a 100644
--- a/pkg/csource/options.go
+++ b/pkg/csource/options.go
@@ -204,63 +204,49 @@ func (opts Options) Serialize() []byte {
return data
}
-func deserializeLegacyOptions1(data string, opts *Options) error {
- waitRepeat, debug := false, false
- n, err := fmt.Sscanf(data,
- "{Threaded:%t Collide:%t Repeat:%t Procs:%d Sandbox:%s"+
- " Fault:%t FaultCall:%d FaultNth:%d EnableTun:%t UseTmpDir:%t"+
- " HandleSegv:%t WaitRepeat:%t Debug:%t Repro:%t}",
- &opts.Threaded, &opts.Collide, &opts.Repeat, &opts.Procs, &opts.Sandbox,
- &opts.Fault, &opts.FaultCall, &opts.FaultNth, &opts.NetInjection, &opts.UseTmpDir,
- &opts.HandleSegv, &waitRepeat, &debug, &opts.Repro)
-
- if err == nil {
- if want := 14; n != want {
- return fmt.Errorf("failed to parse repro options: got %v fields, want %v", n, want)
- }
+func deserializeLegacyOptions(data string, opts *Options) (int, error) {
+ ignoreBool := true
+ keyToTarget := map[string]any{
+ "Threaded": &opts.Threaded,
+ "Collide": &opts.Collide,
+ "Repeat": &opts.Repeat,
+ "Procs": &opts.Procs,
+ "Sandbox": &opts.Sandbox,
+ "SandboxArg": &opts.SandboxArg,
+ "Fault": &opts.Fault,
+ "FaultCall": &opts.FaultCall,
+ "FaultNth": &opts.FaultNth,
+ "EnableTun": &opts.NetInjection,
+ "UseTmpDir": &opts.UseTmpDir,
+ "EnableCgroups": &opts.Cgroups,
+ "HandleSegv": &opts.HandleSegv,
+ "WaitRepeat": &ignoreBool,
+ "Debug": &ignoreBool,
+ "Repro": &opts.Repro,
}
- return err
-}
-func deserializeLegacyOptions2(data string, opts *Options) error {
- waitRepeat, debug := false, false
- n, err := fmt.Sscanf(data,
- "{Threaded:%t Collide:%t Repeat:%t Procs:%d Sandbox:%s"+
- " Fault:%t FaultCall:%d FaultNth:%d EnableTun:%t UseTmpDir:%t"+
- " EnableCgroups:%t HandleSegv:%t WaitRepeat:%t Debug:%t Repro:%t}",
- &opts.Threaded, &opts.Collide, &opts.Repeat, &opts.Procs, &opts.Sandbox,
- &opts.Fault, &opts.FaultCall, &opts.FaultNth, &opts.NetInjection, &opts.UseTmpDir,
- &opts.Cgroups, &opts.HandleSegv, &waitRepeat, &debug, &opts.Repro)
- if err == nil {
- if want := 15; n != want {
- return fmt.Errorf("failed to parse repro options 2: got %v fields, want %v", n, want)
+ data = strings.TrimSpace(data)
+ data = strings.TrimPrefix(data, "{")
+ data = strings.TrimSuffix(data, "}")
+ totalRead := 0
+ for _, token := range strings.Fields(data) {
+ key, value, keyValueFound := strings.Cut(token, ":")
+ if !keyValueFound {
+ return totalRead, fmt.Errorf("error splitting options token %v", token)
}
- }
- return err
-}
-
-// Android format.
-func deserializeLegacyOptions3(data string, opts *Options) error {
- waitRepeat, debug := false, false
- n, err := fmt.Sscanf(data,
- "{Threaded:%t Collide:%t Repeat:%t Procs:%d Sandbox:%s SandboxArg:%d"+
- " Fault:%t FaultCall:%d FaultNth:%d EnableTun:%t UseTmpDir:%t"+
- " EnableCgroups:%t HandleSegv:%t WaitRepeat:%t Debug:%t Repro:%t}",
- &opts.Threaded, &opts.Collide, &opts.Repeat, &opts.Procs, &opts.Sandbox, &opts.SandboxArg,
- &opts.Fault, &opts.FaultCall, &opts.FaultNth, &opts.NetInjection, &opts.UseTmpDir,
- &opts.Cgroups, &opts.HandleSegv, &waitRepeat, &debug, &opts.Repro)
- if err == nil {
- if want := 16; n != want {
- return fmt.Errorf("failed to parse repro options 3: got %v fields, want %v", n, want)
+ if _, ok := keyToTarget[key]; !ok {
+ return totalRead, fmt.Errorf("error, unexpected option key %v", key)
+ }
+ dest := keyToTarget[key]
+ n, err := fmt.Sscanf(value, "%v", dest)
+ if err != nil {
+ return totalRead, fmt.Errorf("failed to read %v", value)
}
+ totalRead += n
+ delete(keyToTarget, key)
}
- return err
-}
-var parsers = []func(string, *Options) error{
- deserializeLegacyOptions1,
- deserializeLegacyOptions2,
- deserializeLegacyOptions3,
+ return totalRead, nil
}
// Support for legacy formats.
@@ -269,14 +255,14 @@ func deserializeLegacyFormats(data []byte, opts *Options) error {
strData := string(data)
// We can distinguish between legacy formats by the number
- // of fields. The formats we support have 14, 15 and 16.
- // Each field can be recognized by ':' char.
- version := strings.Count(strData, ":")
- if version < 14 || version > 16 {
- return fmt.Errorf("unrecognized options format")
- }
- index := version - 14
- err := parsers[index](strData, opts)
+ // of fields. The formats we support have 14, 15 and 16 fields.
+ fieldsFound, err := deserializeLegacyOptions(strData, opts)
+ if err != nil {
+ return fmt.Errorf("failed to parse '%v': %w", strData, err)
+ }
+ if fieldsFound < 14 || fieldsFound > 16 {
+ return fmt.Errorf("%v params found, expected 14 <= x <= 16", fieldsFound)
+ }
if opts.Sandbox == "empty" {
opts.Sandbox = ""