X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=unix%2Fuxnet.c;h=235d6fd97d039d3ed2f97167e68e4285935981ee;hb=f004bcca17a789356c32527a396b68b71a773db2;hp=0bd0f9f5efb06055ea6ab897450ce3b95aebf30b;hpb=6f6e9db932589470975ecc23261cd57eb9e710be;p=PuTTY.git diff --git a/unix/uxnet.c b/unix/uxnet.c index 0bd0f9f5..235d6fd9 100644 --- a/unix/uxnet.c +++ b/unix/uxnet.c @@ -75,7 +75,6 @@ struct Socket_tag { const char *error; int s; Plug plug; - void *private_ptr; bufchain output_data; int connected; /* irrelevant for listening sockets */ int writable; @@ -127,9 +126,12 @@ struct SockAddr_tag { (addr)->superfamily == UNIX ? AF_UNIX : \ (step).ai ? (step).ai->ai_family : AF_INET) #else +/* Here we gratuitously reference 'step' to avoid gcc warnings about + * 'set but not used' when compiling -DNO_IPV6 */ #define SOCKADDR_FAMILY(addr, step) \ ((addr)->superfamily == UNRESOLVED ? AF_UNSPEC : \ - (addr)->superfamily == UNIX ? AF_UNIX : AF_INET) + (addr)->superfamily == UNIX ? AF_UNIX : \ + (step).curraddr ? AF_INET : AF_INET) #endif /* @@ -222,7 +224,11 @@ SockAddr sk_namelookup(const char *host, char **canonicalname, int address_famil hints.ai_addr = NULL; hints.ai_canonname = NULL; hints.ai_next = NULL; - err = getaddrinfo(host, NULL, &hints, &ret->ais); + { + char *trimmed_host = host_strduptrim(host); /* strip [] on literals */ + err = getaddrinfo(trimmed_host, NULL, &hints, &ret->ais); + sfree(trimmed_host); + } if (err != 0) { ret->error = gai_strerror(err); return ret; @@ -338,6 +344,15 @@ void sk_getaddr(SockAddr addr, char *buf, int buflen) } } +int sk_addr_needs_port(SockAddr addr) +{ + if (addr->superfamily == UNRESOLVED || addr->superfamily == UNIX) { + return FALSE; + } else { + return TRUE; + } +} + int sk_hostname_is_local(const char *name) { return !strcmp(name, "localhost") || @@ -469,8 +484,6 @@ static void sk_tcp_close(Socket s); static int sk_tcp_write(Socket s, const char *data, int len); static int sk_tcp_write_oob(Socket s, const char *data, int len); static void sk_tcp_write_eof(Socket s); -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 const char *sk_tcp_socket_error(Socket s); @@ -481,8 +494,6 @@ static struct socket_function_table tcp_fn_table = { sk_tcp_write_oob, sk_tcp_write_eof, sk_tcp_flush, - sk_tcp_set_private_ptr, - sk_tcp_get_private_ptr, sk_tcp_set_frozen, sk_tcp_socket_error }; @@ -769,7 +780,7 @@ Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only, i { int s; #ifndef NO_IPV6 - struct addrinfo hints, *ai; + struct addrinfo hints, *ai = NULL; char portstr[6]; #endif union sockaddr_union u; @@ -799,6 +810,7 @@ Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only, i ret->incomingeof = FALSE; ret->listener = 1; ret->addr = NULL; + ret->s = -1; /* * Translate address_family from platform-independent constants @@ -863,7 +875,11 @@ Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only, i hints.ai_next = NULL; assert(port >= 0 && port <= 99999); sprintf(portstr, "%d", port); - retcode = getaddrinfo(srcaddr, portstr, &hints, &ai); + { + char *trimmed_addr = host_strduptrim(srcaddr); + retcode = getaddrinfo(trimmed_addr, portstr, &hints, &ai); + sfree(trimmed_addr); + } if (retcode == 0) { addr = (union sockaddr_union *)ai->ai_addr; addrlen = ai->ai_addrlen; @@ -910,6 +926,12 @@ Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only, i } retcode = bind(s, &addr->sa, addrlen); + +#ifndef NO_IPV6 + if (ai) + freeaddrinfo(ai); +#endif + if (retcode < 0) { close(s); ret->error = strerror(errno); @@ -1373,22 +1395,6 @@ static int net_select_result(int fd, int event) return 1; } -/* - * Each socket abstraction contains a `void *' private field in - * which the client can keep state. - */ -static void sk_tcp_set_private_ptr(Socket sock, void *ptr) -{ - Actual_Socket s = (Actual_Socket) sock; - s->private_ptr = ptr; -} - -static void *sk_tcp_get_private_ptr(Socket sock) -{ - Actual_Socket s = (Actual_Socket) sock; - return s->private_ptr; -} - /* * Special error values are returned from sk_namelookup and sk_new * if there's a problem. These functions extract an error message, @@ -1544,6 +1550,7 @@ Socket new_unix_listener(SockAddr listenaddr, Plug plug) ret->incomingeof = FALSE; ret->listener = 1; ret->addr = listenaddr; + ret->s = -1; assert(listenaddr->superfamily == UNIX);