82 lines
1.4 KiB
Go
82 lines
1.4 KiB
Go
// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>
|
|
// All rights reserved.
|
|
//
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// +build solaris
|
|
|
|
package storage
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
)
|
|
|
|
type unixFileLock struct {
|
|
f *os.File
|
|
}
|
|
|
|
func (fl *unixFileLock) release() error {
|
|
if err := setFileLock(fl.f, false, false); err != nil {
|
|
return err
|
|
}
|
|
return fl.f.Close()
|
|
}
|
|
|
|
func newFileLock(path string, readOnly bool) (fl fileLock, err error) {
|
|
var flag int
|
|
if readOnly {
|
|
flag = os.O_RDONLY
|
|
} else {
|
|
flag = os.O_RDWR
|
|
}
|
|
f, err := os.OpenFile(path, flag, 0)
|
|
if os.IsNotExist(err) {
|
|
f, err = os.OpenFile(path, flag|os.O_CREATE, 0644)
|
|
}
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = setFileLock(f, readOnly, true)
|
|
if err != nil {
|
|
f.Close()
|
|
return
|
|
}
|
|
fl = &unixFileLock{f: f}
|
|
return
|
|
}
|
|
|
|
func setFileLock(f *os.File, readOnly, lock bool) error {
|
|
flock := syscall.Flock_t{
|
|
Type: syscall.F_UNLCK,
|
|
Start: 0,
|
|
Len: 0,
|
|
Whence: 1,
|
|
}
|
|
if lock {
|
|
if readOnly {
|
|
flock.Type = syscall.F_RDLCK
|
|
} else {
|
|
flock.Type = syscall.F_WRLCK
|
|
}
|
|
}
|
|
return syscall.FcntlFlock(f.Fd(), syscall.F_SETLK, &flock)
|
|
}
|
|
|
|
func rename(oldpath, newpath string) error {
|
|
return os.Rename(oldpath, newpath)
|
|
}
|
|
|
|
func syncDir(name string) error {
|
|
f, err := os.Open(name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
if err := f.Sync(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|