Commit 1afa2a1b authored by Brad Fitzpatrick's avatar Brad Fitzpatrick Committed by Russ Cox

os: add Chtimes function

R=rsc, r
CC=golang-dev
https://golang.org/cl/1103041
parent cbc01a3e
...@@ -407,3 +407,19 @@ func (f *File) Truncate(size int64) Error { ...@@ -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
}
...@@ -483,6 +483,48 @@ func TestTruncate(t *testing.T) { ...@@ -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 {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment