summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-05-19 17:47:57 -0700
committerRuss Cox <rsc@golang.org>2010-05-19 17:47:57 -0700
commit94b3292622846b33dafe15d32d2b20cd2ce1fbef (patch)
tree2fd3111eff2c99cd45e4a5dd459ee4adbed688dc
parentc94d037cd17b64739dd53ea17d170d100965aa00 (diff)
downloadgolang-94b3292622846b33dafe15d32d2b20cd2ce1fbef.tar.gz
syscall: add Utimes on Darwin/FreeBSD, add Futimes everywhere
Needed for CL 1103041 and beyond. R=adg, bradfitzpatrick CC=bradfitz, golang-dev http://codereview.appspot.com/1172042
-rwxr-xr-xsrc/pkg/syscall/mkall.sh8
-rw-r--r--src/pkg/syscall/syscall_bsd.go22
-rw-r--r--src/pkg/syscall/syscall_linux.go10
-rw-r--r--src/pkg/syscall/zsyscall_darwin_386.go12
-rw-r--r--src/pkg/syscall/zsyscall_darwin_amd64.go12
-rw-r--r--src/pkg/syscall/zsyscall_linux_386.go4
-rw-r--r--src/pkg/syscall/zsyscall_linux_amd64.go4
7 files changed, 62 insertions, 10 deletions
diff --git a/src/pkg/syscall/mkall.sh b/src/pkg/syscall/mkall.sh
index 0b4519adf..12d8c3310 100755
--- a/src/pkg/syscall/mkall.sh
+++ b/src/pkg/syscall/mkall.sh
@@ -164,7 +164,13 @@ esac
(
if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >zerrors_$GOOSARCH.go"; fi
- if [ -n "$mksyscall" ]; then echo "$mksyscall syscall_$GOOS.go syscall_$GOOSARCH.go |gofmt >zsyscall_$GOOSARCH.go"; fi
+ syscall_goos="syscall_$GOOS.go"
+ case "$GOOS" in
+ darwin | freebsd)
+ syscall_goos="syscall_bsd.go $syscall_goos"
+ ;;
+ esac
+ if [ -n "$mksyscall" ]; then echo "$mksyscall $syscall_goos syscall_$GOOSARCH.go |gofmt >zsyscall_$GOOSARCH.go"; fi
if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi
if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.c |gofmt >ztypes_$GOOSARCH.go"; fi
) | $run
diff --git a/src/pkg/syscall/syscall_bsd.go b/src/pkg/syscall/syscall_bsd.go
index cb7264863..332afa4bf 100644
--- a/src/pkg/syscall/syscall_bsd.go
+++ b/src/pkg/syscall/syscall_bsd.go
@@ -451,9 +451,27 @@ func SysctlUint32(name string) (value uint32, errno int) {
return *(*uint32)(unsafe.Pointer(&buf[0])), 0
}
+//sys utimes(path string, timeval *[2]Timeval) (errno int)
+func Utimes(path string, tv []Timeval) (errno int) {
+ if len(tv) != 2 {
+ return EINVAL
+ }
+ return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
+}
+
+//sys futimes(fd int, timeval *[2]Timeval) (errno int)
+func Futimes(fd int, tv []Timeval) (errno int) {
+ if len(tv) != 2 {
+ return EINVAL
+ }
+ return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
+}
+
+//sys fcntl(fd int, cmd int, arg int) (val int, errno int)
+
+
// TODO: wrap
// Acct(name nil-string) (errno int)
-// Futimes(fd int, timeval *Timeval) (errno int) // Pointer to 2 timevals!
// Gethostuuid(uuid *byte, timeout *Timespec) (errno int)
// Getsockopt(s int, level int, name int, val *byte, vallen *int) (errno int)
// Madvise(addr *byte, len int, behav int) (errno int)
@@ -463,5 +481,3 @@ func SysctlUint32(name string) (value uint32, errno int) {
// Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, errno int)
// Recvmsg(s int, msg *Msghdr, flags int) (n int, errno int)
// Sendmsg(s int, msg *Msghdr, flags int) (n int, errno int)
-// Utimes(path string, timeval *Timeval) (errno int) // Pointer to 2 timevals!
-//sys fcntl(fd int, cmd int, arg int) (val int, errno int)
diff --git a/src/pkg/syscall/syscall_linux.go b/src/pkg/syscall/syscall_linux.go
index f98b4cb7a..39ab10309 100644
--- a/src/pkg/syscall/syscall_linux.go
+++ b/src/pkg/syscall/syscall_linux.go
@@ -49,12 +49,18 @@ func Utimes(path string, tv []Timeval) (errno int) {
return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
}
-//sys futimesat(dirfd int, path string, times *[2]Timeval) (errno int)
+//sys futimesat(dirfd int, path *byte, times *[2]Timeval) (errno int)
func Futimesat(dirfd int, path string, tv []Timeval) (errno int) {
if len(tv) != 2 {
return EINVAL
}
- return futimesat(dirfd, path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
+ return futimesat(dirfd, StringBytePtr(path), (*[2]Timeval)(unsafe.Pointer(&tv[0])))
+}
+
+func Futimes(fd int, tv []Timeval) (errno int) {
+ // Believe it or not, this is the best we can do on Linux
+ // (and is what glibc does).
+ return Utimes("/proc/self/fd/"+str(fd), tv)
}
const ImplementsGetwd = true
diff --git a/src/pkg/syscall/zsyscall_darwin_386.go b/src/pkg/syscall/zsyscall_darwin_386.go
index e4fc04f4a..6e46cfbc4 100644
--- a/src/pkg/syscall/zsyscall_darwin_386.go
+++ b/src/pkg/syscall/zsyscall_darwin_386.go
@@ -121,6 +121,18 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
return
}
+func utimes(path string, timeval *[2]Timeval) (errno int) {
+ _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(StringBytePtr(path))), uintptr(unsafe.Pointer(timeval)), 0)
+ errno = int(e1)
+ return
+}
+
+func futimes(fd int, timeval *[2]Timeval) (errno int) {
+ _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)
+ errno = int(e1)
+ return
+}
+
func fcntl(fd int, cmd int, arg int) (val int, errno int) {
r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))
val = int(r0)
diff --git a/src/pkg/syscall/zsyscall_darwin_amd64.go b/src/pkg/syscall/zsyscall_darwin_amd64.go
index 9ffdf793a..cb963171a 100644
--- a/src/pkg/syscall/zsyscall_darwin_amd64.go
+++ b/src/pkg/syscall/zsyscall_darwin_amd64.go
@@ -121,6 +121,18 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr)
return
}
+func utimes(path string, timeval *[2]Timeval) (errno int) {
+ _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(StringBytePtr(path))), uintptr(unsafe.Pointer(timeval)), 0)
+ errno = int(e1)
+ return
+}
+
+func futimes(fd int, timeval *[2]Timeval) (errno int) {
+ _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)
+ errno = int(e1)
+ return
+}
+
func fcntl(fd int, cmd int, arg int) (val int, errno int) {
r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))
val = int(r0)
diff --git a/src/pkg/syscall/zsyscall_linux_386.go b/src/pkg/syscall/zsyscall_linux_386.go
index 4f63864ce..c1670f31e 100644
--- a/src/pkg/syscall/zsyscall_linux_386.go
+++ b/src/pkg/syscall/zsyscall_linux_386.go
@@ -31,8 +31,8 @@ func utimes(path string, times *[2]Timeval) (errno int) {
return
}
-func futimesat(dirfd int, path string, times *[2]Timeval) (errno int) {
- _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(StringBytePtr(path))), uintptr(unsafe.Pointer(times)))
+func futimesat(dirfd int, path *byte, times *[2]Timeval) (errno int) {
+ _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))
errno = int(e1)
return
}
diff --git a/src/pkg/syscall/zsyscall_linux_amd64.go b/src/pkg/syscall/zsyscall_linux_amd64.go
index f16cf0a24..b57296a54 100644
--- a/src/pkg/syscall/zsyscall_linux_amd64.go
+++ b/src/pkg/syscall/zsyscall_linux_amd64.go
@@ -31,8 +31,8 @@ func utimes(path string, times *[2]Timeval) (errno int) {
return
}
-func futimesat(dirfd int, path string, times *[2]Timeval) (errno int) {
- _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(StringBytePtr(path))), uintptr(unsafe.Pointer(times)))
+func futimesat(dirfd int, path *byte, times *[2]Timeval) (errno int) {
+ _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))
errno = int(e1)
return
}