diff options
author | Russ Cox <rsc@golang.org> | 2010-05-19 17:47:57 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-05-19 17:47:57 -0700 |
commit | 94b3292622846b33dafe15d32d2b20cd2ce1fbef (patch) | |
tree | 2fd3111eff2c99cd45e4a5dd459ee4adbed688dc | |
parent | c94d037cd17b64739dd53ea17d170d100965aa00 (diff) | |
download | golang-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-x | src/pkg/syscall/mkall.sh | 8 | ||||
-rw-r--r-- | src/pkg/syscall/syscall_bsd.go | 22 | ||||
-rw-r--r-- | src/pkg/syscall/syscall_linux.go | 10 | ||||
-rw-r--r-- | src/pkg/syscall/zsyscall_darwin_386.go | 12 | ||||
-rw-r--r-- | src/pkg/syscall/zsyscall_darwin_amd64.go | 12 | ||||
-rw-r--r-- | src/pkg/syscall/zsyscall_linux_386.go | 4 | ||||
-rw-r--r-- | src/pkg/syscall/zsyscall_linux_amd64.go | 4 |
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 } |