Skip to content
Snippets Groups Projects
Select Git revision
  • main default protected
  • v0.22.1
  • v0.22.0
  • v0.21.0
  • v0.20.1
  • v0.20.0
  • v0.19.0
  • v0.18.3
  • v0.18.2
  • v0.18.1
  • v0.18.0
  • v0.17.0
  • v0.16.0
  • v0.15.0
  • v0.14.0
  • v0.13.0
  • v0.12.0
  • v0.11.0
  • v0.10.0
  • v0.9.0
  • v0.8.1
21 results

fs_unix.go

fs_unix.go 1.52 KiB
//go:build !windows

package fs

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("")
	}

	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
}