Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
kardolus
GitHub Repository: kardolus/chatgpt-cli
Path: blob/main/config/file_lock_unix.go
3447 views
1
//go:build !windows
2
3
package config
4
5
import (
6
"fmt"
7
"os"
8
"path/filepath"
9
"syscall"
10
)
11
12
type fileLock struct {
13
path string
14
f *os.File
15
}
16
17
func newFileLock(targetPath string) *fileLock {
18
lockPath := targetPath + ".lock"
19
_ = filepath.Dir(lockPath)
20
return &fileLock{path: lockPath}
21
}
22
23
func (l *fileLock) Lock() error {
24
f, err := os.OpenFile(l.path, os.O_CREATE|os.O_RDWR, 0600)
25
if err != nil {
26
return fmt.Errorf("open lock file: %w", err)
27
}
28
l.f = f
29
30
// Exclusive lock (blocks).
31
if err := syscall.Flock(int(f.Fd()), syscall.LOCK_EX); err != nil {
32
_ = f.Close()
33
l.f = nil
34
return fmt.Errorf("flock: %w", err)
35
}
36
return nil
37
}
38
39
func (l *fileLock) Unlock() error {
40
if l.f == nil {
41
return nil
42
}
43
// Best-effort unlock + close.
44
_ = syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN)
45
err := l.f.Close()
46
l.f = nil
47
return err
48
}
49
50