12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- // +build daemon
- package utils
- import (
- "os"
- "path/filepath"
- "syscall"
- )
- // TreeSize walks a directory tree and returns its total size in bytes.
- func TreeSize(dir string) (size int64, err error) {
- data := make(map[uint64]struct{})
- err = filepath.Walk(dir, func(d string, fileInfo os.FileInfo, e error) error {
- // Ignore directory sizes
- if fileInfo == nil {
- return nil
- }
- s := fileInfo.Size()
- if fileInfo.IsDir() || s == 0 {
- return nil
- }
- // Check inode to handle hard links correctly
- inode := fileInfo.Sys().(*syscall.Stat_t).Ino
- // inode is not a uint64 on all platforms. Cast it to avoid issues.
- if _, exists := data[uint64(inode)]; exists {
- return nil
- }
- // inode is not a uint64 on all platforms. Cast it to avoid issues.
- data[uint64(inode)] = struct{}{}
- size += s
- return nil
- })
- return
- }
- // IsFileOwner checks whether the current user is the owner of the given file.
- func IsFileOwner(f string) bool {
- if fileInfo, err := os.Stat(f); err == nil && fileInfo != nil {
- if stat, ok := fileInfo.Sys().(*syscall.Stat_t); ok && int(stat.Uid) == os.Getuid() {
- return true
- }
- }
- return false
- }
|