aboutsummaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-02-18 09:16:56 +0800
committerRunxi Yu <me@runxiyu.org>2025-02-18 09:16:56 +0800
commitfa267ded97fbac488f019f3bf7c3c772bb1785de (patch)
tree5f055a1d13bf6e4abeee04d7a4c89a42b9dfcc4a /main.go
parenthooks: Fix the race condition that causes EPIPE (diff)
downloadforge-fa267ded97fbac488f019f3bf7c3c772bb1785de.tar.gz
forge-fa267ded97fbac488f019f3bf7c3c772bb1785de.tar.zst
forge-fa267ded97fbac488f019f3bf7c3c772bb1785de.zip
main.go: Remove stale UNIX domain sockets
Diffstat (limited to 'main.go')
-rw-r--r--main.go39
1 files changed, 35 insertions, 4 deletions
diff --git a/main.go b/main.go
index b4e511d..9f1606b 100644
--- a/main.go
+++ b/main.go
@@ -1,9 +1,11 @@
package main
import (
+ "errors"
"flag"
"net"
"net/http"
+ "syscall"
"go.lindenii.runxiyu.org/lindenii-common/clog"
)
@@ -27,8 +29,19 @@ func main() {
}
// UNIX socket listener for hooks
- hooks_listener, err := net.Listen("unix", config.Hooks.Socket)
- if err != nil {
+ var hooks_listener net.Listener
+ var err error
+ hooks_listener, err = net.Listen("unix", config.Hooks.Socket)
+ if errors.Is(err, syscall.EADDRINUSE) {
+ clog.Warn("Removing stale socket " + config.Hooks.Socket)
+ if err := syscall.Unlink(config.Hooks.Socket); err != nil {
+ clog.Fatal(1, "Removing stale socket: "+err.Error())
+ }
+ hooks_listener, err = net.Listen("unix", config.Hooks.Socket)
+ if err != nil {
+ clog.Fatal(1, "Listening hooks: "+err.Error())
+ }
+ } else if err != nil {
clog.Fatal(1, "Listening hooks: "+err.Error())
}
clog.Info("Listening hooks on unix " + config.Hooks.Socket)
@@ -40,7 +53,16 @@ func main() {
// SSH listener
ssh_listener, err := net.Listen(config.SSH.Net, config.SSH.Addr)
- if err != nil {
+ if errors.Is(err, syscall.EADDRINUSE) && config.SSH.Net == "unix" {
+ clog.Warn("Removing stale socket " + config.SSH.Addr)
+ if err := syscall.Unlink(config.SSH.Addr); err != nil {
+ clog.Fatal(1, "Removing stale socket: "+err.Error())
+ }
+ ssh_listener, err = net.Listen(config.SSH.Net, config.SSH.Addr)
+ if err != nil {
+ clog.Fatal(1, "Listening SSH: "+err.Error())
+ }
+ } else if err != nil {
clog.Fatal(1, "Listening SSH: "+err.Error())
}
clog.Info("Listening SSH on " + config.SSH.Net + " " + config.SSH.Addr)
@@ -52,7 +74,16 @@ func main() {
// HTTP listener
http_listener, err := net.Listen(config.HTTP.Net, config.HTTP.Addr)
- if err != nil {
+ if errors.Is(err, syscall.EADDRINUSE) && config.HTTP.Net == "unix" {
+ clog.Warn("Removing stale socket " + config.HTTP.Addr)
+ if err := syscall.Unlink(config.HTTP.Addr); err != nil {
+ clog.Fatal(1, "Removing stale socket: "+err.Error())
+ }
+ http_listener, err = net.Listen(config.HTTP.Net, config.HTTP.Addr)
+ if err != nil {
+ clog.Fatal(1, "Listening HTTP: "+err.Error())
+ }
+ } else if err != nil {
clog.Fatal(1, "Listening HTTP: "+err.Error())
}
clog.Info("Listening HTTP on " + config.HTTP.Net + " " + config.HTTP.Addr)