diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-19 16:15:18 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-19 16:15:18 +0300 |
| commit | 843def4f5c23db050cccfae57a9acb5899c110f4 (patch) | |
| tree | d90d94c39ff59c7df7278f29f5402c58c391daec /internal/eventloop_exit.go | |
| parent | 061fb2b2380752eed06a78d10567da172ea8e27c (diff) | |
x6: add pipe/eventfd fd-from-air syscall support
Diffstat (limited to 'internal/eventloop_exit.go')
| -rw-r--r-- | internal/eventloop_exit.go | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/internal/eventloop_exit.go b/internal/eventloop_exit.go index 9953c13..345424c 100644 --- a/internal/eventloop_exit.go +++ b/internal/eventloop_exit.go @@ -32,6 +32,10 @@ func (e *eventLoop) handleTracepointExit(ep *event.Pair) bool { return e.handleSocketpairExit(ep, ev) case *types.AcceptEvent: return e.handleAcceptExit(ep, ev) + case *types.PipeEvent: + return e.handlePipeExit(ep, ev) + case *types.EventfdEvent: + return e.handleEventfdExit(ep, ev) case *types.NullEvent: return e.handleNullExit(ep, ev) case *types.FcntlEvent: @@ -322,6 +326,71 @@ func acceptedSocketDescriptorName(listening file.File) string { return name } +func (e *eventLoop) handlePipeExit(ep *event.Pair, pipeEv *types.PipeEvent) bool { + exitEv, ok := ep.ExitEv.(*types.PipeEvent) + if !ok { + e.recyclePair(ep, "Dropped malformed pipe exit event") + return false + } + + flags := exitEv.Flags + if flags == 0 { + flags = pipeEv.Flags + } + if exitEv.Ret == 0 { + if exitEv.Fd0 >= 0 { + fdFile := file.NewFd(exitEv.Fd0, pipeDescriptorName(flags, exitEv.Fd0, exitEv.Fd1), flags) + e.fdState().set(exitEv.Fd0, fdFile) + ep.File = fdFile + } + if exitEv.Fd1 >= 0 { + fdFile := file.NewFd(exitEv.Fd1, pipeDescriptorName(flags, exitEv.Fd0, exitEv.Fd1), flags) + e.fdState().set(exitEv.Fd1, fdFile) + if ep.File == nil { + ep.File = fdFile + } + } + } + ep.Comm = e.comm(pipeEv.GetTid()) + if !e.Filter().MatchPair(ep) { + ep.Recycle() + return false + } + return true +} + +func (e *eventLoop) handleEventfdExit(ep *event.Pair, eventfdEv *types.EventfdEvent) bool { + exitEv, ok := ep.ExitEv.(*types.EventfdEvent) + if !ok { + e.recyclePair(ep, "Dropped malformed eventfd exit event") + return false + } + + flags := exitEv.Flags + if flags == 0 { + flags = eventfdEv.Flags + } + if fd := int32(exitEv.Ret); fd >= 0 { + fdFile := file.NewFd(fd, eventfdDescriptorName(flags), flags) + e.fdState().set(fd, fdFile) + ep.File = fdFile + } + ep.Comm = e.comm(eventfdEv.GetTid()) + if !e.Filter().MatchPair(ep) { + ep.Recycle() + return false + } + return true +} + +func pipeDescriptorName(flags, fd0, fd1 int32) string { + return fmt.Sprintf("pipe:%d:%d:%d", flags, fd0, fd1) +} + +func eventfdDescriptorName(flags int32) string { + return fmt.Sprintf("eventfd:%d", flags) +} + func (e *eventLoop) handleNullExit(ep *event.Pair, nullEv *types.NullEvent) bool { if ep.Is(types.SYS_ENTER_IO_URING_SETUP) { retEvent, ok := ep.ExitEv.(*types.RetEvent) |
