-
Notifications
You must be signed in to change notification settings - Fork 102
/
Copy pathinternal.go
53 lines (47 loc) · 1.04 KB
/
internal.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
package internal
import (
"io"
"os"
"strings"
)
// Sync performs an fsync on the given path. Typically used for directories.
func Sync(path string) error {
f, err := os.Open(path)
if err != nil {
return err
}
defer func() { _ = f.Close() }()
if err := f.Sync(); err != nil {
return err
}
return f.Close()
}
// ReadFullAt is an implementation of io.ReadFull() but for io.ReaderAt.
func ReadFullAt(r io.ReaderAt, buf []byte, off int64) (n int, err error) {
for n < len(buf) && err == nil {
var nn int
nn, err = r.ReadAt(buf[n:], off+int64(n))
n += nn
}
if n >= len(buf) {
return n, nil
} else if n > 0 && err == io.EOF {
return n, io.ErrUnexpectedEOF
}
return n, err
}
// Close closes closer but ignores select errors.
func Close(closer io.Closer) (err error) {
if closer == nil {
return nil
} else if err = closer.Close(); err == nil {
return nil
}
if strings.Contains(err.Error(), `use of closed network connection`) {
return nil
}
if strings.Contains(err.Error(), `http: Server closed`) {
return nil
}
return err
}