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 }