@@ -2,6 +2,7 @@ package cmd
22
33import (
44 "context"
5+ "errors"
56 "fmt"
67 "log/slog"
78 "net"
@@ -70,49 +71,14 @@ func serveRun(
7071 socketPath string
7172 )
7273
73- if strings .HasPrefix (addr , "unix://" ) || strings .HasPrefix (addr , "unix:" ) {
74- // Unix domain socket
75- socketPath = addr
76- if strings .HasPrefix (socketPath , "unix://" ) {
77- socketPath = strings .TrimPrefix (socketPath , "unix://" )
78- } else {
79- socketPath = strings .TrimPrefix (socketPath , "unix:" )
80- }
81- // Remove stale file if exists
82- if _ , statErr := os .Stat (socketPath ); statErr == nil {
83- _ = os .Remove (socketPath )
84- }
85- lc := net.ListenConfig {}
86- lis , err = lc .Listen (ctx , "unix" , socketPath )
87- if err != nil {
88- logger .ErrorContext (ctx , "failed to listen on unix socket" , "path" , socketPath , "err" , err )
89- os .Exit (1 )
90- }
91- // Best-effort restrict permissions
92- _ = os .Chmod (socketPath , 0o600 )
93- // Ensure cleanup on exit
74+ lis , socketPath , err = setupListener (ctx , addr , logger )
75+ if err != nil {
76+ os .Exit (1 )
77+ }
78+ if socketPath != "" {
9479 defer func () {
9580 _ = os .Remove (socketPath )
9681 }()
97- logger .InfoContext (ctx , "server listening" , "address" , "unix://" + socketPath )
98- } else {
99- // TCP (allow optional tcp:// prefix)
100- if after , ok := strings .CutPrefix (addr , "tcp://" ); ok {
101- addr = after
102- }
103-
104- if addr == "" {
105- logger .ErrorContext (ctx , "empty listen address" )
106- os .Exit (1 )
107- }
108-
109- lc := net.ListenConfig {}
110- lis , err = lc .Listen (ctx , "tcp" , addr )
111- if err != nil {
112- logger .ErrorContext (ctx , "failed to listen on tcp" , "address" , addr , "err" , err )
113- os .Exit (1 )
114- }
115- logger .InfoContext (ctx , "server listening" , "address" , "tcp://" + lis .Addr ().String ())
11682 }
11783
11884 logEvents := func () []grpc_logging.LoggableEvent {
@@ -169,6 +135,62 @@ func serveRun(
169135 }
170136}
171137
138+ func setupListener (ctx context.Context , addr string , logger * slog.Logger ) (net.Listener , string , error ) {
139+ if strings .HasPrefix (addr , "unix://" ) || strings .HasPrefix (addr , "unix:" ) {
140+ return setupUnixSocketListener (ctx , addr , logger )
141+ }
142+ return setupTCPListener (ctx , addr , logger )
143+ }
144+
145+ func setupUnixSocketListener (ctx context.Context , addr string , logger * slog.Logger ) (net.Listener , string , error ) {
146+ socketPath := addr
147+ if strings .HasPrefix (socketPath , "unix://" ) {
148+ socketPath = strings .TrimPrefix (socketPath , "unix://" )
149+ } else {
150+ socketPath = strings .TrimPrefix (socketPath , "unix:" )
151+ }
152+
153+ // Remove stale file if exists
154+ if _ , statErr := os .Stat (socketPath ); statErr == nil {
155+ _ = os .Remove (socketPath )
156+ }
157+
158+ lc := net.ListenConfig {}
159+ lis , err := lc .Listen (ctx , "unix" , socketPath )
160+ if err != nil {
161+ logger .ErrorContext (ctx , "failed to listen on unix socket" , "path" , socketPath , "err" , err )
162+ return nil , "" , err
163+ }
164+
165+ // Best-effort restrict permissions
166+ _ = os .Chmod (socketPath , 0o600 )
167+ logger .InfoContext (ctx , "server listening" , "address" , "unix://" + socketPath )
168+
169+ return lis , socketPath , nil
170+ }
171+
172+ func setupTCPListener (ctx context.Context , addr string , logger * slog.Logger ) (net.Listener , string , error ) {
173+ // TCP (allow optional tcp:// prefix)
174+ if after , ok := strings .CutPrefix (addr , "tcp://" ); ok {
175+ addr = after
176+ }
177+
178+ if addr == "" {
179+ logger .ErrorContext (ctx , "empty listen address" )
180+ return nil , "" , errors .New ("empty listen address" )
181+ }
182+
183+ lc := net.ListenConfig {}
184+ lis , err := lc .Listen (ctx , "tcp" , addr )
185+ if err != nil {
186+ logger .ErrorContext (ctx , "failed to listen on tcp" , "address" , addr , "err" , err )
187+ return nil , "" , err
188+ }
189+ logger .InfoContext (ctx , "server listening" , "address" , "tcp://" + lis .Addr ().String ())
190+
191+ return lis , "" , nil
192+ }
193+
172194// grpcLogger adapts slog to grpc_logging.Logger.
173195func grpcLogger (l * slog.Logger ) grpc_logging.Logger {
174196 return grpc_logging .LoggerFunc (func (_ context.Context , lvl grpc_logging.Level , msg string , fields ... any ) {
0 commit comments