summaryrefslogtreecommitdiff
path: root/src/os/dir_unix.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/os/dir_unix.go')
-rw-r--r--src/os/dir_unix.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/os/dir_unix.go b/src/os/dir_unix.go
new file mode 100644
index 000000000..d353e405e
--- /dev/null
+++ b/src/os/dir_unix.go
@@ -0,0 +1,58 @@
+// Copyright 2009 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.
+
+// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
+
+package os
+
+import (
+ "io"
+ "syscall"
+)
+
+const (
+ blockSize = 4096
+)
+
+func (f *File) readdirnames(n int) (names []string, err error) {
+ // If this file has no dirinfo, create one.
+ if f.dirinfo == nil {
+ f.dirinfo = new(dirInfo)
+ // The buffer must be at least a block long.
+ f.dirinfo.buf = make([]byte, blockSize)
+ }
+ d := f.dirinfo
+
+ size := n
+ if size <= 0 {
+ size = 100
+ n = -1
+ }
+
+ names = make([]string, 0, size) // Empty with room to grow.
+ for n != 0 {
+ // Refill the buffer if necessary
+ if d.bufp >= d.nbuf {
+ d.bufp = 0
+ var errno error
+ d.nbuf, errno = syscall.ReadDirent(f.fd, d.buf)
+ if errno != nil {
+ return names, NewSyscallError("readdirent", errno)
+ }
+ if d.nbuf <= 0 {
+ break // EOF
+ }
+ }
+
+ // Drain the buffer
+ var nb, nc int
+ nb, nc, names = syscall.ParseDirent(d.buf[d.bufp:d.nbuf], n, names)
+ d.bufp += nb
+ n -= nc
+ }
+ if n >= 0 && len(names) == 0 {
+ return names, io.EOF
+ }
+ return names, nil
+}