summaryrefslogtreecommitdiff
path: root/internal/file
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-03-24 17:56:23 +0200
committerPaul Buetow <paul@buetow.org>2025-03-24 17:56:23 +0200
commitb1d77d2d891f04b710d610b47388e431fc519a07 (patch)
treeb3dadfba583df771b397f1be23b56e5389bf0fcb /internal/file
parent63470be96bb8c8d5c2c1f9949d86bbcbd4149c12 (diff)
initial dup
Diffstat (limited to 'internal/file')
-rw-r--r--internal/file/file.go21
1 files changed, 16 insertions, 5 deletions
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 {