]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: add Flock_t.Lock method
authorBrad Fitzpatrick <bradfitz@golang.org>
Tue, 21 Jan 2014 22:52:44 +0000 (14:52 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 21 Jan 2014 22:52:44 +0000 (14:52 -0800)
Fixes #7059

R=golang-codereviews, iant, mikioh.mikioh
CC=golang-codereviews
https://golang.org/cl/53470043

src/pkg/syscall/consistency_unix_test.go
src/pkg/syscall/flock.go [new file with mode: 0644]
src/pkg/syscall/flock_linux_32bit.go [new file with mode: 0644]

index efab1ee84847d141e75707aebf0b105a2411eaf2..6c9fb823560d292b71f989abd0ec861c5c59ab87 100644 (file)
@@ -37,8 +37,8 @@ func _() {
        _ = syscall.Flock_t{
                Type:   int16(0),
                Whence: int16(0),
-               Start:  0,
-               Len:    0,
+               Start:  int64(0),
+               Len:    int64(0),
                Pid:    int32(0),
        }
 }
diff --git a/src/pkg/syscall/flock.go b/src/pkg/syscall/flock.go
new file mode 100644 (file)
index 0000000..5e5f8b5
--- /dev/null
@@ -0,0 +1,22 @@
+// +build linux darwin freebsd openbsd netbsd dragonfly
+
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package syscall
+
+import "unsafe"
+
+// fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux
+// systems by flock_linux_32bit.go to be SYS_FCNTL64.
+var fcntl64Syscall uintptr = SYS_FCNTL
+
+// Lock performs a fcntl syscall for F_GETLK, F_SETLK or F_SETLKW commands.
+func (lk *Flock_t) Lock(fd uintptr, cmd int) error {
+       _, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk)))
+       if errno == 0 {
+               return nil
+       }
+       return errno
+}
diff --git a/src/pkg/syscall/flock_linux_32bit.go b/src/pkg/syscall/flock_linux_32bit.go
new file mode 100644 (file)
index 0000000..500a973
--- /dev/null
@@ -0,0 +1,13 @@
+// +build linux,386 linux,arm
+
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package syscall
+
+func init() {
+       // On 32-bit Linux systems, the fcntl syscall that matches Go's
+       // Flock_t type is SYS_FCNTL64, not SYS_FCNTL.
+       fcntl64Syscall = SYS_FCNTL64
+}