...
1
2
3 package disk
4
5 import (
6 "context"
7 "strconv"
8
9 "golang.org/x/sys/unix"
10 )
11
12 func 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
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
47
48 ret.UsedPercent = (float64(ret.Used) / float64(ret.Used+ret.Free)) * 100.0
49 }
50
51 return ret, nil
52 }
53
54
55 func unescapeFstab(path string) string {
56 escaped, err := strconv.Unquote(`"` + path + `"`)
57 if err != nil {
58 return path
59 }
60 return escaped
61 }
62
View as plain text