-
Notifications
You must be signed in to change notification settings - Fork 0
/
dir.go
77 lines (69 loc) · 1.23 KB
/
dir.go
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
71
72
73
74
75
76
77
// Copyright 2020 The Embedded 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.
package ramfs
import (
"io"
"io/fs"
"sync"
"syscall"
)
// A dir represents an open directory
type dir struct {
name string
mu sync.Mutex // protects the fields below
n *node
pos int
closed func()
}
func (d *dir) Read(p []byte) (int, error) {
return 0, syscall.EISDIR
}
func (d *dir) Stat() (fs.FileInfo, error) {
d.mu.Lock()
fi := stat(d.n)
d.mu.Unlock()
return fi, nil
}
func (d *dir) ReadDir(n int) (de []fs.DirEntry, err error) {
d.mu.Lock()
d.n.mu.RLock()
var first *node
m := 0
for e := d.n.list; e != nil; e = e.next {
if m == d.pos {
first = e
}
m++
}
m -= d.pos
if m == 0 {
err = io.EOF
} else {
if n > 0 && m > n {
m = n
}
d.pos += m
de = make([]fs.DirEntry, m)
for i := range de {
de[i] = stat(first)
first = first.next
}
}
d.n.mu.RUnlock()
d.mu.Unlock()
return de, err
}
func (d *dir) Close() error {
var err error
d.mu.Lock()
if d.n == nil {
err = &fs.PathError{Op: "close", Path: d.name, Err: syscall.EBADF}
} else {
d.closed()
d.closed = nil
d.n = nil
}
d.mu.Unlock()
return err
}