github.com/df-mc/goleveldb@v1.1.9/leveldb/storage/file_storage_plan9.go (about) 1 // Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com> 2 // All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style license that can be 5 // found in the LICENSE file. 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 }