From c134160ae47d38b468b1c5ade43e78ad5a1e616d Mon Sep 17 00:00:00 2001 From: Scott Feldman Date: Sun, 17 Dec 2023 23:30:37 -0800 Subject: [PATCH] correct netdever Accept() prototype According to man page accept(2), accept returns new client sockfd and remote peer ip:port. This patch corrects the Accept() prototype in the netdever interface to not take in an ip:port arg, but rather return an ip:port for remote peer. --- netdev.go | 2 +- tcpsock.go | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/netdev.go b/netdev.go index cdd8694..a800720 100644 --- a/netdev.go +++ b/netdev.go @@ -95,7 +95,7 @@ type netdever interface { Bind(sockfd int, ip netip.AddrPort) error Connect(sockfd int, host string, ip netip.AddrPort) error Listen(sockfd int, backlog int) error - Accept(sockfd int, ip netip.AddrPort) (int, error) + Accept(sockfd int) (int, netip.AddrPort, error) // # Flags argument on Send and Recv // diff --git a/tcpsock.go b/tcpsock.go index 5acc2b8..6f88d2f 100644 --- a/tcpsock.go +++ b/tcpsock.go @@ -119,6 +119,17 @@ func ResolveTCPAddr(network, address string) (*TCPAddr, error) { return &TCPAddr{IP: ip.AsSlice(), Port: port}, nil } +// TCPAddrFromAddrPort returns addr as a TCPAddr. If addr.IsValid() is false, +// then the returned TCPAddr will contain a nil IP field, indicating an +// address family-agnostic unspecified address. +func TCPAddrFromAddrPort(addr netip.AddrPort) *TCPAddr { + return &TCPAddr{ + IP: addr.Addr().AsSlice(), + Zone: addr.Addr().Zone(), + Port: int(addr.Port()), + } +} + // TCPConn is an implementation of the Conn interface for TCP network // connections. type TCPConn struct { @@ -277,7 +288,7 @@ type listener struct { } func (l *listener) Accept() (Conn, error) { - fd, err := netdev.Accept(l.fd, netip.AddrPort{}) + fd, raddr, err := netdev.Accept(l.fd) if err != nil { return nil, err } @@ -286,6 +297,7 @@ func (l *listener) Accept() (Conn, error) { fd: fd, net: "tcp", laddr: l.laddr, + raddr: TCPAddrFromAddrPort(raddr), }, nil } @@ -303,8 +315,7 @@ func listenTCP(laddr *TCPAddr) (Listener, error) { return nil, err } - lip, _ := netip.AddrFromSlice(laddr.IP) - laddrport := netip.AddrPortFrom(lip, uint16(laddr.Port)) + laddrport := laddr.AddrPort() err = netdev.Bind(fd, laddrport) if err != nil { return nil, err