1// +build freebsd linux darwin 2 3package disk 4 5import ( 6 "context" 7 "strconv" 8 9 "golang.org/x/sys/unix" 10) 11 12func UsageWithContext(ctx context.Context, path string) (*UsageStat, error) { 13 stat := unix.Statfs_t{} 14 err := unix.Statfs(path, &stat) 15 if err != nil { 16 return nil, err 17 } 18 bsize := stat.Bsize 19 20 ret := &UsageStat{ 21 Path: unescapeFstab(path), 22 Fstype: getFsType(stat), 23 Total: (uint64(stat.Blocks) * uint64(bsize)), 24 Free: (uint64(stat.Bavail) * uint64(bsize)), 25 InodesTotal: (uint64(stat.Files)), 26 InodesFree: (uint64(stat.Ffree)), 27 } 28 29 // if could not get InodesTotal, return empty 30 if ret.InodesTotal < ret.InodesFree { 31 return ret, nil 32 } 33 34 ret.InodesUsed = (ret.InodesTotal - ret.InodesFree) 35 ret.Used = (uint64(stat.Blocks) - uint64(stat.Bfree)) * uint64(bsize) 36 37 if ret.InodesTotal == 0 { 38 ret.InodesUsedPercent = 0 39 } else { 40 ret.InodesUsedPercent = (float64(ret.InodesUsed) / float64(ret.InodesTotal)) * 100.0 41 } 42 43 if (ret.Used + ret.Free) == 0 { 44 ret.UsedPercent = 0 45 } else { 46 // We don't use ret.Total to calculate percent. 47 // see https://github.com/shirou/gopsutil/issues/562 48 ret.UsedPercent = (float64(ret.Used) / float64(ret.Used+ret.Free)) * 100.0 49 } 50 51 return ret, nil 52} 53 54// Unescape escaped octal chars (like space 040, ampersand 046 and backslash 134) to their real value in fstab fields issue#555 55func unescapeFstab(path string) string { 56 escaped, err := strconv.Unquote(`"` + path + `"`) 57 if err != nil { 58 return path 59 } 60 return escaped 61} 62