Tchannel OS_server_connection_accept (Tchannel channel, void * peer_host, unsigned int * peer_port) { static struct sockaddr_in address; SOCKET s; { unsigned long nonblockp = (CHANNEL_NONBLOCKING (channel)); VOID_SOCKET_CALL (ioctlsocket, ((CHANNEL_SOCKET (channel)), FIONBIO, (&nonblockp))); } { int address_length = (sizeof (struct sockaddr_in)); s = (accept ((CHANNEL_SOCKET (channel)), ((struct sockaddr *) (&address)), (&address_length))); } if (s == INVALID_SOCKET) { DWORD code = (WSAGetLastError ()); if (code == WSAEWOULDBLOCK) return (NO_CHANNEL); NT_error_api_call (code, apicall_accept); } transaction_begin (); socket_close_on_abort (s); if (peer_host != 0) memcpy (peer_host, (& (address . sin_addr)), (sizeof (address . sin_addr))); if (peer_port != 0) (*peer_port) = (address . sin_port); RETURN_SOCKET (s, NT_channel_class_tcp_stream_socket); }
void OS_shutdown_socket (Tchannel channel, unsigned long how) { VOID_SOCKET_CALL (shutdown, ((CHANNEL_SOCKET (channel)), ((how == 1) ? SD_RECEIVE : (how == 2) ? SD_SEND : SD_BOTH))); }
void OS_bind_tcp_server_socket (Tchannel channel, void * host, unsigned int port) { struct sockaddr_in address; BOOL one = 1; memset ((&address), 0, (sizeof (address))); (address . sin_family) = AF_INET; memcpy ((& (address . sin_addr)), host, (sizeof (address . sin_addr))); (address . sin_port) = port; VOID_SOCKET_CALL (setsockopt, ((CHANNEL_SOCKET (channel)), SOL_SOCKET, SO_REUSEADDR, ((void *) (&one)), (sizeof (one)))); VOID_SOCKET_CALL (bind, ((CHANNEL_SOCKET (channel)), ((struct sockaddr *) (&address)), (sizeof (struct sockaddr_in)))); }
Tchannel OS_open_tcp_stream_socket (void * host, unsigned int port) { SOCKET s; struct sockaddr_in address; SOCKET_SOCKET_CALL (socket, (PF_INET, SOCK_STREAM, 0), s); transaction_begin (); socket_close_on_abort (s); memset ((&address), 0, (sizeof (address))); (address . sin_family) = AF_INET; memcpy ((& (address . sin_addr)), host, (sizeof (address . sin_addr))); (address . sin_port) = port; VOID_SOCKET_CALL (connect, (s, ((struct sockaddr *) (&address)), (sizeof (address)))); RETURN_SOCKET (s, NT_channel_class_tcp_stream_socket); }
void OS_listen_tcp_server_socket (Tchannel channel) { VOID_SOCKET_CALL (listen, ((CHANNEL_SOCKET (channel)), SOCKET_LISTEN_BACKLOG)); }