aboutsummaryrefslogtreecommitdiff
path: root/local.go
diff options
context:
space:
mode:
authorShulhan <m.shulhan@gmail.com>2026-02-02 21:57:47 +0700
committerShulhan <m.shulhan@gmail.com>2026-02-02 21:57:47 +0700
commit2f56b620fe3267c6fac10f6d5e4a7e857d5e71e7 (patch)
tree07ae491e943ac6a7c0d571576f043eef61683e77 /local.go
parentaf01db92500d1b635bfbf70727a8e7b12ef7fe00 (diff)
downloadgolang-id-tour-2f56b620fe3267c6fac10f6d5e4a7e857d5e71e7.tar.xz
local: add support for socket based activation with systemd
The tour program now can be activated by systemd.socket(5).
Diffstat (limited to 'local.go')
-rw-r--r--local.go25
1 files changed, 24 insertions, 1 deletions
diff --git a/local.go b/local.go
index f29a822..73cf2d5 100644
--- a/local.go
+++ b/local.go
@@ -22,6 +22,7 @@ import (
"strings"
"time"
+ "git.sr.ht/~shulhan/pakakeh.go/lib/systemd"
"golang.org/x/tools/playground/socket"
// Imports so that go build/install automatically installs them.
@@ -155,7 +156,29 @@ func main() {
log.Printf("Please open your web browser and visit %s", url)
}
}()
- log.Fatal(http.ListenAndServe(httpAddr, nil))
+
+ listeners, err := systemd.Listeners(true)
+ if err != nil {
+ log.Fatal(err)
+ }
+ if len(listeners) > 1 {
+ log.Fatal(`too many listeners received for activation`)
+ }
+ var listener net.Listener
+ if len(listeners) == 1 {
+ listener = listeners[0]
+ gotAddr := listener.Addr().String()
+ if gotAddr != httpAddr {
+ log.Fatalf(`invalid Listener address, got %s, want %s`,
+ gotAddr, httpAddr)
+ }
+ }
+ if listener != nil {
+ err = http.Serve(listener, nil)
+ } else {
+ err = http.ListenAndServe(httpAddr, nil)
+ }
+ log.Fatal(err)
}
// registerStatic registers handlers to serve static content