Pārlūkot izejas kodu

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 <bradfitz@golang.org>
Rob Pike 10 gadi atpakaļ
vecāks
revīzija
3826714b1e
3 mainītis faili ar 35 papildinājumiem un 10 dzēšanām
  1. 11 2
      unix/syscall_bsd.go
  2. 20 7
      unix/syscall_linux.go
  3. 4 1
      unix/syscall_solaris.go

+ 11 - 2
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)
 //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 {
 	if len(tv) != 2 {
 		return EINVAL
 		return EINVAL
 	}
 	}
@@ -508,6 +511,9 @@ func Utimes(path string, tv []Timeval) (err error) {
 }
 }
 
 
 func UtimesNano(path string, ts []Timespec) 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
 	// TODO: The BSDs can do utimensat with SYS_UTIMENSAT but it
 	// isn't supported by darwin so this uses utimes instead
 	// isn't supported by darwin so this uses utimes instead
 	if len(ts) != 2 {
 	if len(ts) != 2 {
@@ -524,7 +530,10 @@ func UtimesNano(path string, ts []Timespec) error {
 
 
 //sys	futimes(fd int, timeval *[2]Timeval) (err 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 {
 	if len(tv) != 2 {
 		return EINVAL
 		return EINVAL
 	}
 	}

+ 20 - 7
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)
 //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 {
 	if len(ts) != 2 {
 		return EINVAL
 		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 {
 	if err != ENOSYS {
 		return err
 		return err
 	}
 	}
@@ -122,7 +129,10 @@ func UtimesNano(path string, ts []Timespec) (err error) {
 	return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
 	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 {
 	if len(ts) != 2 {
 		return EINVAL
 		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)
 //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)
 	pathp, err := BytePtrFromString(path)
 	if err != nil {
 	if err != nil {
 		return err
 		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])))
 	return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
 }
 }
 
 

+ 4 - 1
unix/syscall_solaris.go

@@ -270,7 +270,10 @@ func Gethostname() (name string, err error) {
 	return name, err
 	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 {
 	if len(ts) != 2 {
 		return EINVAL
 		return EINVAL
 	}
 	}