diff options
Diffstat (limited to 'internal/debugfs')
| -rw-r--r-- | internal/debugfs/debugfs.go | 57 |
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 +} |
