From b9762202d123160c9a64b804b72e018f61fddd1d Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 10 Feb 2024 23:35:37 +0200 Subject: add debugfs.TracepointsWithF --- internal/debugfs/debugfs.go | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 internal/debugfs/debugfs.go (limited to 'internal/debugfs/debugfs.go') diff --git a/internal/debugfs/debugfs.go b/internal/debugfs/debugfs.go new file mode 100644 index 0000000..80ac436 --- /dev/null +++ b/internal/debugfs/debugfs.go @@ -0,0 +1,57 @@ +package debugfs + +import ( + "bufio" + "fmt" + "os" + "path/filepath" + "strings" +) + +// Return tracepoints with 'unsigned int fd', which are I/O tracepoints on FDs +func TracepointsWithFd() ([]string, error) { + return tracepointsWith("unsigned int fd") +} + +func tracepointsWith(field string) ([]string, error) { + var tracepoints []string + + matches, err := filepath.Glob("/sys/kernel/debug/tracing/events/syscalls/*/format") + if err != nil { + return tracepoints, err + } + if len(matches) == 0 { + return tracepoints, fmt.Errorf("Unable to gather tracepoints with FDs") + } + + for _, formatPath := range matches { + has, err := hasField(formatPath, field) + if err != nil { + return tracepoints, err + } + if !has { + continue + } + tracepoints = append(tracepoints, filepath.Base(filepath.Dir(formatPath))) + } + + return tracepoints, nil +} + +func hasField(formatPath, field string) (bool, error) { + file, err := os.Open(formatPath) + if err != nil { + return false, err + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := scanner.Text() + if strings.Contains(line, fmt.Sprintf("field:%s;", field)) { + return true, nil + } + } + + return false, nil +} -- cgit v1.2.3