2009-02-06 18:54:26 -07:00
|
|
|
// 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
|
|
|
|
|
2009-08-12 14:18:37 -06:00
|
|
|
import "syscall"
|
2009-02-06 18:54:26 -07:00
|
|
|
|
2009-05-15 12:04:49 -06:00
|
|
|
func isSymlink(stat *syscall.Stat_t) bool {
|
2009-11-09 22:23:52 -07:00
|
|
|
return stat.Mode&syscall.S_IFMT == syscall.S_IFLNK
|
2009-05-15 12:04:49 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func dirFromStat(name string, dir *Dir, lstat, stat *syscall.Stat_t) *Dir {
|
2009-12-15 16:40:16 -07:00
|
|
|
dir.Dev = stat.Dev
|
|
|
|
dir.Ino = uint64(stat.Ino)
|
|
|
|
dir.Nlink = uint64(stat.Nlink)
|
|
|
|
dir.Mode = stat.Mode
|
|
|
|
dir.Uid = stat.Uid
|
|
|
|
dir.Gid = stat.Gid
|
|
|
|
dir.Rdev = stat.Rdev
|
|
|
|
dir.Size = uint64(stat.Size)
|
|
|
|
dir.Blksize = uint64(stat.Blksize)
|
|
|
|
dir.Blocks = uint64(stat.Blocks)
|
|
|
|
dir.Atime_ns = uint64(syscall.TimespecToNsec(stat.Atim))
|
|
|
|
dir.Mtime_ns = uint64(syscall.TimespecToNsec(stat.Mtim))
|
|
|
|
dir.Ctime_ns = uint64(syscall.TimespecToNsec(stat.Ctim))
|
2009-11-09 22:23:52 -07:00
|
|
|
for i := len(name) - 1; i >= 0; i-- {
|
2009-02-06 18:54:26 -07:00
|
|
|
if name[i] == '/' {
|
2009-12-15 16:40:16 -07:00
|
|
|
name = name[i+1:]
|
|
|
|
break
|
2009-02-06 18:54:26 -07:00
|
|
|
}
|
|
|
|
}
|
2009-12-15 16:40:16 -07:00
|
|
|
dir.Name = name
|
2009-05-15 12:04:49 -06:00
|
|
|
if isSymlink(lstat) && !isSymlink(stat) {
|
2009-11-09 13:07:39 -07:00
|
|
|
dir.FollowedSymlink = true
|
2009-05-15 12:04:49 -06:00
|
|
|
}
|
2009-12-15 16:40:16 -07:00
|
|
|
return dir
|
2009-02-06 18:54:26 -07:00
|
|
|
}
|