@@ -7,12 +7,26 @@ import (
77 "context"
88 "fmt"
99 "net"
10+ "os"
11+ "path/filepath"
1012 "strconv"
1113
1214 "github.com/sirupsen/logrus"
1315)
1416
1517func Listen (ctx context.Context , listenConfig net.ListenConfig , hostAddress string ) (net.Listener , error ) {
18+ if filepath .IsAbs (hostAddress ) {
19+ // Handle Unix domain sockets
20+ if err := prepareUnixSocket (hostAddress ); err != nil {
21+ return nil , err
22+ }
23+ unixLis , err := listenConfig .Listen (ctx , "unix" , hostAddress )
24+ if err != nil {
25+ logrus .WithError (err ).Errorf ("failed to listen unix: %v" , hostAddress )
26+ return nil , err
27+ }
28+ return unixLis , nil
29+ }
1630 localIPStr , localPortStr , _ := net .SplitHostPort (hostAddress )
1731 localIP := net .ParseIP (localIPStr )
1832 localPort , _ := strconv .Atoi (localPortStr )
@@ -34,6 +48,18 @@ func Listen(ctx context.Context, listenConfig net.ListenConfig, hostAddress stri
3448}
3549
3650func ListenPacket (ctx context.Context , listenConfig net.ListenConfig , hostAddress string ) (net.PacketConn , error ) {
51+ if filepath .IsAbs (hostAddress ) {
52+ // Handle Unix domain sockets
53+ if err := prepareUnixSocket (hostAddress ); err != nil {
54+ return nil , err
55+ }
56+ unixLis , err := listenConfig .ListenPacket (ctx , "unix" , hostAddress )
57+ if err != nil {
58+ logrus .WithError (err ).Errorf ("failed to listen unix: %v" , hostAddress )
59+ return nil , err
60+ }
61+ return unixLis , nil
62+ }
3763 localIPStr , localPortStr , _ := net .SplitHostPort (hostAddress )
3864 localIP := net .ParseIP (localIPStr )
3965 localPort , _ := strconv .Atoi (localPortStr )
@@ -54,6 +80,16 @@ func ListenPacket(ctx context.Context, listenConfig net.ListenConfig, hostAddres
5480 return & pseudoLoopbackPacketConn {udpConn }, nil
5581}
5682
83+ func prepareUnixSocket (hostSocket string ) error {
84+ if err := os .RemoveAll (hostSocket ); err != nil {
85+ return fmt .Errorf ("can't clean up %q: %w" , hostSocket , err )
86+ }
87+ if err := os .MkdirAll (filepath .Dir (hostSocket ), 0o755 ); err != nil {
88+ return fmt .Errorf ("can't create directory for local socket %q: %w" , hostSocket , err )
89+ }
90+ return nil
91+ }
92+
5793type pseudoLoopbackListener struct {
5894 net.Listener
5995}
0 commit comments