UNSAFE MODULE; IMPORT Ctypes, IP, IPError, TCP, TCPWin32, WinSock; PROCEDURE TCPExtras LocalEndpoint (conn: TCP.T): IP.Endpoint RAISES {IP.Error} = VAR addr : WinSock.struct_sockaddr_in; len : Ctypes.int := BYTESIZE (addr); ep : IP.Endpoint; BEGIN LOCK conn DO IF conn.closed THEN IPError.Raise (TCP.Closed); END; IF WinSock.getsockname (conn.sock, ADR (addr), ADR (len)) # 0 THEN IPError.RaiseUnexpected (); END; END; ep.addr := LOOPHOLE (addr.sin_addr, IP.Address); ep.port := WinSock.ntohs (addr.sin_port); RETURN ep; END LocalEndpoint; PROCEDUREhtons (s: Ctypes.unsigned_short_int): Ctypes.unsigned_short_int = BEGIN RETURN WinSock.htons (s); END htons; PROCEDUREntohs (s: Ctypes.unsigned_short_int): Ctypes.unsigned_short_int = BEGIN RETURN WinSock.ntohs (s); END ntohs; BEGIN END TCPExtras.