From 8abe04cb076bfe752f3bd9e58daf1241827465e2 Mon Sep 17 00:00:00 2001
From: Daniel <dhaavi@users.noreply.github.com>
Date: Thu, 22 Aug 2024 14:22:17 +0200
Subject: [PATCH] Add missing core CLI options for Windows

---
 cmds/portmaster-core/main.go | 47 ++++++++++++++++++++++++++++++++++--
 1 file changed, 45 insertions(+), 2 deletions(-)

diff --git a/cmds/portmaster-core/main.go b/cmds/portmaster-core/main.go
index 277046cf..bc9f4f28 100644
--- a/cmds/portmaster-core/main.go
+++ b/cmds/portmaster-core/main.go
@@ -1,7 +1,7 @@
-//nolint:gci,nolintlint
 package main
 
 import (
+	"bufio"
 	"errors"
 	"flag"
 	"fmt"
@@ -23,7 +23,17 @@ import (
 	"github.com/safing/portmaster/spn/conf"
 )
 
-var sigUSR1 = syscall.Signal(0xa)
+var (
+	printStackOnExit   bool
+	enableInputSignals bool
+
+	sigUSR1 = syscall.Signal(0xa) // dummy for windows
+)
+
+func init() {
+	flag.BoolVar(&printStackOnExit, "print-stack-on-exit", false, "prints the stack before of shutting down")
+	flag.BoolVar(&enableInputSignals, "input-signals", false, "emulate signals using stdin")
+}
 
 func main() {
 	flag.Parse()
@@ -80,12 +90,21 @@ func main() {
 		err = instance.Start()
 		if err != nil {
 			fmt.Printf("instance start failed: %s\n", err)
+
+			// Print stack on start failure, if enabled.
+			if printStackOnExit {
+				printStackTo(os.Stdout, "PRINTING STACK ON START FAILURE")
+			}
+
 			os.Exit(1)
 		}
 	}()
 
 	// Wait for signal.
 	signalCh := make(chan os.Signal, 1)
+	if enableInputSignals {
+		go inputSignals(signalCh)
+	}
 	signal.Notify(
 		signalCh,
 		os.Interrupt,
@@ -139,6 +158,12 @@ func main() {
 		slog.Error("failed to stop", "err", err)
 	}
 	log.Shutdown()
+
+	// Print stack on shutdown, if enabled.
+	if printStackOnExit {
+		printStackTo(os.Stdout, "PRINTING STACK ON EXIT")
+	}
+
 	os.Exit(instance.ExitCode())
 }
 
@@ -151,3 +176,21 @@ func printStackTo(writer io.Writer, msg string) {
 		slog.Error("failed to write stack trace", "err", err)
 	}
 }
+
+func inputSignals(signalCh chan os.Signal) {
+	scanner := bufio.NewScanner(os.Stdin)
+	for scanner.Scan() {
+		switch scanner.Text() {
+		case "SIGHUP":
+			signalCh <- syscall.SIGHUP
+		case "SIGINT":
+			signalCh <- syscall.SIGINT
+		case "SIGQUIT":
+			signalCh <- syscall.SIGQUIT
+		case "SIGTERM":
+			signalCh <- syscall.SIGTERM
+		case "SIGUSR1":
+			signalCh <- sigUSR1
+		}
+	}
+}