OSDN Git Service

new repo
[bytom/vapor.git] / vendor / github.com / syndtr / goleveldb / leveldb / storage / file_storage_solaris.go
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 // +build solaris
8
9 package storage
10
11 import (
12         "os"
13         "syscall"
14 )
15
16 type unixFileLock struct {
17         f *os.File
18 }
19
20 func (fl *unixFileLock) release() error {
21         if err := setFileLock(fl.f, false, false); err != nil {
22                 return err
23         }
24         return fl.f.Close()
25 }
26
27 func newFileLock(path string, readOnly bool) (fl fileLock, err error) {
28         var flag int
29         if readOnly {
30                 flag = os.O_RDONLY
31         } else {
32                 flag = os.O_RDWR
33         }
34         f, err := os.OpenFile(path, flag, 0)
35         if os.IsNotExist(err) {
36                 f, err = os.OpenFile(path, flag|os.O_CREATE, 0644)
37         }
38         if err != nil {
39                 return
40         }
41         err = setFileLock(f, readOnly, true)
42         if err != nil {
43                 f.Close()
44                 return
45         }
46         fl = &unixFileLock{f: f}
47         return
48 }
49
50 func setFileLock(f *os.File, readOnly, lock bool) error {
51         flock := syscall.Flock_t{
52                 Type:   syscall.F_UNLCK,
53                 Start:  0,
54                 Len:    0,
55                 Whence: 1,
56         }
57         if lock {
58                 if readOnly {
59                         flock.Type = syscall.F_RDLCK
60                 } else {
61                         flock.Type = syscall.F_WRLCK
62                 }
63         }
64         return syscall.FcntlFlock(f.Fd(), syscall.F_SETLK, &flock)
65 }
66
67 func rename(oldpath, newpath string) error {
68         return os.Rename(oldpath, newpath)
69 }
70
71 func syncDir(name string) error {
72         f, err := os.Open(name)
73         if err != nil {
74                 return err
75         }
76         defer f.Close()
77         if err := f.Sync(); err != nil {
78                 return err
79         }
80         return nil
81 }