Files
rvbox/internal/client/spool/lock_unix.go
T

48 lines
958 B
Go

//go:build !windows
package spool
import (
"errors"
"os"
"syscall"
)
func acquireInstanceLock(path string) (func() error, error) {
if err := ensurePrivateFile(path); err != nil {
return nil, err
}
file, err := os.OpenFile(path, os.O_RDWR, 0)
if err != nil {
return nil, err
}
if err := syscall.Flock(int(file.Fd()), syscall.LOCK_EX|syscall.LOCK_NB); err != nil {
_ = file.Close()
if errors.Is(err, syscall.EWOULDBLOCK) {
return nil, ErrAlreadyOpen
}
return nil, err
}
return func() error {
unlockErr := syscall.Flock(int(file.Fd()), syscall.LOCK_UN)
closeErr := file.Close()
if unlockErr != nil {
return unlockErr
}
return closeErr
}, nil
}
func syncDirectory(path string) error {
directory, err := os.Open(path)
if err != nil {
return err
}
defer directory.Close()
return directory.Sync()
}
func replaceIdentityFile(temporaryPath, targetPath string) error {
return os.Rename(temporaryPath, targetPath)
}