diff options
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/golangorg/server.go | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/cmd/golangorg/server.go b/cmd/golangorg/server.go index 7eb2b628..da033e95 100644 --- a/cmd/golangorg/server.go +++ b/cmd/golangorg/server.go @@ -18,6 +18,7 @@ import ( "io" "io/fs" "log" + "net" "net/http" "net/url" "os" @@ -32,6 +33,7 @@ import ( "time" "cloud.google.com/go/datastore" + "git.sr.ht/~shulhan/pakakeh.go/lib/systemd" "golang.org/x/build/relnote" "golang.org/x/build/repos" "golang.org/x/website" @@ -129,10 +131,34 @@ func main() { handler = loggingHandler(handler) } - // Start http server. - fmt.Fprintf(os.Stderr, "serving http://%s\n", *httpAddr) - if err := http.ListenAndServe(*httpAddr, handler); err != nil { - log.Fatalf("ListenAndServe %s: %v", *httpAddr, err) + 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.Fatal(`invalid Listener address, got %s, want %s`, + gotAddr, *httpAddr) + } + } + + if listener == nil { + // Start http server. + fmt.Fprintf(os.Stderr, "serving http://%s\n", *httpAddr) + if err := http.ListenAndServe(*httpAddr, handler); err != nil { + log.Fatalf("ListenAndServe %s: %v", *httpAddr, err) + } + } else { + fmt.Fprintf(os.Stderr, "serving using Listener at %s\n", *httpAddr) + if err := http.Serve(listener, handler); err != nil { + log.Fatalf("Serve %s: %v", *httpAddr, err) + } } } |
