From 5975c71b4f68cc484c7a3c03c5d1ab96b14782d2 Mon Sep 17 00:00:00 2001 From: Randall Winkhart Date: Sun, 4 May 2025 20:03:23 -0400 Subject: [PATCH] Ensure listener is closed even if the daemon is killed unexpectedly --- daemon/2serverUNIXGeneric.go | 11 +++++++++++ daemon/2serverWindows.go | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/daemon/2serverUNIXGeneric.go b/daemon/2serverUNIXGeneric.go index 552b15e..079a06d 100644 --- a/daemon/2serverUNIXGeneric.go +++ b/daemon/2serverUNIXGeneric.go @@ -8,7 +8,9 @@ import ( "net" "net/rpc" "os" + "os/signal" "strconv" + "syscall" "time" peercred "github.com/rwinkhart/peercred-mini" @@ -35,6 +37,15 @@ func Start(passphrase string) { defer listener.Close() log.Printf("RPC daemon listening on unix://%s", socketPath) + // capture sigterms to ensure listener is closed + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM) + go func() { + <-sigChan + listener.Close() + os.Exit(0) + }() + // accept connections (timeout after 3 minutes of inactivity) for { listener.(*net.UnixListener).SetDeadline(time.Now().Add(3 * time.Minute)) diff --git a/daemon/2serverWindows.go b/daemon/2serverWindows.go index b69baec..65edf51 100644 --- a/daemon/2serverWindows.go +++ b/daemon/2serverWindows.go @@ -8,6 +8,8 @@ import ( "net" "net/rpc" "os" + "os/signal" + "syscall" "time" "github.com/Microsoft/go-winio" // For Windows named pipes @@ -48,6 +50,9 @@ func Start(passphrase string) { defer listener.Close() log.Printf("RPC daemon listening on %s", socketPath) + // capture sigterms to ensure listener is closed + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM) // create 3-minute inactivity timer timer := time.NewTimer(3 * time.Minute) killTimer := make(chan struct{}) @@ -59,6 +64,9 @@ func Start(passphrase string) { os.Exit(0) case <-killTimer: return + case <-sigChan: + listener.Close() + os.Exit(0) } }()