From 2346aabf55275f635ab6be84172d2cf66d1d4174 Mon Sep 17 00:00:00 2001 From: dreacot Date: Fri, 31 Jan 2025 00:31:46 +0100 Subject: [PATCH] fix disk space check for windows --- libwallet/utils/config.go | 36 +++++++++++++++------------------ libwallet/utils/disk_general.go | 26 ++++++++++++++++++++++++ libwallet/utils/disk_windows.go | 30 +++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 20 deletions(-) create mode 100644 libwallet/utils/disk_general.go create mode 100644 libwallet/utils/disk_windows.go diff --git a/libwallet/utils/config.go b/libwallet/utils/config.go index f236aa1f1..ba85b9190 100644 --- a/libwallet/utils/config.go +++ b/libwallet/utils/config.go @@ -10,7 +10,6 @@ import ( "regexp" "runtime" "strings" - "syscall" "time" "gioui.org/app" @@ -194,31 +193,28 @@ func GetFreeDiskSpace() (uint64, error) { var path string var err error switch runtime.GOOS { - case "android", "ios": - path, err = app.DataDir() - if err != nil { - return 0, err + case "android", "ios", "linux", "darwin", "windows": + if runtime.GOOS == "android" || runtime.GOOS == "ios" { + path, err = app.DataDir() + if err != nil { + return 0, err + } + } else { + path, err = os.UserHomeDir() + if err != nil { + return 0, err + } } - case "linux", "darwin", "windows": - path, err = os.UserHomeDir() + + freeSpace, err := DiskSpace(path) if err != nil { return 0, err } - default: - return 0, nil - } - var stat syscall.Statfs_t + return freeSpace, nil - // Get file system statistics for the specified path - err = syscall.Statfs(path, &stat) - if err != nil { - return 0, err + default: + return 0, nil } - // Calculate available space: free blocks * block size - freeBytes := stat.Bavail * uint64(stat.Bsize) - - // Convert bytes to MB - return freeBytes / (1024 * 1024), nil } diff --git a/libwallet/utils/disk_general.go b/libwallet/utils/disk_general.go new file mode 100644 index 000000000..654d3013f --- /dev/null +++ b/libwallet/utils/disk_general.go @@ -0,0 +1,26 @@ +//go:build linux || android || ios || darwin +// +build linux android ios darwin + +package utils + +import ( + "syscall" +) + +// DiskSpace returns the available disk space in MB for the specified path +func DiskSpace(path string) (uint64, error) { + + var stat syscall.Statfs_t + + // Get file system statistics for the specified path + err := syscall.Statfs(path, &stat) + if err != nil { + return 0, err + } + + // Calculate available space: free blocks * block size + freeBytes := stat.Bavail * uint64(stat.Bsize) + + // Convert bytes to MB + return freeBytes / (1024 * 1024), nil +} diff --git a/libwallet/utils/disk_windows.go b/libwallet/utils/disk_windows.go new file mode 100644 index 000000000..4c9207932 --- /dev/null +++ b/libwallet/utils/disk_windows.go @@ -0,0 +1,30 @@ +//go:build windows +// +build windows + +package utils + +import ( + "golang.org/x/sys/windows" +) + +// DiskSpace returns the total and free disk space in bytes for the specified directory +func DiskSpace(dir string) (free uint64, err error) { + var ( + directoryName = windows.StringToUTF16Ptr(dir) + freeBytesAvailableToCaller uint64 + totalNumberOfBytes uint64 + totalNumberOfFreeBytes uint64 + ) + err = windows.GetDiskFreeSpaceEx( + directoryName, + &freeBytesAvailableToCaller, + &totalNumberOfBytes, + &totalNumberOfFreeBytes, + ) + if err != nil { + return 0, err + } + + // Convert bytes to MB + return totalNumberOfFreeBytes / (1024 * 1024), nil +}