...
1
2
3
4
5
6
7 package storage
8
9 import (
10 "os"
11 )
12
13 type plan9FileLock struct {
14 f *os.File
15 }
16
17 func (fl *plan9FileLock) release() error {
18 return fl.f.Close()
19 }
20
21 func newFileLock(path string, readOnly bool) (fl fileLock, err error) {
22 var (
23 flag int
24 perm os.FileMode
25 )
26 if readOnly {
27 flag = os.O_RDONLY
28 } else {
29 flag = os.O_RDWR
30 perm = os.ModeExclusive
31 }
32 f, err := os.OpenFile(path, flag, perm)
33 if os.IsNotExist(err) {
34 f, err = os.OpenFile(path, flag|os.O_CREATE, perm|0644)
35 }
36 if err != nil {
37 return
38 }
39 fl = &plan9FileLock{f: f}
40 return
41 }
42
43 func rename(oldpath, newpath string) error {
44 if _, err := os.Stat(newpath); err == nil {
45 if err := os.Remove(newpath); err != nil {
46 return err
47 }
48 }
49
50 return os.Rename(oldpath, newpath)
51 }
52
53 func syncDir(name string) error {
54 f, err := os.Open(name)
55 if err != nil {
56 return err
57 }
58 defer f.Close()
59 if err := f.Sync(); err != nil {
60 return err
61 }
62 return nil
63 }
64
View as plain text