summaryrefslogtreecommitdiff
path: root/internal/probemanager/grouping.go
blob: be5565939a3835c71c6aa5c35407ad4d15cce737 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package probemanager

import "strings"

const (
	sysEnterPrefix = "sys_enter_"
	sysExitPrefix  = "sys_exit_"
)

// TracepointPair holds enter/exit tracepoint names for one syscall.
type TracepointPair struct {
	Enter string
	Exit  string
}

// GroupTracepoints groups syscall tracepoint names by base syscall name.
// Input names must be in sys_enter_<name> / sys_exit_<name> format.
func GroupTracepoints(names []string) map[string]TracepointPair {
	out := make(map[string]TracepointPair, len(names)/2)
	for _, name := range names {
		base, isEnter, ok := parseSyscallTracepoint(name)
		if !ok {
			continue
		}

		pair := out[base]
		if isEnter {
			pair.Enter = name
		} else {
			pair.Exit = name
		}
		out[base] = pair
	}
	return out
}

func parseSyscallTracepoint(name string) (base string, isEnter bool, ok bool) {
	if after, found := strings.CutPrefix(name, sysEnterPrefix); found {
		if after == "" {
			return "", false, false
		}
		return after, true, true
	}
	if after, found := strings.CutPrefix(name, sysExitPrefix); found {
		if after == "" {
			return "", false, false
		}
		return after, false, true
	}
	return "", false, false
}