github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/syndtr/goleveldb/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 "path/filepath" 12 ) 13 14 type plan9FileLock struct { 15 f *os.File 16 } 17 18 func (fl *plan9FileLock) release() error { 19 return fl.f.Close() 20 } 21 22 func newFileLock(path string, readOnly bool) (fl fileLock, err error) { 23 var ( 24 flag int 25 perm os.FileMode 26 ) 27 if readOnly { 28 flag = os.O_RDONLY 29 } else { 30 flag = os.O_RDWR 31 perm = os.ModeExclusive 32 } 33 f, err := os.OpenFile(path, flag, perm) 34 if os.IsNotExist(err) { 35 f, err = os.OpenFile(path, flag|os.O_CREATE, perm|0644) 36 } 37 if err != nil { 38 return 39 } 40 fl = &plan9FileLock{f: f} 41 return 42 } 43 44 func rename(oldpath, newpath string) error { 45 if _, err := os.Stat(newpath); err == nil { 46 if err := os.Remove(newpath); err != nil { 47 return err 48 } 49 } 50 51 _, fname := filepath.Split(newpath) 52 return os.Rename(oldpath, fname) 53 } 54 55 func syncDir(name string) error { 56 f, err := os.Open(name) 57 if err != nil { 58 return err 59 } 60 defer f.Close() 61 if err := f.Sync(); err != nil { 62 return err 63 } 64 return nil 65 }