summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go41
1 files changed, 35 insertions, 6 deletions
diff --git a/main.go b/main.go
index 872749d..9ec1cd9 100644
--- a/main.go
+++ b/main.go
@@ -2,6 +2,8 @@ package main
import (
"log"
+ "net"
+ "os"
"github.com/joho/godotenv"
@@ -41,12 +43,22 @@ func main() {
if argv.Server {
server := api.MakeServer(argv, dbConn)
- log.Printf("listening on :%d", argv.Port)
- go func() {
- if err := server.ListenAndServe(); err != nil {
- log.Fatal(err)
- }
- }()
+ if argv.Socket != "" {
+ listener := unixListener(argv.Socket)
+ log.Printf("listening on unix socket %s", argv.Socket)
+ go func() {
+ if err := server.Serve(listener); err != nil {
+ log.Fatal(err)
+ }
+ }()
+ } else {
+ log.Printf("listening on :%d", argv.Port)
+ go func() {
+ if err := server.ListenAndServe(); err != nil {
+ log.Fatal(err)
+ }
+ }()
+ }
}
if argv.Dns {
@@ -63,3 +75,20 @@ func main() {
select {}
}
}
+
+// unixListener binds an HTTP unix socket, clearing any stale socket left by a
+// previous run and relaxing perms to 0660 so a same-group reverse proxy can
+// reach it.
+func unixListener(path string) net.Listener {
+ if err := os.Remove(path); err != nil && !os.IsNotExist(err) {
+ log.Fatalf("could not clear stale socket %s: %v", path, err)
+ }
+ listener, err := net.Listen("unix", path)
+ if err != nil {
+ log.Fatal(err)
+ }
+ if err := os.Chmod(path, 0o660); err != nil {
+ log.Fatalf("could not chmod socket %s: %v", path, err)
+ }
+ return listener
+}