diff options
| author | Paul Buetow <paul@buetow.org> | 2025-04-06 23:03:54 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-04-06 23:03:54 +0300 |
| commit | 138c0f9b6255ed61eee8390674c026daa23eddc5 (patch) | |
| tree | e2d2494e8ce14fb0e504216cc6cb7a4eefed04ad /internal/file | |
| parent | 95e3477875c0e31e0c6907ab6afe4ce48fb37391 (diff) | |
refactor
Diffstat (limited to 'internal/file')
| -rw-r--r-- | internal/file/file.go | 67 | ||||
| -rw-r--r-- | internal/file/flags.go | 47 |
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, "|") } |
