lin
2025-06-05 ed3dd9d3e7519a82bb871d5eedb24a2fa0c91f47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// 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 aix darwin,!arm,!arm64 dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris
 
package os
 
import (
   "io"
   "runtime"
   "syscall"
)
 
// Auxiliary information if the File describes a directory
type dirInfo struct {
   buf  []byte // buffer for directory I/O
   nbuf int    // length of buf; return value from Getdirentries
   bufp int    // location of next record in buf.
}
 
const (
   // More than 5760 to work around https://golang.org/issue/24015.
   blockSize = 8192
)
 
func (d *dirInfo) close() {}
 
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 = f.pfd.ReadDirent(d.buf)
           runtime.KeepAlive(f)
           if errno != nil {
               return names, wrapSyscallError("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
}