]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: add Utimes on Darwin/FreeBSD, add Futimes everywhere
authorRuss Cox <rsc@golang.org>
Thu, 20 May 2010 00:47:57 +0000 (17:47 -0700)
committerRuss Cox <rsc@golang.org>
Thu, 20 May 2010 00:47:57 +0000 (17:47 -0700)
Needed for CL 1103041 and beyond.

R=adg, bradfitzpatrick
CC=bradfitz, golang-dev
https://golang.org/cl/1172042

src/pkg/syscall/mkall.sh
src/pkg/syscall/syscall_bsd.go
src/pkg/syscall/syscall_linux.go
src/pkg/syscall/zsyscall_darwin_386.go
src/pkg/syscall/zsyscall_darwin_amd64.go
src/pkg/syscall/zsyscall_linux_386.go
src/pkg/syscall/zsyscall_linux_amd64.go

index 0b4519adf5353f6097d2cd990312cc6fb78d0f96..12d8c331025990efe8d3eb12dedf6645da36e201 100755 (executable)
@@ -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
index cb7264863e4ae452f3200e93fecbc7a956a8a060..332afa4bfac11376d3c8c835b761d71d27a7ff0c 100644 (file)
@@ -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)
index f98b4cb7a8f08e394fd384ad0651fe38ea28349a..39ab10309d6bf35e1dc2fe550449d4c19b18bfff 100644 (file)
@@ -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
index e4fc04f4ab6320556ff3009d7feef0e92d3956f2..6e46cfbc4eda62a84d13d9c92a13f366e7c27c87 100644 (file)
@@ -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)
index 9ffdf793a89af9ad7edb76db58858036cc98c12e..cb963171a84ec8280bd1650845e919cd8e0e606b 100644 (file)
@@ -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)
index 4f63864ce478390eeb2fec5d23e5683154c088f5..c1670f31e7b795f223f5992fad1213f84a05a56b 100644 (file)
@@ -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
 }
index f16cf0a2468e77f6eb542f5d6285e16e5c5c2aa6..b57296a546bc72996e6304bb32545735587caa3c 100644 (file)
@@ -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
 }