summaryrefslogtreecommitdiff
path: root/internal/debugfs/debugfs.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/debugfs/debugfs.go')
-rw-r--r--internal/debugfs/debugfs.go57
1 files changed, 57 insertions, 0 deletions
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
+}