aboutsummaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorGrégoire Duchêne <gduchene@awhk.org>2021-07-10 21:28:44 +0100
committerGrégoire Duchêne <gduchene@awhk.org>2021-07-10 21:28:44 +0100
commit3995a5f5677a3f911d57a8808d7aca8cd57a5821 (patch)
tree9520c33f95058aca8a6e76245a6b7e5654dd7b37 /main.go
parente9ccaea8c006eb1e2d8365352f7380cd79966888 (diff)
Add systemd socket supportv0.3.0
Diffstat (limited to 'main.go')
-rw-r--r--main.go62
1 files changed, 42 insertions, 20 deletions
diff --git a/main.go b/main.go
index 090331f..5a000b3 100644
--- a/main.go
+++ b/main.go
@@ -18,6 +18,7 @@ import (
"golang.org/x/sys/unix"
"go.awhk.org/fwdsms/pkg/twilio"
+ "go.awhk.org/gosdd"
)
var cfgFilename = flag.String("c", "/etc/fwdsms.yaml", "configuration file")
@@ -49,29 +50,18 @@ func main() {
Handler: twilio.EmptyResponseHandler,
},
}))
+
srv := http.Server{Handler: r}
go func() {
- var (
- l net.Listener
- err error
- )
- if cfg.Twilio.Address != "" && cfg.Twilio.Address[0] == '/' {
- if l, err = net.Listen("unix", cfg.Twilio.Address); err != nil {
- log.Fatalf("Could not set up UNIX listener: %v.", err)
- }
- if err = os.Chmod(cfg.Twilio.Address, 0666); err != nil {
- log.Fatalf("Could not set up permissions on UNIX socket: %v.", err)
- }
- } else {
- if cfg.Twilio.Address == "" {
- cfg.Twilio.Address = ":8080"
- }
- if l, err = net.Listen("tcp", cfg.Twilio.Address); err != nil {
- log.Fatalf("Could not set up TCP listener: %v.", err)
- }
+ ln, err := listenSD()
+ if err != nil {
+ log.Fatalf("Failed to listen on systemd socket: %s.", err)
+ }
+ if ln == nil {
+ ln = listenEnv(cfg)
}
- if err = srv.Serve(l); err != nil && err != http.ErrServerClosed {
- log.Fatalf("Failed to serve HTTP: %v.", err)
+ if err = srv.Serve(ln); err != nil && err != http.ErrServerClosed {
+ log.Fatalf("Failed to serve HTTP: %s.", err)
}
}()
@@ -87,3 +77,35 @@ func main() {
log.Fatalf("Failed to properly shut down the HTTP server: %v.", err)
}
}
+
+func listenEnv(cfg *Config) net.Listener {
+ if cfg.Twilio.Address != "" && cfg.Twilio.Address[0] == '/' {
+ ln, err := net.Listen("unix", cfg.Twilio.Address)
+ if err != nil {
+ log.Fatalf("Could not set up UNIX listener: %s.", err)
+ }
+ if err := os.Chmod(cfg.Twilio.Address, 0666); err != nil {
+ log.Fatalf("Could not set up permissions on UNIX socket: %s.", err)
+ }
+ return ln
+ }
+ ln, err := net.Listen("tcp", cfg.Twilio.Address)
+ if err != nil {
+ log.Fatalf("Could not set up TCP listener: %s.", err)
+ }
+ return ln
+}
+
+func listenSD() (net.Listener, error) {
+ fds, err := gosdd.SDListenFDs(true)
+ if err != nil {
+ if err == gosdd.ErrNoSDSupport {
+ return nil, nil
+ }
+ return nil, err
+ }
+ if len(fds) == 0 {
+ return nil, nil
+ }
+ return net.FileListener(fds[0])
+}