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-02-06 18:54:26 -07:00
|
|
|
dir.Dev = stat.Dev;
|
2009-11-01 10:37:13 -07:00
|
|
|
dir.Ino = uint64(stat.Ino);
|
|
|
|
dir.Nlink = uint64(stat.Nlink);
|
2009-02-06 18:54:26 -07:00
|
|
|
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);
|
2009-06-01 23:14:39 -06:00
|
|
|
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-11-20 12:45:05 -07:00
|
|
|
name = name[i+1:];
|
2009-02-06 18:54:26 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
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-02-06 18:54:26 -07:00
|
|
|
return dir;
|
|
|
|
}
|