1
0
mirror of https://github.com/golang/go synced 2024-11-25 04:07:55 -07:00

os: add Chtimes function

R=rsc, r
CC=golang-dev
https://golang.org/cl/1103041
This commit is contained in:
Brad Fitzpatrick 2010-05-19 17:48:53 -07:00 committed by Russ Cox
parent cbc01a3e76
commit 1afa2a1b2d
2 changed files with 58 additions and 0 deletions

View File

@ -407,3 +407,19 @@ func (f *File) Truncate(size int64) Error {
} }
return nil return nil
} }
// Chtimes changes the access and modification times of the named
// file, similar to the Unix utime() or utimes() functions.
//
// The argument times are in nanoseconds, although the underlying
// filesystem may truncate or round the values to a more
// coarse time unit.
func Chtimes(name string, atime_ns int64, mtime_ns int64) Error {
var utimes [2]syscall.Timeval
utimes[0] = syscall.NsecToTimeval(atime_ns)
utimes[1] = syscall.NsecToTimeval(mtime_ns)
if e := syscall.Utimes(name, &utimes); e != 0 {
return &PathError{"chtimes", name, Errno(e)}
}
return nil
}

View File

@ -483,6 +483,48 @@ func TestTruncate(t *testing.T) {
Remove(Path) Remove(Path)
} }
func TestChtimes(t *testing.T) {
MkdirAll("_obj", 0777)
const Path = "_obj/_TestChtimes_"
fd, err := Open(Path, O_WRONLY|O_CREAT, 0666)
if err != nil {
t.Fatalf("create %s: %s", Path, err)
}
fd.Write([]byte("hello, world\n"))
fd.Close()
preStat, err := Stat(Path)
if err != nil {
t.Fatalf("Stat %s: %s", Path, err)
}
// Move access and modification time back a second
const OneSecond = 1e9 // in nanoseconds
err = Chtimes(Path, preStat.Atime_ns-OneSecond, preStat.Mtime_ns-OneSecond)
if err != nil {
t.Fatalf("Chtimes %s: %s", Path, err)
}
postStat, err := Stat(Path)
if err != nil {
t.Fatalf("second Stat %s: %s", Path, err)
}
if postStat.Atime_ns >= preStat.Atime_ns {
t.Errorf("Atime_ns didn't go backwards; was=%d, after=%d",
preStat.Atime_ns,
postStat.Atime_ns)
}
if postStat.Mtime_ns >= preStat.Mtime_ns {
t.Errorf("Mtime_ns didn't go backwards; was=%d, after=%d",
preStat.Mtime_ns,
postStat.Mtime_ns)
}
Remove(Path)
}
func TestChdirAndGetwd(t *testing.T) { func TestChdirAndGetwd(t *testing.T) {
fd, err := Open(".", O_RDONLY, 0) fd, err := Open(".", O_RDONLY, 0)
if err != nil { if err != nil {