diff --git a/pid.go b/pid.go index 0636110159f8a8a35101ed5be393fef9d74fc241..3b8e1326fd6e67ac67d764ad71e17ae6ff5df56f 100644 --- a/pid.go +++ b/pid.go @@ -3,8 +3,10 @@ package main import ( "fmt" "io/ioutil" + "log" "os" "path/filepath" + "runtime" "strconv" "syscall" @@ -20,15 +22,8 @@ func acquirePID() error { return err } - if current != 0 && current != pid { - proc, err := os.FindProcess(current) - if err != nil { - return err - } - err = proc.Signal(syscall.Signal(0)) - if err == nil { - return fmt.Errorf("Another systray is running with pid: %d", current) - } + if current != pid && pidRunning(current) { + return fmt.Errorf("Another systray is running with pid: %d", current) } return setPID(pid) @@ -85,3 +80,24 @@ func setPID(pid int) error { _, err = file.WriteString(fmt.Sprintf("%d", pid)) return err } + +func pidRunning(pid int) bool { + if pid == 0 { + return false + } + + proc, err := os.FindProcess(pid) + if runtime.GOOS == "windows" { + return err == nil + } + + if err != nil { + log.Printf("An error ocurred finding process: %v", err) + return false + } + err = proc.Signal(syscall.Signal(0)) + if err == nil { + return true + } + return false +} diff --git a/pid_test.go b/pid_test.go new file mode 100644 index 0000000000000000000000000000000000000000..2c926417e59f86e2bf7e0f4fe92358b80de04d95 --- /dev/null +++ b/pid_test.go @@ -0,0 +1,21 @@ +package main + +import ( + "syscall" + "testing" +) + +const ( + invalidPid = 345678 +) + +func TestPidRunning(t *testing.T) { + pid := syscall.Getpid() + if !pidRunning(pid) { + t.Errorf("pid %v is not running", pid) + } + + if pidRunning(invalidPid) { + t.Errorf("pid %v is running", invalidPid) + } +}