| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- //go:build freebsd || linux || darwin || (aix && !cgo)
- // +build freebsd linux darwin aix,!cgo
- package disk
- import (
- "context"
- "strconv"
- "golang.org/x/sys/unix"
- )
- func UsageWithContext(ctx context.Context, path string) (*UsageStat, error) {
- stat := unix.Statfs_t{}
- err := unix.Statfs(path, &stat)
- if err != nil {
- return nil, err
- }
- bsize := stat.Bsize
- ret := &UsageStat{
- Path: unescapeFstab(path),
- Fstype: getFsType(stat),
- Total: (uint64(stat.Blocks) * uint64(bsize)),
- Free: (uint64(stat.Bavail) * uint64(bsize)),
- InodesTotal: (uint64(stat.Files)),
- InodesFree: (uint64(stat.Ffree)),
- }
- ret.Used = (uint64(stat.Blocks) - uint64(stat.Bfree)) * uint64(bsize)
- if (ret.Used + ret.Free) == 0 {
- ret.UsedPercent = 0
- } else {
- // We don't use ret.Total to calculate percent.
- // see https://github.com/shirou/gopsutil/issues/562
- ret.UsedPercent = (float64(ret.Used) / float64(ret.Used+ret.Free)) * 100.0
- }
- // if could not get InodesTotal, return empty
- if ret.InodesTotal < ret.InodesFree {
- return ret, nil
- }
- ret.InodesUsed = (ret.InodesTotal - ret.InodesFree)
- if ret.InodesTotal == 0 {
- ret.InodesUsedPercent = 0
- } else {
- ret.InodesUsedPercent = (float64(ret.InodesUsed) / float64(ret.InodesTotal)) * 100.0
- }
- return ret, nil
- }
- // Unescape escaped octal chars (like space 040, ampersand 046 and backslash 134) to their real value in fstab fields issue#555
- func unescapeFstab(path string) string {
- escaped, err := strconv.Unquote(`"` + path + `"`)
- if err != nil {
- return path
- }
- return escaped
- }
|