summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-store/storage/fs.go
blob: 444cee4b02af2ff6f5f7ca5386ebd3b4bc23ba9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package storage

import (
	"os"
	"syscall"

	"codeberg.org/gruf/go-store/util"
)

const (
	defaultDirPerms      = 0755
	defaultFilePerms     = 0644
	defaultFileROFlags   = syscall.O_RDONLY
	defaultFileRWFlags   = syscall.O_CREAT | syscall.O_RDWR
	defaultFileLockFlags = syscall.O_RDONLY | syscall.O_EXCL | syscall.O_CREAT
)

// NOTE:
// These functions are for opening storage files,
// not necessarily for e.g. initial setup (OpenFile)

// open should not be called directly
func open(path string, flags int) (*os.File, error) {
	var fd int
	err := util.RetryOnEINTR(func() (err error) {
		fd, err = syscall.Open(path, flags, defaultFilePerms)
		return
	})
	if err != nil {
		return nil, err
	}
	return os.NewFile(uintptr(fd), path), nil
}

// stat checks for a file on disk
func stat(path string) (bool, error) {
	var stat syscall.Stat_t
	err := util.RetryOnEINTR(func() error {
		return syscall.Stat(path, &stat)
	})
	if err != nil {
		if err == syscall.ENOENT {
			err = nil
		}
		return false, err
	}
	return true, nil
}