| // Copyright 2012 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build linux |
| // +build linux |
| |
| // GNU/Linux version of UtimesNano. |
| |
| package syscall |
| |
| import "unsafe" |
| |
| //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) |
| //utimensat(dirfd _C_int, path *byte, times *[2]Timespec, flags _C_int) _C_int |
| |
| func UtimesNano(path string, ts []Timespec) (err error) { |
| if len(ts) != 2 { |
| return EINVAL |
| } |
| err = utimensat(_AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) |
| if err != ENOSYS { |
| return err |
| } |
| // If the utimensat syscall isn't available (utimensat was added to Linux |
| // in 2.6.22, Released, 8 July 2007) then fall back to utimes |
| var tv [2]Timeval |
| for i := 0; i < 2; i++ { |
| tv[i].Sec = Timeval_sec_t(ts[i].Sec) |
| tv[i].Usec = Timeval_usec_t(ts[i].Nsec / 1000) |
| } |
| return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) |
| } |