X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/247308b5cf8a51eba882abf13c5572ba8f83d0ea..29f80613f0572e7467a3e6fa4f5122dd93671f27:/winnet.c diff --git a/winnet.c b/winnet.c index 73369f74..b5ca7415 100644 --- a/winnet.c +++ b/winnet.c @@ -368,6 +368,26 @@ void sk_getaddr(SockAddr addr, char *buf, int buflen) #endif } +int sk_addrtype(SockAddr addr) +{ + return (addr->family == AF_INET ? ADDRTYPE_IPV4 : ADDRTYPE_IPV6); +} + +void sk_addrcopy(SockAddr addr, char *buf) +{ +#ifdef IPV6 + if (addr->family == AF_INET) { +#endif + struct in_addr a; + a.s_addr = htonl(addr->address); + memcpy(buf, (char*) &a.s_addr, 4); +#ifdef IPV6 + } else { + memcpy(buf, (char*) addr->ai, 16); + } +#endif +} + void sk_addr_free(SockAddr addr) { sfree(addr); @@ -813,7 +833,9 @@ void try_send(Actual_Socket s) s->pending_error = err; return; } else { - logevent(winsock_error_string(err)); + /* We're inside the Windows frontend here, so we know + * that the frontend handle is unnecessary. */ + logevent(NULL, winsock_error_string(err)); fatalbox("%s", winsock_error_string(err)); } } else { @@ -879,6 +901,25 @@ int select_result(WPARAM wParam, LPARAM lParam) u_long atmark; /* wParam is the socket itself */ + + /* + * One user has reported an assertion failure in tree234 which + * indicates a null element pointer has been passed to a + * find*234 function. The following find234 is the only one in + * the whole program that I can see being capable of doing + * this, hence I'm forced to conclude that WinSock is capable + * of sending me netevent messages with wParam==0. I want to + * know what the rest of the message is if it does so! + */ + if (wParam == 0) { + char *str; + str = dupprintf("Strange WinSock message: wp=%08x lp=%08x", + (int)wParam, (int)lParam); + logevent(NULL, str); + connection_fatal(NULL, str); + sfree(str); + } + s = find234(sktree, (void *) wParam, cmpforsearch); if (!s) return 1; /* boggle */ @@ -952,7 +993,9 @@ int select_result(WPARAM wParam, LPARAM lParam) if (ret <= 0) { char *str = (ret == 0 ? "Internal networking trouble" : winsock_error_string(WSAGetLastError())); - logevent(str); + /* We're inside the Windows frontend here, so we know + * that the frontend handle is unnecessary. */ + logevent(NULL, str); fatalbox("%s", str); } else { return plug_receive(s->plug, 2, buf, ret); @@ -1114,3 +1157,13 @@ SOCKET next_socket(int *state) Actual_Socket s = index234(sktree, (*state)++); return s ? s->s : INVALID_SOCKET; } + +int net_service_lookup(char *service) +{ + struct servent *se; + se = getservbyname(service, NULL); + if (se != NULL) + return ntohs(se->s_port); + else + return 0; +}