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.
12 func (file
*File
) readdir(n
int, mode readdirMode
) (names
[]string, dirents
[]DirEntry
, infos
[]FileInfo
, err error
) {
13 // If this file has no dirinfo, create one.
14 if file
.dirinfo
== nil {
15 file
.dirinfo
= new(dirInfo
)
24 // Refill the buffer if necessary.
26 nb
, err
:= file
.Read(d
.buf
[:])
28 // Update the buffer state before checking for errors.
29 d
.bufp
, d
.nbuf
= 0, nb
35 return names
, dirents
, infos
, &PathError
{Op
: "readdir", Path
: file
.name
, Err
: err
}
37 if nb
< syscall
.STATFIXLEN
{
38 return names
, dirents
, infos
, &PathError
{Op
: "readdir", Path
: file
.name
, Err
: syscall
.ErrShortStat
}
42 // Get a record from the buffer.
44 m
:= int(uint16(b
[0])|
uint16(b
[1])<<8) + 2
45 if m
< syscall
.STATFIXLEN
{
46 return names
, dirents
, infos
, &PathError
{Op
: "readdir", Path
: file
.name
, Err
: syscall
.ErrShortStat
}
49 dir
, err
:= syscall
.UnmarshalDir(b
[:m
])
51 return names
, dirents
, infos
, &PathError
{Op
: "readdir", Path
: file
.name
, Err
: err
}
54 if mode
== readdirName
{
55 names
= append(names
, dir
.Name
)
57 f
:= fileInfoFromStat(dir
)
58 if mode
== readdirDirEntry
{
59 dirents
= append(dirents
, dirEntry
{f
})
61 infos
= append(infos
, f
)
68 if n
> 0 && len(names
)+len(dirents
)+len(infos
) == 0 {
69 return nil, nil, nil, io
.EOF
71 return names
, dirents
, infos
, nil
74 type dirEntry
struct {
78 func (de dirEntry
) Name() string { return de
.fs
.Name() }
79 func (de dirEntry
) IsDir() bool { return de
.fs
.IsDir() }
80 func (de dirEntry
) Type() FileMode
{ return de
.fs
.Mode().Type() }
81 func (de dirEntry
) Info() (FileInfo
, error
) { return de
.fs
, nil }