#endif
\f
-/**
- * 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
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