Skip to content
This repository has been archived by the owner on Oct 16, 2020. It is now read-only.

etc doesn't compile on Solaris #335

Closed
akolb1 opened this issue Apr 23, 2015 · 0 comments
Closed

etc doesn't compile on Solaris #335

akolb1 opened this issue Apr 23, 2015 · 0 comments

Comments

@akolb1
Copy link

akolb1 commented Apr 23, 2015

An attempt to compile etc on solaris fails:

github.com/coreos/etcd/pkg/fileutil

gopath/src/github.com/coreos/etcd/pkg/fileutil/lock_unix.go:48: undefined: syscall.Flock
gopath/src/github.com/coreos/etcd/pkg/fileutil/lock_unix.go:48: undefined: syscall.LOCK_EX
gopath/src/github.com/coreos/etcd/pkg/fileutil/lock_unix.go:48: undefined: syscall.LOCK_NB
gopath/src/github.com/coreos/etcd/pkg/fileutil/lock_unix.go:57: undefined: syscall.Flock
gopath/src/github.com/coreos/etcd/pkg/fileutil/lock_unix.go:57: undefined: syscall.LOCK_EX
gopath/src/github.com/coreos/etcd/pkg/fileutil/lock_unix.go:62: undefined: syscall.Flock
gopath/src/github.com/coreos/etcd/pkg/fileutil/lock_unix.go:62: undefined: syscall.LOCK_UN

The problem is that Solaris doesn't have flock. Instead we should use fcntl.

The following patch fixes the problem by introducing flock-based lock on Solaris:

--- /dev/null
+++ b/pkg/fileutil/lock_solaris.go
@@ -0,0 +1,95 @@
+// Copyright 2015 CoreOS, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// +build solaris
+
+package fileutil
+
+import (
+       "errors"
+       "os"
+       "syscall"
+)
+
+var (
+       ErrLocked = errors.New("file already locked")
+)
+
+type Lock interface {
+       Name() string
+       TryLock() error
+       Lock() error
+       Unlock() error
+       Destroy() error
+}
+
+type lock struct {
+       fd   int
+       file *os.File
+}
+
+func (l *lock) Name() string {
+       return l.file.Name()
+}
+
+// TryLock acquires exclusivity on the lock without blocking
+func (l *lock) TryLock() error {
+       var lock syscall.Flock_t
+       lock.Start = 0
+       lock.Len = 0
+       lock.Type = syscall.F_WRLCK
+       lock.Whence = 0
+       return syscall.FcntlFlock(uintptr(l.fd), syscall.F_SETLK, &lock)
+}
+
+// Unlock unlocks the lock
+func (l *lock) Unlock() error {
+       var lock syscall.Flock_t
+       lock.Start = 0
+       lock.Len = 0
+       lock.Type = syscall.F_UNLCK
+       lock.Whence = 0
+       err := syscall.FcntlFlock(uintptr(l.fd), syscall.F_SETLK, &lock)
+       if err != nil && err == syscall.EAGAIN {
+               return ErrLocked
+       }
+       return err
+}
+
+func (l *lock) Destroy() error {
+       return l.file.Close()
+}
+
+func NewLock(file string) (Lock, error) {
+       f, err := os.Open(file)
+       if err != nil {
+               return nil, err
+       }
+       l := &lock{int(f.Fd()), f}
+       return l, nil
+}
diff --git a/pkg/fileutil/lock_unix.go b/pkg/fileutil/lock_unix.go
index ce7bc9d..f6e69cc 100644
--- a/pkg/fileutil/lock_unix.go
+++ b/pkg/fileutil/lock_unix.go
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.

-// +build !windows,!plan9
+// +build !windows,!plan9,!solaris

 package fileutil
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

2 participants