func TestGetfsstat(t *testing.T) { const flags = MNT_NOWAIT // see golang.org/issue/16937 n, err := unix.Getfsstat(nil, flags) if err != nil { t.Fatal(err) } data := make([]unix.Statfs_t, n) n2, err := unix.Getfsstat(data, flags) if err != nil { t.Fatal(err) } if n != n2 { t.Errorf("Getfsstat(nil) = %d, but subsequent Getfsstat(slice) = %d", n, n2) } for i, stat := range data { if stat == (unix.Statfs_t{}) { t.Errorf("index %v is an empty Statfs_t struct", i) } } if t.Failed() { for i, stat := range data[:n2] { t.Logf("data[%v] = %+v", i, stat) } mount, err := exec.Command("mount").CombinedOutput() if err != nil { t.Logf("mount: %v\n%s", err, mount) } else { t.Logf("mount: %s", mount) } } }
func TestGetfsstat(t *testing.T) { n, err := unix.Getfsstat(nil, MNT_WAIT) if err != nil { t.Fatal(err) } data := make([]unix.Statfs_t, n) n, err = unix.Getfsstat(data, MNT_WAIT) if err != nil { t.Fatal(err) } empty := unix.Statfs_t{} for _, stat := range data { if stat == empty { t.Fatal("an empty Statfs_t struct was returned") } } }
// Expose filesystem fullness. func (c *filesystemCollector) GetStats() (stats []filesystemStats, err error) { buf := make([]unix.Statfs_t, 16) for { n, err := unix.Getfsstat(buf, MNT_NOWAIT) if err != nil { return nil, err } if n < len(buf) { buf = buf[:n] break } buf = make([]unix.Statfs_t, len(buf)*2) } stats = []filesystemStats{} for _, fs := range buf { mountpoint := gostring(fs.Mntonname[:]) if c.ignoredMountPointsPattern.MatchString(mountpoint) { log.Debugf("Ignoring mount point: %s", mountpoint) continue } device := gostring(fs.Mntfromname[:]) fstype := gostring(fs.Fstypename[:]) if c.ignoredFSTypesPattern.MatchString(fstype) { log.Debugf("Ignoring fs type: %s", fstype) continue } var ro float64 if (fs.Flags & MNT_RDONLY) != 0 { ro = 1 } stats = append(stats, filesystemStats{ labels: filesystemLabels{ device: device, mountPoint: mountpoint, fsType: fstype, }, size: float64(fs.Blocks) * float64(fs.Bsize), free: float64(fs.Bfree) * float64(fs.Bsize), avail: float64(fs.Bavail) * float64(fs.Bsize), files: float64(fs.Files), filesFree: float64(fs.Ffree), ro: ro, }) } return stats, nil }