// Package uds was auto-translated from rust-libp2p. // https://github.com/libp2p/rust-libp2p/blob/master/transports/uds/src/lib.rs
package uds import ( logging ma mafmt manet ) const defaultConnectTimeout = 5 * time.Second var log = logging.Logger("uds-tpt") // UdsTransport is the Unix Domain Socket transport. type UdsTransport struct { upgrader transport.Upgrader connectTimeout time.Duration rcmgr network.ResourceManager } var _ transport.Transport = &UdsTransport{} var _ transport.DialUpdater = &UdsTransport{} // NewUDSTransport creates a UDS transport object. func ( transport.Upgrader, network.ResourceManager, ...func(*UdsTransport) error) (*UdsTransport, error) { if == nil { = &network.NullResourceManager{} } := &UdsTransport{ upgrader: , connectTimeout: defaultConnectTimeout, rcmgr: , } for , := range { if := (); != nil { return nil, } } return , nil } var udsMatcher = mafmt.Base(ma.P_UNIX) // CanDial returns true if this transport believes it can dial the given multiaddr. func ( *UdsTransport) ( ma.Multiaddr) bool { return udsMatcher.Matches() } func multiaddrToPath( ma.Multiaddr) (string, error) { for , := range .Protocols() { if .Code == ma.P_UNIX { , := .ValueForProtocol(ma.P_UNIX) if != nil { return "", } if !filepath.IsAbs() { return "", errors.New("unix socket path must be absolute") } return , nil } } return "", errors.New("not a unix multiaddr") } func ( *UdsTransport) ( context.Context, ma.Multiaddr) (manet.Conn, error) { if .connectTimeout > 0 { var context.CancelFunc , = context.WithTimeout(, .connectTimeout) defer () } , := multiaddrToPath() if != nil { return nil, } var net.Dialer , := .DialContext(, "unix", ) if != nil { return nil, } return manet.WrapNetConn() } // Dial dials the peer at the remote address. func ( *UdsTransport) ( context.Context, ma.Multiaddr, peer.ID) (transport.CapableConn, error) { return .DialWithUpdates(, , , nil) } func ( *UdsTransport) ( context.Context, ma.Multiaddr, peer.ID, chan<- transport.DialUpdate) (transport.CapableConn, error) { , := .rcmgr.OpenConnection(network.DirOutbound, true, ) if != nil { log.Debugw("resource manager blocked outgoing connection", "peer", , "addr", , "error", ) return nil, } , := .dialWithScope(, , , , ) if != nil { .Done() return nil, } return , nil } func ( *UdsTransport) ( context.Context, ma.Multiaddr, peer.ID, network.ConnManagementScope, chan<- transport.DialUpdate) (transport.CapableConn, error) { if := .SetPeer(); != nil { log.Debugw("resource manager blocked outgoing connection for peer", "peer", , "addr", , "error", ) return nil, } , := .maDial(, ) if != nil { return nil, } if != nil { select { case <- transport.DialUpdate{Kind: transport.UpdateKindHandshakeProgressed, Addr: }: default: } } := network.DirOutbound if , , := network.GetSimultaneousConnect(); && ! { = network.DirInbound } return .upgrader.Upgrade(, , , , , ) } // Listen listens on the given multiaddr. func ( *UdsTransport) ( ma.Multiaddr) (transport.Listener, error) { , := multiaddrToPath() if != nil { return nil, } if := os.RemoveAll(); != nil && !os.IsNotExist() { return nil, fmt.Errorf("failed to remove old unix socket: %w", ) } , := net.Listen("unix", ) if != nil { return nil, } , := manet.WrapNetListener() if != nil { .Close() return nil, } return .upgrader.UpgradeListener(, ), nil } // Protocols returns the list of terminal protocols this transport can dial. func ( *UdsTransport) () []int { return []int{ma.P_UNIX} } // Proxy always returns false for the UDS transport. func ( *UdsTransport) () bool { return false } func ( *UdsTransport) () string { return "UDS" }