1 // Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>
2 // All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
7 // +build darwin dragonfly freebsd linux netbsd openbsd
16 type unixFileLock struct {
20 func (fl *unixFileLock) release() error {
21 if err := setFileLock(fl.f, false, false); err != nil {
27 func newFileLock(path string, readOnly bool) (fl fileLock, err error) {
34 f, err := os.OpenFile(path, flag, 0)
35 if os.IsNotExist(err) {
36 f, err = os.OpenFile(path, flag|os.O_CREATE, 0644)
41 err = setFileLock(f, readOnly, true)
46 fl = &unixFileLock{f: f}
50 func setFileLock(f *os.File, readOnly, lock bool) error {
51 how := syscall.LOCK_UN
59 return syscall.Flock(int(f.Fd()), how|syscall.LOCK_NB)
62 func rename(oldpath, newpath string) error {
63 return os.Rename(oldpath, newpath)
66 func isErrInvalid(err error) bool {
67 if err == os.ErrInvalid {
70 if syserr, ok := err.(*os.SyscallError); ok && syserr.Err == syscall.EINVAL {
76 func syncDir(name string) error {
77 f, err := os.Open(name)
82 if err := f.Sync(); err != nil && !isErrInvalid(err) {