From a858e94f602ca0824951d4baff441cd13c594e9e Mon Sep 17 00:00:00 2001
From: Ruben Pollan <meskio@sindominio.net>
Date: Thu, 21 Jun 2018 11:13:53 +0200
Subject: [PATCH] [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 06361101..3b8e1326 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 00000000..2c926417
--- /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)
+	}
+}
-- 
GitLab