diff options
| author | Paul Buetow <paul@buetow.org> | 2025-03-24 17:56:23 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-03-24 17:56:23 +0200 |
| commit | b1d77d2d891f04b710d610b47388e431fc519a07 (patch) | |
| tree | b3dadfba583df771b397f1be23b56e5389bf0fcb | |
| parent | 63470be96bb8c8d5c2c1f9949d86bbcbd4149c12 (diff) | |
initial dup
| -rw-r--r-- | internal/eventloop.go | 21 | ||||
| -rw-r--r-- | internal/file/file.go | 21 |
2 files changed, 29 insertions, 13 deletions
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 { |
