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  }