1//go:build dragonfly
2
3package dirent
4
5import (
6 "os"
7 "syscall"
8 "unsafe"
9)
10
11func direntIno(buf []byte) (uint64, bool) {
12 return readInt(buf, unsafe.Offsetof(syscall.Dirent{}.Fileno), unsafe.Sizeof(syscall.Dirent{}.Fileno))
13}
14
15func direntReclen(buf []byte) (uint64, bool) {
16 namlen, ok := direntNamlen(buf)
17 if !ok {
18 return 0, false
19 }
20 return (16 + namlen + 1 + 7) &^ 7, true
21}
22
23func direntNamlen(buf []byte) (uint64, bool) {
24 return readInt(buf, unsafe.Offsetof(syscall.Dirent{}.Namlen), unsafe.Sizeof(syscall.Dirent{}.Namlen))
25}
26
27func direntType(buf []byte) os.FileMode {
28 off := unsafe.Offsetof(syscall.Dirent{}.Type)
29 if off >= uintptr(len(buf)) {
30 return ^os.FileMode(0) // unknown
31 }
32 typ := buf[off]
33 switch typ {
34 case syscall.DT_BLK:
35 return os.ModeDevice
36 case syscall.DT_CHR:
37 return os.ModeDevice | os.ModeCharDevice
38 case syscall.DT_DBF:
39 // DT_DBF is "database record file".
40 // fillFileStatFromSys treats as regular file.
41 return 0
42 case syscall.DT_DIR:
43 return os.ModeDir
44 case syscall.DT_FIFO:
45 return os.ModeNamedPipe
46 case syscall.DT_LNK:
47 return os.ModeSymlink
48 case syscall.DT_REG:
49 return 0
50 case syscall.DT_SOCK:
51 return os.ModeSocket
52 }
53 return ^os.FileMode(0) // unknown
54}