blob: 352ca5590d13f494cc25a6e5b3cf8c1b16547d04 [file] [log] [blame]
khenaidooab1f7bd2019-11-14 14:00:27 -05001// Copyright 2015 The etcd Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// +build solaris
16
17package fileutil
18
19import (
20 "os"
21 "syscall"
22)
23
24func TryLockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) {
25 var lock syscall.Flock_t
26 lock.Start = 0
27 lock.Len = 0
28 lock.Pid = 0
29 lock.Type = syscall.F_WRLCK
30 lock.Whence = 0
31 lock.Pid = 0
32 f, err := os.OpenFile(path, flag, perm)
33 if err != nil {
34 return nil, err
35 }
36 if err := syscall.FcntlFlock(f.Fd(), syscall.F_SETLK, &lock); err != nil {
37 f.Close()
38 if err == syscall.EAGAIN {
39 err = ErrLocked
40 }
41 return nil, err
42 }
43 return &LockedFile{f}, nil
44}
45
46func LockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) {
47 var lock syscall.Flock_t
48 lock.Start = 0
49 lock.Len = 0
50 lock.Pid = 0
51 lock.Type = syscall.F_WRLCK
52 lock.Whence = 0
53 f, err := os.OpenFile(path, flag, perm)
54 if err != nil {
55 return nil, err
56 }
57 if err = syscall.FcntlFlock(f.Fd(), syscall.F_SETLKW, &lock); err != nil {
58 f.Close()
59 return nil, err
60 }
61 return &LockedFile{f}, nil
62}