From ec72ef1e68cdbd6938c713294dab97ecee25dc68 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Mon, 24 Mar 2025 17:22:48 +0200 Subject: fix termination of the event loop --- internal/eventloop.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'internal') diff --git a/internal/eventloop.go b/internal/eventloop.go index ae3f887..0be7b7e 100644 --- a/internal/eventloop.go +++ b/internal/eventloop.go @@ -51,7 +51,7 @@ func newEventLoop(flags flags.Flags) *eventLoop { } func (e *eventLoop) stats() string { - fmt.Println("Waiting for staps to be ready") + fmt.Println("Waiting for stats to be ready") <-e.done duration := time.Since(e.startTime) @@ -111,13 +111,11 @@ func (e *eventLoop) events(ctx context.Context, rawCh <-chan []byte) <-chan *eve continue } e.processRawEvent(raw, ch) + case <-ctx.Done(): + fmt.Println("Stopping event loop") + return default: - select { - case <-ctx.Done(): - return - default: - time.Sleep(time.Millisecond * 10) - } + time.Sleep(time.Millisecond * 10) } } }() -- cgit v1.2.3 From b1d77d2d891f04b710d610b47388e431fc519a07 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Mon, 24 Mar 2025 17:56:23 +0200 Subject: initial dup --- internal/eventloop.go | 21 +++++++++++++-------- internal/file/file.go | 21 ++++++++++++++++----- 2 files changed, 29 insertions(+), 13 deletions(-) (limited to 'internal') diff --git a/internal/eventloop.go b/internal/eventloop.go index 0be7b7e..7d13839 100644 --- a/internal/eventloop.go +++ b/internal/eventloop.go @@ -262,21 +262,26 @@ func (e *eventLoop) syscallExit(exitEv event.Event, ch chan<- *event.Pair) { break } + fdFile, ok := ev.File.(file.FdFile) + if !ok { + panic("expected a file.FdFile") + } + + // See fcntl(2) for implementation details switch v.Cmd { case syscall.F_SETFL: - fdFile, ok := ev.File.(file.FdFile) - if !ok { - panic("expected a file.FdFile") - } - // fcntl(2) canChange := syscall.O_APPEND | syscall.O_ASYNC | syscall.O_DIRECT | syscall.O_NOATIME | syscall.O_NONBLOCK - fdFile.Flags |= (int32(v.Arg) & int32(canChange)) + *fdFile.Flags |= (int32(v.Arg) & int32(canChange)) ev.File = fdFile e.files[fd] = fdFile case syscall.F_DUPFD: - fmt.Println("TODO: F_DUPFD with fcntl not yet implememented") + // TODO: Re-read dup(2), maybe they don't share the same open flags? + newFd := int32(retEvent.Ret) + e.files[newFd] = fdFile.Dup(newFd) case syscall.F_DUPFD_CLOEXEC: - fmt.Println("TODO: F_DUPFD_CLOEXEC with fcntl not yet implememented") + newFd := int32(retEvent.Ret) + e.files[newFd] = fdFile.Dup(newFd) // Also set O_CLOEXEC + fmt.Println("TODO: F_DUPFD_CLOEXEC with fcntl not yet fully implememented") } default: diff --git a/internal/file/file.go b/internal/file/file.go index 513212b..d43a79e 100644 --- a/internal/file/file.go +++ b/internal/file/file.go @@ -18,7 +18,7 @@ type File interface { type FdFile struct { fd int32 name string - Flags int32 + Flags *int32 // TODO: This must be a pointer as via dup(2) - means, we need to synchronise access as well .. use atomicint flagsFromFdInfo bool } @@ -26,7 +26,7 @@ func NewFd(fd int32, name []byte, flags int32) FdFile { return FdFile{ fd: fd, name: stringValue(name), - Flags: flags, + Flags: &flags, } } @@ -36,7 +36,7 @@ func NewFdWithPid(fd int32, pid uint32) FdFile { return FdFile{ fd: fd, name: "?", - Flags: -1, + Flags: nil, // Unknown flags at this point flagsFromFdInfo: true, } } @@ -45,11 +45,18 @@ func NewFdWithPid(fd int32, pid uint32) FdFile { return FdFile{ fd: fd, name: linkName, - Flags: flags, + Flags: &flags, flagsFromFdInfo: true, } } +func (f FdFile) Dup(fd int32) FdFile { + duppedFd := f + duppedFd.fd = fd + duppedFd.flagsFromFdInfo = false + return duppedFd +} + func readFlagsFromFdInfo(fd int32, pid uint32) (int32, error) { data, err := os.ReadFile(fmt.Sprintf("/proc/%d/fdinfo/%d", pid, fd)) if err != nil { @@ -72,7 +79,11 @@ func (f FdFile) Name() string { } func (f FdFile) FlagsString() string { - return flagsToStr(f.Flags) + var flags int32 = -1 + if f.Flags != nil { + flags = *f.Flags + } + return flagsToStr(flags) } func (f FdFile) String() string { -- cgit v1.2.3 From 375d092f4240587c7aae8dab40b2b488633c151c Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Mon, 24 Mar 2025 18:02:12 +0200 Subject: more on this --- internal/eventloop.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'internal') diff --git a/internal/eventloop.go b/internal/eventloop.go index 7d13839..90eaa7e 100644 --- a/internal/eventloop.go +++ b/internal/eventloop.go @@ -275,13 +275,13 @@ func (e *eventLoop) syscallExit(exitEv event.Event, ch chan<- *event.Pair) { ev.File = fdFile e.files[fd] = fdFile case syscall.F_DUPFD: - // TODO: Re-read dup(2), maybe they don't share the same open flags? newFd := int32(retEvent.Ret) e.files[newFd] = fdFile.Dup(newFd) case syscall.F_DUPFD_CLOEXEC: newFd := int32(retEvent.Ret) - e.files[newFd] = fdFile.Dup(newFd) // Also set O_CLOEXEC - fmt.Println("TODO: F_DUPFD_CLOEXEC with fcntl not yet fully implememented") + duppedFd := fdFile.Dup(newFd) + *duppedFd.Flags |= syscall.O_CLOEXEC + e.files[newFd] = duppedFd } default: -- cgit v1.2.3 From a78769805d408308a1d85f9b2fb45a1af3450f13 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Mon, 24 Mar 2025 18:08:34 +0200 Subject: more debugging --- internal/eventloop.go | 1 + internal/file/file.go | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'internal') diff --git a/internal/eventloop.go b/internal/eventloop.go index 90eaa7e..f7bfa9a 100644 --- a/internal/eventloop.go +++ b/internal/eventloop.go @@ -270,6 +270,7 @@ func (e *eventLoop) syscallExit(exitEv event.Event, ch chan<- *event.Pair) { // See fcntl(2) for implementation details switch v.Cmd { case syscall.F_SETFL: + fmt.Println("DEBUG", fdFile) canChange := syscall.O_APPEND | syscall.O_ASYNC | syscall.O_DIRECT | syscall.O_NOATIME | syscall.O_NONBLOCK *fdFile.Flags |= (int32(v.Arg) & int32(canChange)) ev.File = fdFile diff --git a/internal/file/file.go b/internal/file/file.go index d43a79e..71b8a09 100644 --- a/internal/file/file.go +++ b/internal/file/file.go @@ -33,10 +33,12 @@ func NewFd(fd int32, name []byte, flags int32) FdFile { func NewFdWithPid(fd int32, pid uint32) FdFile { linkName, err := os.Readlink(fmt.Sprintf("/proc/%d/fd/%d", pid, fd)) if err != nil { + fmt.Println("DEBUG", err) + var unknownFlags int32 = -1 return FdFile{ fd: fd, name: "?", - Flags: nil, // Unknown flags at this point + Flags: &unknownFlags, // Unknown flags at this point flagsFromFdInfo: true, } } -- cgit v1.2.3