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:
parent
cbc01a3e76
commit
1afa2a1b2d
@ -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) {
|
|||||||
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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user