summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/eventfilter.go34
-rw-r--r--internal/eventloop.go8
-rw-r--r--internal/flags/flags.go2
3 files changed, 41 insertions, 3 deletions
diff --git a/internal/eventfilter.go b/internal/eventfilter.go
index 1edda5a..cedd88d 100644
--- a/internal/eventfilter.go
+++ b/internal/eventfilter.go
@@ -2,6 +2,7 @@ package internal
import (
"bytes"
+ "fmt"
"ior/internal/flags"
"ior/internal/generated/types"
)
@@ -9,22 +10,53 @@ import (
type eventFilter struct {
commFilterEnable bool
commFilter [types.MAX_PROGNAME_LENGTH]byte
+ pathFilterEnable bool
+ pathFilter [types.MAX_FILENAME_LENGTH]byte
}
func newEventFilter(flags flags.Flags) *eventFilter {
var ef eventFilter
if flags.CommFilter != "" {
+ if len(flags.CommFilter) > types.MAX_FILENAME_LENGTH {
+ panic(fmt.Sprintf("Comm filter's max size is %d", types.MAX_PROGNAME_LENGTH))
+ }
ef.commFilterEnable = true
copy(ef.commFilter[:], []byte(flags.CommFilter))
}
+ if flags.PathFilter != "" {
+ if len(flags.PathFilter) > types.MAX_FILENAME_LENGTH {
+ panic(fmt.Sprintf("Path filter's max size is %d", types.MAX_FILENAME_LENGTH))
+ }
+ ef.pathFilterEnable = true
+ copy(ef.pathFilter[:], []byte(flags.PathFilter))
+ }
return &ef
}
func (ef *eventFilter) openEvent(ev *types.OpenEvent) (*types.OpenEvent, bool) {
+ commFilterPass := true
if ef.commFilterEnable {
- return ev, bytes.Contains(ev.Comm[:], ef.commFilter[:])
+ commFilterPass = bytes.Contains(ev.Comm[:], ef.commFilter[:])
+ }
+ pathFilterPass := true
+ if ef.pathFilterEnable {
+ pathFilterPass = bytes.Contains(ev.Filename[:], ef.pathFilter[:])
+ }
+ return ev, commFilterPass && pathFilterPass
+}
+
+func (ef *eventFilter) pathEvent(ev *types.PathEvent) (*types.PathEvent, bool) {
+ if ef.pathFilterEnable {
+ return ev, bytes.Contains(ev.Pathname[:], ef.pathFilter[:])
+ }
+ return ev, true
+}
+
+func (ef *eventFilter) nameEvent(ev *types.NameEvent) (*types.NameEvent, bool) {
+ if ef.pathFilterEnable {
+ return ev, bytes.Contains(ev.Oldname[:], ef.pathFilter[:]) || bytes.Contains(ev.Newname[:], ef.pathFilter[:])
}
return ev, true
}
diff --git a/internal/eventloop.go b/internal/eventloop.go
index 4961f80..8569004 100644
--- a/internal/eventloop.go
+++ b/internal/eventloop.go
@@ -71,9 +71,13 @@ func (e *eventLoop) events(rawCh <-chan []byte) <-chan *eventPair {
case EXIT_RET_EVENT:
e.syscallExit(NewRetEvent(raw), ch)
case ENTER_NAME_EVENT:
- e.syscallEnter(NewNameEvent(raw))
+ if ev, ok := e.filter.nameEvent(NewNameEvent(raw)); ok {
+ e.syscallEnter(ev)
+ }
case ENTER_PATH_EVENT:
- e.syscallEnter(NewPathEvent(raw))
+ if ev, ok := e.filter.pathEvent(NewPathEvent(raw)); ok {
+ e.syscallEnter(ev)
+ }
default:
panic(fmt.Sprintf("unhandled event type %v: %v", EventType(raw[0]), raw))
}
diff --git a/internal/flags/flags.go b/internal/flags/flags.go
index c22bb75..51bca07 100644
--- a/internal/flags/flags.go
+++ b/internal/flags/flags.go
@@ -12,6 +12,7 @@ type Flags struct {
TidFilter int
EventMapSize int
CommFilter string
+ PathFilter string
PprofEnable bool
}
@@ -20,6 +21,7 @@ func New() (flags Flags) {
flag.IntVar(&flags.TidFilter, "tid", -1, "Filter for thread ID")
flag.IntVar(&flags.EventMapSize, "mapSize", 4096*16, "BPF FD event ring buffer map size")
flag.StringVar(&flags.CommFilter, "comm", "", "Command to filter for")
+ flag.StringVar(&flags.PathFilter, "path", "", "Path to filter for")
flag.BoolVar(&flags.PprofEnable, "pprof", false, "Enable profiling")
flag.Parse()