diff --git a/fallocate/doc.go b/fallocate/doc.go new file mode 100644 index 0000000..8fccdcd --- /dev/null +++ b/fallocate/doc.go @@ -0,0 +1,9 @@ +// Copyright (C) 2024 Sumner Evans +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package fallocate provides a unified interface for preallocating space for a +// file. +package fallocate diff --git a/fallocate/fallocate_darwin.go b/fallocate/fallocate_darwin.go new file mode 100644 index 0000000..846910b --- /dev/null +++ b/fallocate/fallocate_darwin.go @@ -0,0 +1,29 @@ +// Copyright (C) 2024 Sumner Evans +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +//go:build darwin + +package fallocate + +import ( + "os" + + "golang.org/x/sys/unix" +) + +var ErrOutOfSpace error = unix.ENOSPC + +func Fallocate(file *os.File, size int) error { + if size <= 0 { + return nil + } + return unix.FcntlFstore(uintptr(file.Fd()), unix.F_PREALLOCATE, &unix.Fstore_t{ + Flags: unix.F_ALLOCATEALL, + Posmode: unix.F_PEOFPOSMODE, + Offset: 0, + Length: int64(size), + }) +} diff --git a/fallocate/fallocate_linux.go b/fallocate/fallocate_linux.go new file mode 100644 index 0000000..5b137a6 --- /dev/null +++ b/fallocate/fallocate_linux.go @@ -0,0 +1,24 @@ +// Copyright (C) 2024 Sumner Evans +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +//go:build linux + +package fallocate + +import ( + "os" + + "golang.org/x/sys/unix" +) + +var ErrOutOfSpace error = unix.ENOSPC + +func Fallocate(file *os.File, size int) error { + if size <= 0 { + return nil + } + return unix.Fallocate(int(file.Fd()), 0, 0, int64(size)) +} diff --git a/fallocate/fallocate_unknown.go b/fallocate/fallocate_unknown.go new file mode 100644 index 0000000..3f7aacf --- /dev/null +++ b/fallocate/fallocate_unknown.go @@ -0,0 +1,17 @@ +// Copyright (C) 2024 Sumner Evans +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +//go:build !linux && !android && !darwin + +package fallocate + +import "os" + +var ErrOutOfSpace error = nil + +func Fallocate(file *os.File, size int) error { + return nil +}