github.com/golang-haiku/go-1.4.3@v0.0.0-20190609233734-1f5ae41cc308/src/os/dir_haiku.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package os 6 7 import "syscall" 8 import "unsafe" 9 10 func clen(n []byte) int { 11 for i := 0; i < len(n); i++ { 12 if n[i] == 0 { 13 return i 14 } 15 } 16 return len(n) 17 } 18 19 func (file *File) readdirnames(n int) (names []string, err error) { 20 size := n 21 if size <= 0 { 22 size = 100 23 n = -1 24 } 25 26 names = make([]string, 0, size) // Empty with room to grow. 27 28 dirfd, err := syscall.Dup(file.fd) 29 if err != nil { 30 return names, err 31 } 32 dir, err := syscall.Fdopendir(dirfd) 33 if err != nil { 34 return names, err 35 } 36 defer syscall.Closedir(dir) 37 var result *syscall.Dirent = nil 38 entry := syscall.Dirent{} 39 for n != 0 { 40 status := syscall.Readdir_r(dir, &entry, &result) 41 if status != 0 { 42 return names, syscall.Errno(status) 43 } 44 if result == nil { 45 break 46 } 47 if result.Ino == 0 { // File absent in directory 48 continue 49 } 50 bytes := (*[10000]byte)(unsafe.Pointer(&result.Name[0])) 51 name := string(bytes[0:clen(bytes[:])]) 52 if name == "." || name == ".." { 53 // considered "Useless names" by ParseDirent 54 continue 55 } 56 names = append(names, name) 57 n-- 58 } 59 return names, err 60 }