summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-03-24 21:37:54 +0200
committerPaul Buetow <paul@buetow.org>2025-03-24 21:37:54 +0200
commit26be49ea3cc2516ab7d26b629e7edc93a296596d (patch)
tree49f6d8730a937375a755291037b3d388abb1f0cf
parent6834a4c4094d133e771491b134e8da73a9f00a07 (diff)
parenta78769805d408308a1d85f9b2fb45a1af3450f13 (diff)
add fork testMerge branch 'main' of codeberg.org:snonux/ior
-rw-r--r--internal/eventloop.go34
-rw-r--r--internal/file/file.go23
2 files changed, 37 insertions, 20 deletions
diff --git a/internal/eventloop.go b/internal/eventloop.go
index ae3f887..f7bfa9a 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)
}
}
}()
@@ -264,21 +262,27 @@ 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)
+ 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))
+ *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")
+ 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)
+ duppedFd := fdFile.Dup(newFd)
+ *duppedFd.Flags |= syscall.O_CLOEXEC
+ e.files[newFd] = duppedFd
}
default:
diff --git a/internal/file/file.go b/internal/file/file.go
index 513212b..71b8a09 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,17 +26,19 @@ func NewFd(fd int32, name []byte, flags int32) FdFile {
return FdFile{
fd: fd,
name: stringValue(name),
- Flags: flags,
+ Flags: &flags,
}
}
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: -1,
+ Flags: &unknownFlags, // Unknown flags at this point
flagsFromFdInfo: true,
}
}
@@ -45,11 +47,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 +81,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 {