X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/7732d38a31d3215b26ab12e006b5bd4fda938718..247308b5cf8a51eba882abf13c5572ba8f83d0ea:/winnet.c diff --git a/winnet.c b/winnet.c index 8e1c2a1d..73369f74 100644 --- a/winnet.c +++ b/winnet.c @@ -124,6 +124,18 @@ void sk_init(void) sktree = newtree234(cmpfortree); } +void sk_cleanup(void) +{ + Actual_Socket s; + int i; + + if (sktree) { + for (i = 0; (s = index234(sktree, i)) != NULL; i++) { + closesocket(s->s); + } + } +} + char *winsock_error_string(int error) { switch (error) { @@ -381,6 +393,9 @@ static void sk_tcp_flush(Socket s) static void sk_tcp_close(Socket s); static int sk_tcp_write(Socket s, char *data, int len); static int sk_tcp_write_oob(Socket s, char *data, int len); +static void sk_tcp_set_private_ptr(Socket s, void *ptr); +static void *sk_tcp_get_private_ptr(Socket s); +static void sk_tcp_set_frozen(Socket s, int is_frozen); static char *sk_tcp_socket_error(Socket s); extern char *do_select(SOCKET skt, int startup); @@ -393,6 +408,9 @@ Socket sk_register(void *sock, Plug plug) sk_tcp_write, sk_tcp_write_oob, sk_tcp_flush, + sk_tcp_set_private_ptr, + sk_tcp_get_private_ptr, + sk_tcp_set_frozen, sk_tcp_socket_error }; @@ -439,7 +457,7 @@ Socket sk_register(void *sock, Plug plug) } Socket sk_new(SockAddr addr, int port, int privport, int oobinline, - Plug plug) + int nodelay, Plug plug) { static struct socket_function_table fn_table = { sk_tcp_plug, @@ -447,6 +465,9 @@ Socket sk_new(SockAddr addr, int port, int privport, int oobinline, sk_tcp_write, sk_tcp_write_oob, sk_tcp_flush, + sk_tcp_set_private_ptr, + sk_tcp_get_private_ptr, + sk_tcp_set_frozen, sk_tcp_socket_error }; @@ -494,6 +515,11 @@ Socket sk_new(SockAddr addr, int port, int privport, int oobinline, setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (void *) &b, sizeof(b)); } + if (nodelay) { + BOOL b = TRUE; + setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *) &b, sizeof(b)); + } + /* * Bind to local address. */ @@ -616,6 +642,9 @@ Socket sk_newlistener(int port, Plug plug, int local_host_only) sk_tcp_write, sk_tcp_write_oob, sk_tcp_flush, + sk_tcp_set_private_ptr, + sk_tcp_get_private_ptr, + sk_tcp_set_frozen, sk_tcp_socket_error }; @@ -784,7 +813,8 @@ void try_send(Actual_Socket s) s->pending_error = err; return; } else { - fatalbox(winsock_error_string(err)); + logevent(winsock_error_string(err)); + fatalbox("%s", winsock_error_string(err)); } } else { if (s->sending_oob) { @@ -920,8 +950,10 @@ int select_result(WPARAM wParam, LPARAM lParam) ret = recv(s->s, buf, sizeof(buf), MSG_OOB); noise_ultralight(ret); if (ret <= 0) { - fatalbox(ret == 0 ? "Internal networking trouble" : - winsock_error_string(WSAGetLastError())); + char *str = (ret == 0 ? "Internal networking trouble" : + winsock_error_string(WSAGetLastError())); + logevent(str); + fatalbox("%s", str); } else { return plug_receive(s->plug, 2, buf, ret); } @@ -964,7 +996,7 @@ int select_result(WPARAM wParam, LPARAM lParam) memset(&isa, 0, sizeof(struct sockaddr_in)); err = 0; - t = accept(s->s,&isa,&addrlen); + t = accept(s->s,(struct sockaddr *)&isa,&addrlen); if (t == INVALID_SOCKET) { err = WSAGetLastError(); @@ -1026,13 +1058,13 @@ void net_pending_errors(void) * Each socket abstraction contains a `void *' private field in * which the client can keep state. */ -void sk_set_private_ptr(Socket sock, void *ptr) +static void sk_tcp_set_private_ptr(Socket sock, void *ptr) { Actual_Socket s = (Actual_Socket) sock; s->private_ptr = ptr; } -void *sk_get_private_ptr(Socket sock) +static void *sk_tcp_get_private_ptr(Socket sock) { Actual_Socket s = (Actual_Socket) sock; return s->private_ptr; @@ -1053,7 +1085,7 @@ static char *sk_tcp_socket_error(Socket sock) return s->error; } -void sk_set_frozen(Socket sock, int is_frozen) +static void sk_tcp_set_frozen(Socket sock, int is_frozen) { Actual_Socket s = (Actual_Socket) sock; if (s->frozen == is_frozen)