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