package app import ( "errors" "log" "net" "net/http" "os" "path/filepath" ) func startServers(cfg Config, handler http.Handler) ([]*http.Server, func(), error) { var servers []*http.Server cleanup := func() {} if cfg.ListenAddr != "" { srv := &http.Server{Addr: cfg.ListenAddr, Handler: handler} servers = append(servers, srv) go func() { if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { log.Printf("tcp server error: %v", err) } }() } if cfg.UnixSocketPath != "" { if err := os.MkdirAll(filepath.Dir(cfg.UnixSocketPath), 0o755); err != nil { return nil, cleanup, err } _ = os.Remove(cfg.UnixSocketPath) ln, err := net.Listen("unix", cfg.UnixSocketPath) if err != nil { return nil, cleanup, err } if err := os.Chmod(cfg.UnixSocketPath, 0o666); err != nil { return nil, cleanup, err } srv := &http.Server{Handler: handler} servers = append(servers, srv) go func() { if err := srv.Serve(ln); err != nil && !errors.Is(err, http.ErrServerClosed) { log.Printf("unix server error: %v", err) } }() cleanup = func() { _ = ln.Close() _ = os.Remove(cfg.UnixSocketPath) } } if len(servers) == 0 { return nil, cleanup, errors.New("no listeners configured, set LISTEN_ADDR and/or UNIX_SOCKET_PATH") } return servers, cleanup, nil }