From 4c96af6cba70dd033cd2fc11cafea6ac45fa7d30 Mon Sep 17 00:00:00 2001 From: Avenir Kobetski Date: Tue, 16 May 2023 09:14:34 +0200 Subject: [PATCH 1/2] Use x/sys-package instead of syscall, being deprecated --- du/diskusage.go | 15 ++++++++++----- du/diskusage_windows.go | 8 ++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/du/diskusage.go b/du/diskusage.go index 27556ad..9e6f410 100644 --- a/du/diskusage.go +++ b/du/diskusage.go @@ -1,20 +1,25 @@ +//go:build !windows // +build !windows package du -import "syscall" +import ( + "golang.org/x/sys/unix" +) // DiskUsage contains usage data and provides user-friendly access methods type DiskUsage struct { - stat *syscall.Statfs_t + stat *unix.Statfs_t } // NewDiskUsages returns an object holding the disk usage of volumePath // or nil in case of error (invalid path, etc) func NewDiskUsage(volumePath string) *DiskUsage { - - var stat syscall.Statfs_t - syscall.Statfs(volumePath, &stat) + stat := unix.Statfs_t{} + err := unix.Statfs(volumePath, &stat) + if err != nil { + return nil + } return &DiskUsage{&stat} } diff --git a/du/diskusage_windows.go b/du/diskusage_windows.go index ee14f40..e8ee726 100644 --- a/du/diskusage_windows.go +++ b/du/diskusage_windows.go @@ -1,8 +1,9 @@ package du import ( - "syscall" "unsafe" + + "golang.org/x/sys/windows" ) type DiskUsage struct { @@ -14,14 +15,13 @@ type DiskUsage struct { // NewDiskUsages returns an object holding the disk usage of volumePath // or nil in case of error (invalid path, etc) func NewDiskUsage(volumePath string) *DiskUsage { - - h := syscall.MustLoadDLL("kernel32.dll") + h := windows.MustLoadDLL("kernel32.dll") c := h.MustFindProc("GetDiskFreeSpaceExW") du := &DiskUsage{} c.Call( - uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(volumePath))), + uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(volumePath))), uintptr(unsafe.Pointer(&du.freeBytes)), uintptr(unsafe.Pointer(&du.totalBytes)), uintptr(unsafe.Pointer(&du.availBytes))) From 9e490120d92b16a15bd662d5696d15ec0e408bb7 Mon Sep 17 00:00:00 2001 From: Mattias de Zalenski Date: Tue, 31 Oct 2023 10:42:25 +0100 Subject: [PATCH 2/2] Add NewDiskUsageOrError returning any error --- du/diskusage.go | 11 +++++++++-- du/diskusage_windows.go | 16 ++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/du/diskusage.go b/du/diskusage.go index 9e6f410..6fcc42a 100644 --- a/du/diskusage.go +++ b/du/diskusage.go @@ -15,12 +15,19 @@ type DiskUsage struct { // NewDiskUsages returns an object holding the disk usage of volumePath // or nil in case of error (invalid path, etc) func NewDiskUsage(volumePath string) *DiskUsage { + du, _ := NewDiskUsageOrError(volumePath) + return du +} + +// NewDiskUsagesOrError returns an object holding the disk usage of volumePath +// or any error (invalid path, etc) +func NewDiskUsageOrError(volumePath string) (*DiskUsage, error) { stat := unix.Statfs_t{} err := unix.Statfs(volumePath, &stat) if err != nil { - return nil + return nil, err } - return &DiskUsage{&stat} + return &DiskUsage{&stat}, nil } // Free returns total free bytes on file system diff --git a/du/diskusage_windows.go b/du/diskusage_windows.go index e8ee726..702eea8 100644 --- a/du/diskusage_windows.go +++ b/du/diskusage_windows.go @@ -15,18 +15,30 @@ type DiskUsage struct { // NewDiskUsages returns an object holding the disk usage of volumePath // or nil in case of error (invalid path, etc) func NewDiskUsage(volumePath string) *DiskUsage { + du, _ := NewDiskUsageOrError(volumePath) + return du +} + +// NewDiskUsagesOrError returns an object holding the disk usage of volumePath +// or any error (invalid path, etc) +func NewDiskUsageOrError(volumePath string) (*DiskUsage, error) { h := windows.MustLoadDLL("kernel32.dll") c := h.MustFindProc("GetDiskFreeSpaceExW") du := &DiskUsage{} - c.Call( + r1, _, err := c.Call( uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(volumePath))), uintptr(unsafe.Pointer(&du.freeBytes)), uintptr(unsafe.Pointer(&du.totalBytes)), uintptr(unsafe.Pointer(&du.availBytes))) - return du + // If the function fails, the return value is zero (0) + if r1 == 0 { + return nil, err + } + + return du, nil } // Free returns total free bytes on file system