...
Source file src/pkg/cmd/go/internal/lockedfile/lockedfile_filelock.go
1
2
3
4
5
6
7 package lockedfile
8
9 import (
10 "os"
11
12 "cmd/go/internal/lockedfile/internal/filelock"
13 )
14
15 func openFile(name string, flag int, perm os.FileMode) (*os.File, error) {
16
17
18
19
20
21 f, err := os.OpenFile(name, flag&^os.O_TRUNC, perm)
22 if err != nil {
23 return nil, err
24 }
25
26 switch flag & (os.O_RDONLY | os.O_WRONLY | os.O_RDWR) {
27 case os.O_WRONLY, os.O_RDWR:
28 err = filelock.Lock(f)
29 default:
30 err = filelock.RLock(f)
31 }
32 if err != nil {
33 f.Close()
34 return nil, err
35 }
36
37 if flag&os.O_TRUNC == os.O_TRUNC {
38 if err := f.Truncate(0); err != nil {
39
40
41
42
43 if fi, statErr := f.Stat(); statErr != nil || fi.Mode().IsRegular() {
44 filelock.Unlock(f)
45 f.Close()
46 return nil, err
47 }
48 }
49 }
50
51 return f, nil
52 }
53
54 func closeFile(f *os.File) error {
55
56
57
58 err := filelock.Unlock(f)
59
60 if closeErr := f.Close(); err == nil {
61 err = closeErr
62 }
63 return err
64 }
65
View as plain text