summaryrefslogtreecommitdiff
path: root/internal/file
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-04-06 23:03:54 +0300
committerPaul Buetow <paul@buetow.org>2025-04-06 23:03:54 +0300
commit138c0f9b6255ed61eee8390674c026daa23eddc5 (patch)
treee2d2494e8ce14fb0e504216cc6cb7a4eefed04ad /internal/file
parent95e3477875c0e31e0c6907ab6afe4ce48fb37391 (diff)
refactor
Diffstat (limited to 'internal/file')
-rw-r--r--internal/file/file.go67
-rw-r--r--internal/file/flags.go47
2 files changed, 62 insertions, 52 deletions
diff --git a/internal/file/file.go b/internal/file/file.go
index 9754520..11d992d 100644
--- a/internal/file/file.go
+++ b/internal/file/file.go
@@ -12,24 +12,23 @@ import (
type File interface {
String() string
Name() string
- FlagsString() string
+ Flags() Flags
}
type FdFile struct {
fd int32
name string
- Flags int32
+ flags Flags
flagsFromProcFS bool
- unknownFlags bool
}
func NewFd(fd int32, name []byte, flags int32) FdFile {
f := FdFile{
fd: fd,
name: stringValue(name),
- Flags: flags,
+ flags: Flags(flags),
}
- if f.Flags == -1 {
+ if f.flags == -1 {
panic(fmt.Sprintf("DEBUG with -1 flags: %v", f))
}
return f
@@ -41,17 +40,11 @@ func NewFdWithPid(fd int32, pid uint32) (f FdFile) {
procPath := fmt.Sprintf("/proc/%d/fd/%d", pid, fd)
f.name, err = os.Readlink(procPath)
if err != nil {
- // fmt.Println("DEBUGXXX", procPath)
f.name = ""
}
- f.Flags, err = readFlagsFromFdInfo(fd, pid)
- if err != nil {
- f.unknownFlags = true
- f.Flags = 0
- } else {
- f.flagsFromProcFS = true
- }
+ f.flags, _ = readFlagsFromFdInfo(fd, pid)
+ f.flagsFromProcFS = true
return f
}
@@ -62,10 +55,17 @@ func (f FdFile) Dup(fd int32) FdFile {
return dupFd
}
-func readFlagsFromFdInfo(fd int32, pid uint32) (int32, error) {
+func (f FdFile) DupAddFlags(fd, flags int32) FdFile {
+ dupFd := f
+ dupFd.fd = fd
+ dupFd.flags = Flags(int32(dupFd.flags) | flags)
+ return dupFd
+}
+
+func readFlagsFromFdInfo(fd int32, pid uint32) (Flags, error) {
data, err := os.ReadFile(fmt.Sprintf("/proc/%d/fdinfo/%d", pid, fd))
if err != nil {
- return 0, err
+ return unknownFlag, err
}
scanner := bufio.NewScanner(bytes.NewReader(data))
for scanner.Scan() {
@@ -73,10 +73,10 @@ func readFlagsFromFdInfo(fd int32, pid uint32) (int32, error) {
if strings.HasPrefix(line, "flags:") {
flagsStr := strings.Fields(line)[1]
flags, err := strconv.ParseUint(flagsStr, 8, 32)
- return int32(flags), err
+ return Flags(flags), err
}
}
- return 0, scanner.Err()
+ return unknownFlag, scanner.Err()
}
func (f FdFile) Name() string {
@@ -94,27 +94,18 @@ func (f FdFile) String() string {
sb.WriteString("%(")
sb.WriteString(strconv.FormatInt(int64(f.fd), 10))
sb.WriteString(",")
- sb.WriteString(f.FlagsString())
+ sb.WriteString(f.Flags().String())
sb.WriteString(")")
return sb.String()
}
-func (f FdFile) FlagsString() string {
- var sb strings.Builder
-
- if f.unknownFlags {
- sb.WriteString("U") // Unknown
- }
- if f.flagsFromProcFS {
- sb.WriteString("P") // ProcFS
- }
- if f.unknownFlags || f.flagsFromProcFS {
- sb.WriteString(":flags") // ProcFS
- }
+func (f FdFile) Flags() Flags {
+ return f.flags
+}
- flagsToStr(&sb, f.Flags)
- return sb.String()
+func (f *FdFile) AddFlags(flags int32) {
+ f.flags = Flags(int32(f.flags) | flags)
}
type oldnameNewnameFile struct {
@@ -129,8 +120,8 @@ func (f oldnameNewnameFile) Name() string {
return f.Newname
}
-func (f oldnameNewnameFile) FlagsString() string {
- return ""
+func (f oldnameNewnameFile) Flags() Flags {
+ return unknownFlag
}
func (f oldnameNewnameFile) String() string {
@@ -141,7 +132,7 @@ func (f oldnameNewnameFile) String() string {
sb.WriteString(" ->new:")
sb.WriteString(f.Newname)
sb.WriteString("%(")
- sb.WriteString(f.FlagsString())
+ sb.WriteString(f.Flags().String())
sb.WriteString(")")
return sb.String()
@@ -159,8 +150,8 @@ func (f pathnameFile) Name() string {
return f.Pathname
}
-func (f pathnameFile) FlagsString() string {
- return ""
+func (f pathnameFile) Flags() Flags {
+ return unknownFlag
}
func (f pathnameFile) String() string {
@@ -169,7 +160,7 @@ func (f pathnameFile) String() string {
sb.WriteString("pathname:")
sb.WriteString(f.Pathname)
sb.WriteString("%(")
- sb.WriteString(f.FlagsString())
+ sb.WriteString(f.Flags().String())
sb.WriteString(")")
return sb.String()
diff --git a/internal/file/flags.go b/internal/file/flags.go
index 85c73ce..f03d904 100644
--- a/internal/file/flags.go
+++ b/internal/file/flags.go
@@ -1,13 +1,15 @@
package file
import (
- "fmt"
"os"
"strings"
"syscall"
)
-var flagsToHumanCache = map[int32]string{}
+type Flags int32
+
+var flagsToHumanCache = map[Flags]string{}
+var unknownFlag = Flags(-1)
type tuple struct {
syscallNr int
@@ -15,6 +17,7 @@ type tuple struct {
}
var flagsToHuman = []tuple{
+ {-1, "O_NONE"},
{syscall.O_RDONLY, "O_RDONLY"},
{syscall.O_WRONLY, "O_WRONLY"},
{syscall.O_RDWR, "O_RDWR"},
@@ -35,29 +38,45 @@ var flagsToHuman = []tuple{
{syscall.O_TRUNC, "O_TRUNC"},
}
-func flagsToStr(sb *strings.Builder, flags int32) {
- if str, ok := flagsToHumanCache[flags]; ok {
+func (f Flags) Is(flag int) bool {
+ if f == unknownFlag {
+ return false
+ }
+ if int(f)&flag == flag {
+ return true
+ }
+ return false
+}
+
+func (f Flags) BuildString(sb *strings.Builder) {
+ if str, ok := flagsToHumanCache[f]; ok {
sb.WriteString(str)
return
}
- str := strings.Join(flagsToStrs(flags), "|")
- flagsToHumanCache[flags] = fmt.Sprintf("%O=>%s", flags, str)
+ str := f.String()
+ flagsToHumanCache[f] = str
sb.WriteString(str)
}
-func flagsToStrs(flags int32) (result []string) {
+func (f Flags) String() string {
+ var strs []string
+
+ if f == -1 {
+ return "O_NONE"
+ }
- if int(flags)&(os.O_WRONLY|os.O_RDWR) == 0 {
+ if int(f)&(os.O_WRONLY|os.O_RDWR) == 0 {
// Must be read only then
- result = append(result, "O_RDONLY")
+ strs = append(strs, "O_RDONLY")
}
for _, toHuman := range flagsToHuman[1:] {
- if int(flags)&toHuman.syscallNr == toHuman.syscallNr {
- result = append(result, toHuman.str)
+ if int(f)&toHuman.syscallNr == toHuman.syscallNr {
+ strs = append(strs, toHuman.str)
}
}
- if len(result) == 0 {
- result = append(result, "non=>O_RDONLY")
+ if len(strs) == 0 {
+ strs = append(strs, "O_RDONLY")
}
- return
+
+ return strings.Join(strs, "|")
}