X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Fconnect.c;h=605ccb459da74ac52092a904e1e23bd32f12e6dc;hb=5f0a2b3f0846dd4c2f72fc62e7171200d1fd6e06;hp=89a85f2f777cd2fc4d6c73462c76f4b5a71488d6;hpb=add61a2d9c99450e709631a9ef20d8bb521dc01e;p=wget diff --git a/src/connect.c b/src/connect.c index 89a85f2f..605ccb45 100644 --- a/src/connect.c +++ b/src/connect.c @@ -66,59 +66,39 @@ extern int errno; #endif -/** - * sockaddr_set_data - * - * This function takes a sockaddr struct and fills in the protocol - * type, the port number and the address. If ENABLE_IPV6 is defined, - * SA should really point to struct sockaddr_storage; otherwise, it - * should point to struct sockaddr_in. - * - * Input: - * struct sockaddr* The space to be filled - * const ip_address The IP address - * int The port - * - * Return: - * - Only modifies 1st parameter. - */ +/* Fill SA as per the data in IP and PORT. SA shoult point to struct + sockaddr_storage if ENABLE_IPV6 is defined, to struct sockaddr_in + otherwise. */ + static void -sockaddr_set_data (struct sockaddr *sa, const ip_address *addr, int port) +sockaddr_set_data (struct sockaddr *sa, const ip_address *ip, int port) { - if (addr->type == IPV4_ADDRESS) + switch (ip->type) { - struct sockaddr_in *sin = (struct sockaddr_in *)sa; - sin->sin_family = AF_INET; - sin->sin_port = htons (port); - if (addr == NULL) - sin->sin_addr.s_addr = INADDR_ANY; - else - sin->sin_addr = ADDRESS_IPV4_IN_ADDR (addr); - } + case IPV4_ADDRESS: + { + struct sockaddr_in *sin = (struct sockaddr_in *)sa; + sin->sin_family = AF_INET; + sin->sin_port = htons (port); + sin->sin_addr = ADDRESS_IPV4_IN_ADDR (ip); + break; + } #ifdef ENABLE_IPV6 - else if (addr->type == IPV6_ADDRESS) - { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; - sin6->sin6_family = AF_INET6; - sin6->sin6_port = htons (port); - /* #### How can ADDR be NULL? We have dereferenced it above by - accessing addr->type! */ - if (addr == NULL) - { - sin6->sin6_addr = in6addr_any; - /* #### Should we set the scope_id here? */ - } - else - { - sin6->sin6_addr = ADDRESS_IPV6_IN6_ADDR (addr); + case IPV6_ADDRESS: + { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; + sin6->sin6_family = AF_INET6; + sin6->sin6_port = htons (port); + sin6->sin6_addr = ADDRESS_IPV6_IN6_ADDR (ip); #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID - sin6->sin6_scope_id = ADDRESS_IPV6_SCOPE (addr); + sin6->sin6_scope_id = ADDRESS_IPV6_SCOPE (ip); #endif - } - } + break; + } #endif /* ENABLE_IPV6 */ - else - abort (); + default: + abort (); + } } /* Get the data of SA, specifically the IP address and the port. If @@ -128,35 +108,40 @@ sockaddr_set_data (struct sockaddr *sa, const ip_address *addr, int port) void sockaddr_get_data (const struct sockaddr *sa, ip_address *ip, int *port) { - if (sa->sa_family == AF_INET) + switch (sa->sa_family) { - struct sockaddr_in *sin = (struct sockaddr_in *)sa; - if (ip) - { - ip->type = IPV4_ADDRESS; - ADDRESS_IPV4_IN_ADDR (ip) = sin->sin_addr; - } - if (port) - *port = ntohs (sin->sin_port); - } + case AF_INET: + { + struct sockaddr_in *sin = (struct sockaddr_in *)sa; + if (ip) + { + ip->type = IPV4_ADDRESS; + ADDRESS_IPV4_IN_ADDR (ip) = sin->sin_addr; + } + if (port) + *port = ntohs (sin->sin_port); + break; + } #ifdef ENABLE_IPV6 - else if (sa->sa_family == AF_INET6) - { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; - if (ip) - { - ip->type = IPV6_ADDRESS; - ADDRESS_IPV6_IN6_ADDR (ip) = sin6->sin6_addr; + case AF_INET6: + { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; + if (ip) + { + ip->type = IPV6_ADDRESS; + ADDRESS_IPV6_IN6_ADDR (ip) = sin6->sin6_addr; #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID - ADDRESS_IPV6_SCOPE (ip) = sin6->sin6_scope_id; + ADDRESS_IPV6_SCOPE (ip) = sin6->sin6_scope_id; #endif - } - if (port) - *port = ntohs (sin6->sin6_port); + } + if (port) + *port = ntohs (sin6->sin6_port); + break; + } +#endif + default: + abort (); } -#endif - else - abort (); } /* Return the size of the sockaddr structure depending on its @@ -418,7 +403,7 @@ bindport (const ip_address *bind_address, int *port, int *local_sock) int optval; struct sockaddr_storage ss; struct sockaddr *sa = (struct sockaddr *)&ss; - memset (&ss, 0, sizeof (ss)); + xzero (ss); #ifdef ENABLE_IPV6 if (bind_address->type == IPV6_ADDRESS)