From 3826714b1e47586d04a2d62ccf2e8d13eca82790 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Mon, 27 Jul 2015 13:16:35 +1000 Subject: [PATCH] x/sys/unix: allow nil on unix for all variants of Utimes Fixes golang/go#11830. Change-Id: Ie6e9f82d05b7c04092b6ee6117238873b746380e Reviewed-on: https://go-review.googlesource.com/12690 Reviewed-by: Brad Fitzpatrick --- unix/syscall_bsd.go | 13 +++++++++++-- unix/syscall_linux.go | 27 ++++++++++++++++++++------- unix/syscall_solaris.go | 5 ++++- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/unix/syscall_bsd.go b/unix/syscall_bsd.go index 7b08113b..9679dec8 100644 --- a/unix/syscall_bsd.go +++ b/unix/syscall_bsd.go @@ -500,7 +500,10 @@ func SysctlUint32(name string) (value uint32, err error) { //sys utimes(path string, timeval *[2]Timeval) (err error) -func Utimes(path string, tv []Timeval) (err error) { +func Utimes(path string, tv []Timeval) error { + if tv == nil { + return utimes(path, nil) + } if len(tv) != 2 { return EINVAL } @@ -508,6 +511,9 @@ func Utimes(path string, tv []Timeval) (err error) { } func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + return utimes(path, nil) + } // TODO: The BSDs can do utimensat with SYS_UTIMENSAT but it // isn't supported by darwin so this uses utimes instead if len(ts) != 2 { @@ -524,7 +530,10 @@ func UtimesNano(path string, ts []Timespec) error { //sys futimes(fd int, timeval *[2]Timeval) (err error) -func Futimes(fd int, tv []Timeval) (err error) { +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimes(fd, nil) + } if len(tv) != 2 { return EINVAL } diff --git a/unix/syscall_linux.go b/unix/syscall_linux.go index fef081f6..9df71957 100644 --- a/unix/syscall_linux.go +++ b/unix/syscall_linux.go @@ -104,11 +104,18 @@ func Utimes(path string, tv []Timeval) (err error) { //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) -func UtimesNano(path string, ts []Timespec) (err error) { +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } if len(ts) != 2 { return EINVAL } - err = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) if err != ENOSYS { return err } @@ -122,7 +129,10 @@ func UtimesNano(path string, ts []Timespec) (err error) { return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } -func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) (err error) { +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } if len(ts) != 2 { return EINVAL } @@ -131,14 +141,17 @@ func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) (err error) //sys futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) -func Futimesat(dirfd int, path string, tv []Timeval) (err error) { - if len(tv) != 2 { - return EINVAL - } +func Futimesat(dirfd int, path string, tv []Timeval) error { pathp, err := BytePtrFromString(path) if err != nil { return err } + if tv == nil { + return futimesat(dirfd, pathp, nil) + } + if len(tv) != 2 { + return EINVAL + } return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) } diff --git a/unix/syscall_solaris.go b/unix/syscall_solaris.go index 7e9626ad..ea5ac78e 100644 --- a/unix/syscall_solaris.go +++ b/unix/syscall_solaris.go @@ -270,7 +270,10 @@ func Gethostname() (name string, err error) { return name, err } -func UtimesNano(path string, ts []Timespec) (err error) { +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + return Utimes(path, nil) + } if len(ts) != 2 { return EINVAL }