mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-03 06:01:52 +08:00
39 lines
792 B
Go
39 lines
792 B
Go
//go:build !windows
|
|
|
|
package single_instance
|
|
|
|
import (
|
|
"os"
|
|
"strconv"
|
|
"syscall"
|
|
)
|
|
|
|
// CreateLockFile tries to create a file with given name and acquire an
|
|
// exclusive lock on it. If the file already exists AND is still locked, it will
|
|
// fail.
|
|
func CreateLockFile(filename string, PID int) (*os.File, error) {
|
|
file, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0600)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = syscall.Flock(int(file.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
|
|
if err != nil {
|
|
file.Close()
|
|
return nil, err
|
|
}
|
|
|
|
// Write PID to lock file
|
|
contents := strconv.Itoa(PID)
|
|
if err := file.Truncate(0); err != nil {
|
|
file.Close()
|
|
return nil, err
|
|
}
|
|
if _, err := file.WriteString(contents); err != nil {
|
|
file.Close()
|
|
return nil, err
|
|
}
|
|
|
|
return file, nil
|
|
}
|