// Copyright 2020 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package os import ( "syscall" "unsafe" ) func direntIno(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(syscall.Dirent{}.Fileno), unsafe.Sizeof(syscall.Dirent{}.Fileno)) } func direntReclen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(syscall.Dirent{}.Reclen), unsafe.Sizeof(syscall.Dirent{}.Reclen)) } func direntNamlen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(syscall.Dirent{}.Namlen), unsafe.Sizeof(syscall.Dirent{}.Namlen)) } func direntType(buf []byte) FileMode { off := unsafe.Offsetof(syscall.Dirent{}.Type) if off >= uintptr(len(buf)) { return ^FileMode(0) // unknown } typ := buf[off] switch typ { case syscall.DT_BLK: return ModeDevice case syscall.DT_CHR: return ModeDevice | ModeCharDevice case syscall.DT_DIR: return ModeDir case syscall.DT_FIFO: return ModeNamedPipe case syscall.DT_LNK: return ModeSymlink case syscall.DT_REG: return 0 case syscall.DT_SOCK: return ModeSocket } return ^FileMode(0) // unknown }