...
Source file src/pkg/os/removeall_noat.go
1
2
3
4
5
6
7 package os
8
9 import (
10 "io"
11 "syscall"
12 )
13
14 func removeAll(path string) error {
15 if path == "" {
16
17
18 return nil
19 }
20
21
22
23
24 if endsWithDot(path) {
25 return &PathError{"RemoveAll", path, syscall.EINVAL}
26 }
27
28
29 err := Remove(path)
30 if err == nil || IsNotExist(err) {
31 return nil
32 }
33
34
35 dir, serr := Lstat(path)
36 if serr != nil {
37 if serr, ok := serr.(*PathError); ok && (IsNotExist(serr.Err) || serr.Err == syscall.ENOTDIR) {
38 return nil
39 }
40 return serr
41 }
42 if !dir.IsDir() {
43
44 return err
45 }
46
47
48 err = nil
49 for {
50 fd, err := Open(path)
51 if err != nil {
52 if IsNotExist(err) {
53
54 return nil
55 }
56 return err
57 }
58
59 const reqSize = 1024
60 var names []string
61 var readErr error
62
63 for {
64 numErr := 0
65 names, readErr = fd.Readdirnames(reqSize)
66
67 for _, name := range names {
68 err1 := RemoveAll(path + string(PathSeparator) + name)
69 if err == nil {
70 err = err1
71 }
72 if err1 != nil {
73 numErr++
74 }
75 }
76
77
78
79 if numErr != reqSize {
80 break
81 }
82 }
83
84
85
86
87
88
89 fd.Close()
90
91 if readErr == io.EOF {
92 break
93 }
94
95 if err == nil {
96 err = readErr
97 }
98 if len(names) == 0 {
99 break
100 }
101
102
103
104
105
106 if len(names) < reqSize {
107 err1 := Remove(path)
108 if err1 == nil || IsNotExist(err1) {
109 return nil
110 }
111
112 if err != nil {
113
114
115
116
117
118
119
120 return err
121 }
122 }
123 }
124
125
126 err1 := Remove(path)
127 err1 = removeAllTestHook(err1)
128 if err1 == nil || IsNotExist(err1) {
129 return nil
130 }
131 if err == nil {
132 err = err1
133 }
134 return err
135 }
136
View as plain text