From 76e5e54a674a2e8b4403589229950f0c52319576 Mon Sep 17 00:00:00 2001 From: Rohit Vighne Date: Wed, 26 Mar 2025 12:24:50 -0400 Subject: [PATCH] Listen on AF_UNIX socket if -addr is a path --- cmd/yarr/main.go | 4 ++++ src/server/server.go | 31 ++++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/cmd/yarr/main.go b/cmd/yarr/main.go index e1bfb95..3318055 100644 --- a/cmd/yarr/main.go +++ b/cmd/yarr/main.go @@ -90,6 +90,10 @@ func main() { log.SetOutput(os.Stdout) } + if open && strings.ContainsRune(addr, os.PathSeparator) { + log.Fatal("Cannot open unix socket path (", addr, ") in browser") + } + if db == "" { configPath, err := os.UserConfigDir() if err != nil { diff --git a/src/server/server.go b/src/server/server.go index d48f0a5..620eac1 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -2,7 +2,10 @@ package server import ( "log" + "net" "net/http" + "os" + "strings" "sync" "github.com/nkanaev/yarr/src/storage" @@ -53,14 +56,28 @@ func (s *Server) Start() { s.worker.RefreshFeeds() } - httpserver := &http.Server{Addr: s.Addr, Handler: s.handler()} - - var err error - if s.CertFile != "" && s.KeyFile != "" { - err = httpserver.ListenAndServeTLS(s.CertFile, s.KeyFile) - } else { - err = httpserver.ListenAndServe() + network := "tcp" + if strings.ContainsRune(s.Addr, os.PathSeparator) { + network = "unix" + err := os.Remove(s.Addr) + if err != nil { + log.Fatal(err) + } } + + ln, err := net.Listen(network, s.Addr) + if err != nil { + log.Fatal(err) + } + + httpserver := &http.Server{Handler: s.handler()} + if s.CertFile != "" && s.KeyFile != "" { + err = httpserver.ServeTLS(ln, s.CertFile, s.KeyFile) + ln.Close() + } else { + err = httpserver.Serve(ln) + } + if err != http.ErrServerClosed { log.Fatal(err) }