Skip to content

Commit

Permalink
os: add Chtimes function
Browse files Browse the repository at this point in the history
R=rsc, r
CC=golang-dev
https://golang.org/cl/1103041
  • Loading branch information
bradfitz authored and rsc committed May 20, 2010
1 parent cbc01a3 commit 1afa2a1
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/pkg/os/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -407,3 +407,19 @@ func (f *File) Truncate(size int64) Error {
}
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
}
42 changes: 42 additions & 0 deletions src/pkg/os/os_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,48 @@ func TestTruncate(t *testing.T) {
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) {
fd, err := Open(".", O_RDONLY, 0)
if err != nil {
Expand Down

0 comments on commit 1afa2a1

Please sign in to comment.