Newer
Older
//go:build !windows
import (
"path/filepath"
"strings"
"github.com/moby/sys/mountinfo"
"gitlab.com/golang-utils/fs/path"
"golang.org/x/sys/unix"
)
func OnUnix() bool {
return true
}
func OnWindows() bool {
return false
}
func Drive(loc path.Local) (string, error) {
/*
abs := fsys.Abs(rel)
loc, err := path.ParseLocal(abs.String())
if err != nil {
return "", err
}
*/
absPath := path.ToSystem(loc)
if absPath == "" {
return "", ErrExpectedAbsPath.Params("")
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
}
absPath, err := filepath.EvalSymlinks(absPath)
if err != nil {
return "", err
}
var filter mountinfo.FilterFunc = func(info *mountinfo.Info) (skip, stop bool) {
if info.Mountpoint == absPath {
return false, true
}
if strings.HasPrefix(absPath, info.Mountpoint+"/") {
return false, false
}
return true, false
}
infos, err := mountinfo.GetMounts(filter)
if err != nil {
return "", err
}
if len(infos) == 0 {
return "", nil
}
var length int = 0
var longest string
for _, info := range infos {
if len(info.Mountpoint) > length {
longest = info.Mountpoint
length = len(info.Mountpoint)
}
}
return longest, nil
}
// see https://stackoverflow.com/questions/20108520/get-amount-of-free-disk-space-using-go
func FreeSpace(drive string, freeBytesAvailable *uint64) error {
var stat unix.Statfs_t
err := unix.Statfs(drive, &stat)
if err != nil {
return err
}
// Available blocks * size per block = available space in bytes
*freeBytesAvailable = stat.Bavail * uint64(stat.Bsize)
return nil
}