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
}
|