From a858e94f602ca0824951d4baff441cd13c594e9e Mon Sep 17 00:00:00 2001 From: Ruben Pollan Date: Thu, 21 Jun 2018 11:13:53 +0200 Subject: [bug] add windows support to the pid file - Resolves: #43 --- pid.go | 34 +++++++++++++++++++++++++--------- pid_test.go | 21 +++++++++++++++++++++ 2 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 pid_test.go diff --git a/pid.go b/pid.go index 0636110..3b8e132 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 0000000..2c92641 --- /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) + } +} -- cgit v1.2.3