Commit bbb31a1d by Ian Lance Taylor

os, syscall: handle _st_timespec for AIX stat

    
    Reviewed-on: https://go-review.googlesource.com/87197

From-SVN: r256450
parent 9a004410
d8a9f7433a9e8a81c992ad2908818d2e84f3698b 19d94969c5202c07b3b166079b9f4ebbb52dfa6b
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
// Copyright 2009 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.
package os
import (
"syscall"
"time"
)
func fillFileStatFromSys(fs *fileStat, name string) {
fs.name = basename(name)
fs.size = int64(fs.sys.Size)
fs.modTime = stTimespecToTime(fs.sys.Mtim)
fs.mode = FileMode(fs.sys.Mode & 0777)
switch fs.sys.Mode & syscall.S_IFMT {
case syscall.S_IFBLK:
fs.mode |= ModeDevice
case syscall.S_IFCHR:
fs.mode |= ModeDevice | ModeCharDevice
case syscall.S_IFDIR:
fs.mode |= ModeDir
case syscall.S_IFIFO:
fs.mode |= ModeNamedPipe
case syscall.S_IFLNK:
fs.mode |= ModeSymlink
case syscall.S_IFREG:
// nothing to do
case syscall.S_IFSOCK:
fs.mode |= ModeSocket
}
if fs.sys.Mode&syscall.S_ISGID != 0 {
fs.mode |= ModeSetgid
}
if fs.sys.Mode&syscall.S_ISUID != 0 {
fs.mode |= ModeSetuid
}
if fs.sys.Mode&syscall.S_ISVTX != 0 {
fs.mode |= ModeSticky
}
}
func stTimespecToTime(ts syscall.StTimespec) time.Time {
return time.Unix(int64(ts.Sec), int64(ts.Nsec))
}
// For testing.
func atime(fi FileInfo) time.Time {
return stTimespecToTime(fi.Sys().(*syscall.Stat_t).Atim)
}
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// +build aix linux openbsd solaristag // +build linux openbsd solaristag
package os package os
......
...@@ -6,6 +6,14 @@ package syscall ...@@ -6,6 +6,14 @@ package syscall
import "unsafe" import "unsafe"
func (ts *StTimespec) Unix() (sec int64, nsec int64) {
return int64(ts.Sec), int64(ts.Nsec)
}
func (ts *StTimespec) Nano() int64 {
return int64(ts.Sec)*1e9 + int64(ts.Nsec)
}
func direntIno(buf []byte) (uint64, bool) { func direntIno(buf []byte) (uint64, bool) {
return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
} }
......
...@@ -443,6 +443,12 @@ grep '^type _tms ' gen-sysinfo.go | \ ...@@ -443,6 +443,12 @@ grep '^type _tms ' gen-sysinfo.go | \
-e 's/tms_cstime/Cstime/' \ -e 's/tms_cstime/Cstime/' \
>> ${OUT} >> ${OUT}
# AIX uses st_timespec struct for stat.
grep '^type _st_timespec ' gen-sysinfo.go | \
sed -e 's/type _st_timespec /type StTimespec /' \
-e 's/tv_sec/Sec/' \
-e 's/tv_nsec/Nsec/' >> ${OUT}
# The stat type. # The stat type.
# Prefer largefile variant if available. # Prefer largefile variant if available.
stat=`grep '^type _stat64 ' gen-sysinfo.go || true` stat=`grep '^type _stat64 ' gen-sysinfo.go || true`
...@@ -467,7 +473,7 @@ fi | sed -e 's/type _stat64/type Stat_t/' \ ...@@ -467,7 +473,7 @@ fi | sed -e 's/type _stat64/type Stat_t/' \
-e 's/st_ctim/Ctim/' \ -e 's/st_ctim/Ctim/' \
-e 's/\([^a-zA-Z0-9_]\)_timeval\([^a-zA-Z0-9_]\)/\1Timeval\2/g' \ -e 's/\([^a-zA-Z0-9_]\)_timeval\([^a-zA-Z0-9_]\)/\1Timeval\2/g' \
-e 's/\([^a-zA-Z0-9_]\)_timespec_t\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \ -e 's/\([^a-zA-Z0-9_]\)_timespec_t\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \
-e 's/\([^a-zA-Z0-9_]\)_st_timespec_t\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \ -e 's/\([^a-zA-Z0-9_]\)_st_timespec_t\([^a-zA-Z0-9_]\)/\1StTimespec\2/g' \
-e 's/\([^a-zA-Z0-9_]\)_timespec\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \ -e 's/\([^a-zA-Z0-9_]\)_timespec\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \
-e 's/\([^a-zA-Z0-9_]\)_timestruc_t\([^a-zA-Z0-9_]\)/\1Timestruc\2/g' \ -e 's/\([^a-zA-Z0-9_]\)_timestruc_t\([^a-zA-Z0-9_]\)/\1Timestruc\2/g' \
-e 's/Godump_[0-9] struct { \([^;]*;\) };/\1/g' \ -e 's/Godump_[0-9] struct { \([^;]*;\) };/\1/g' \
......
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