summaryrefslogtreecommitdiffstats
path: root/src/kdc/network.c
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@mit.edu>2002-07-05 19:56:15 +0000
committerKen Raeburn <raeburn@mit.edu>2002-07-05 19:56:15 +0000
commitfc50ce3d9d7221d156aa0e4e8fc2ffad2e52599f (patch)
tree1e573a902fb8b2e3a3f758cd946e2af6ca3be31e /src/kdc/network.c
parentc549539adaf8cb98b32a2f178a351906cdb20653 (diff)
downloadkrb5-fc50ce3d9d7221d156aa0e4e8fc2ffad2e52599f.tar.gz
krb5-fc50ce3d9d7221d156aa0e4e8fc2ffad2e52599f.tar.xz
krb5-fc50ce3d9d7221d156aa0e4e8fc2ffad2e52599f.zip
Reduce or localize dependencies on address families.
* kdc_util.h (ADDRTYPE2FAMILY): New macro. * do_as_req.c (process_as_req): Use inet_ntop instead of inet_ntoa. * do_tgs_req.c (process_tgs_req): Ditto. * dispatch.c (dispatch): Fix inet_ntop code, and use it always. * kerberos_v4.c (process_v4): Check address family before copying out an IPv4 address. Log if not IPv4, but continue. * network.c (set_sa_port): New function. (setup_port): Use it. Combine IPv4 and IPv6 paths; IPv6 still disabled for now. Modify supplied sockaddr instead of making a copy. (process_packet): SADDR is now sockaddr_storage. Use socket-utils macros instead of casting. Enable the IPv6 code. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@14602 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/kdc/network.c')
-rw-r--r--src/kdc/network.c146
1 files changed, 67 insertions, 79 deletions
diff --git a/src/kdc/network.c b/src/kdc/network.c
index babb676cf..76bf9a929 100644
--- a/src/kdc/network.c
+++ b/src/kdc/network.c
@@ -124,96 +124,84 @@ add_fd (struct socksetup *data, int sock)
return 0;
}
+static void
+set_sa_port(struct sockaddr *addr, int port)
+{
+ switch (addr->sa_family) {
+ case AF_INET:
+ sa2sin(addr)->sin_port = port;
+ break;
+#ifdef KRB5_USE_INET6
+ case AF_INET6:
+ sa2sin6(addr)->sin6_port = port;
+ break;
+#endif
+ default:
+ break;
+ }
+}
+
static int
setup_port(void *P_data, struct sockaddr *addr)
{
struct socksetup *data = P_data;
int sock = -1, i;
+ char haddrbuf[NI_MAXHOST];
+ int err;
+
+ err = getnameinfo(addr, socklen(addr), haddrbuf, sizeof(haddrbuf),
+ 0, 0, NI_NUMERICHOST);
+ if (err)
+ strcpy(haddrbuf, "<unprintable>");
switch (addr->sa_family) {
case AF_INET:
- {
- struct sockaddr_in *sin4 = (struct sockaddr_in *) addr, psin;
- for (i = 0; i < n_udp_ports; i++) {
- sock = socket (PF_INET, SOCK_DGRAM, 0);
- if (sock == -1) {
- data->retval = errno;
- com_err(data->prog, data->retval,
- "Cannot create server socket for port %d address %s",
- udp_port_nums[i], inet_ntoa (sin4->sin_addr));
- return 1;
- }
- psin = *sin4;
- psin.sin_port = htons (udp_port_nums[i]);
- if (bind (sock, (struct sockaddr *)&psin, sizeof (psin)) == -1) {
- data->retval = errno;
- com_err(data->prog, data->retval,
- "Cannot bind server socket to port %d address %s",
- udp_port_nums[i], inet_ntoa (sin4->sin_addr));
- return 1;
- }
- FD_SET (sock, &select_fds);
- if (sock > select_nfds)
- select_nfds = sock;
- krb5_klog_syslog (LOG_INFO, "listening on fd %d: %s port %d", sock,
- inet_ntoa (sin4->sin_addr), udp_port_nums[i]);
- if (add_fd (data, sock))
- return 1;
- }
- }
- break;
+ break;
#ifdef AF_INET6
case AF_INET6:
-#ifdef KRB5_USE_INET6x /* Not ready yet -- fix process_packet and callees. */
- /* XXX We really should be using a single AF_INET6 socket and
- specify/receive local address info through sendmsg/recvmsg
- control data. */
- {
- struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) addr, psin6;
- for (i = 0; i < n_udp_ports; i++) {
- char addr_str[46] = { 0 };
- if (0 == inet_ntop (sin6->sin6_family, &sin6->sin6_addr, addr_str,
- sizeof (addr_str)))
- strcpy (addr_str, "?");
- sock = socket (PF_INET6, SOCK_DGRAM, 0);
- if (sock == -1) {
- data->retval = errno;
- com_err(data->prog, data->retval,
- "Cannot create server socket for port %d address %s",
- udp_port_nums[i], addr_str);
- return 1;
- }
- psin6 = *sin6;
- psin6.sin6_port = htons (udp_port_nums[i]);
- if (bind (sock, (struct sockaddr *)&psin6, sizeof (psin6)) == -1) {
- data->retval = errno;
- com_err(data->prog, data->retval,
- "Cannot bind server socket to port %d address %s",
- udp_port_nums[i], addr_str);
- return 1;
- }
- FD_SET (sock, &select_fds);
- if (sock > select_nfds)
- select_nfds = sock;
- krb5_klog_syslog (LOG_INFO, "listening on fd %d: %s port %d", sock,
- addr_str, udp_port_nums[i]);
- if (add_fd (data, sock))
- return 1;
- }
- }
-#else
+#ifndef KRB5_USE_INET6x
{
static int first = 1;
- if (!first) {
+ if (first) {
krb5_klog_syslog (LOG_INFO, "skipping local ipv6 addresses");
first = 0;
}
+ return 0;
}
-#endif /* use inet6 */
-#endif /* AF_INET6 */
+#else
break;
+#endif
+#endif
default:
- break;
+ krb5_klog_syslog (LOG_INFO,
+ "skipping unrecognized local address family");
+ return 0;
+ }
+
+ for (i = 0; i < n_udp_ports; i++) {
+ sock = socket (addr->sa_family, SOCK_DGRAM, 0);
+ if (sock == -1) {
+ data->retval = errno;
+ com_err(data->prog, data->retval,
+ "Cannot create server socket for port %d address %s",
+ udp_port_nums[i], haddrbuf);
+ return 1;
+ }
+ set_sa_port(addr, htons(udp_port_nums[i]));
+ if (bind (sock, (struct sockaddr *)addr, socklen (addr)) == -1) {
+ data->retval = errno;
+ com_err(data->prog, data->retval,
+ "Cannot bind server socket to port %d address %s",
+ udp_port_nums[i], haddrbuf);
+ return 1;
+ }
+ FD_SET (sock, &select_fds);
+ if (sock > select_nfds)
+ select_nfds = sock;
+ krb5_klog_syslog (LOG_INFO, "listening on fd %d: %s port %d", sock,
+ haddrbuf, udp_port_nums[i]);
+ if (add_fd (data, sock))
+ return 1;
}
return 0;
}
@@ -269,7 +257,7 @@ static void process_packet(port_fd, prog)
int cc, saddr_len;
krb5_fulladdr faddr;
krb5_error_code retval;
- struct sockaddr_in saddr;
+ struct sockaddr_storage saddr;
krb5_address addr;
krb5_data request;
krb5_data *response;
@@ -297,19 +285,19 @@ static void process_packet(port_fd, prog)
request.length = cc;
request.data = pktbuf;
faddr.address = &addr;
- switch (((struct sockaddr *)&saddr)->sa_family) {
+ switch (ss2sa(&saddr)->sa_family) {
case AF_INET:
addr.addrtype = ADDRTYPE_INET;
addr.length = 4;
- addr.contents = (krb5_octet *) &((struct sockaddr_in *)&saddr)->sin_addr;
- faddr.port = ntohs(((struct sockaddr_in *)&saddr)->sin_port);
+ addr.contents = (krb5_octet *) &ss2sin(&saddr)->sin_addr;
+ faddr.port = ntohs(ss2sin(&saddr)->sin_port);
break;
-#ifdef KRB5_USE_INET6x
+#ifdef KRB5_USE_INET6
case AF_INET6:
addr.addrtype = ADDRTYPE_INET6;
addr.length = 16;
- addr.contents = (krb5_octet *) &((struct sockaddr_in6 *)&saddr)->sin6_addr;
- faddr.port = ntohs(((struct sockaddr_in6 *)&saddr)->sin6_port);
+ addr.contents = (krb5_octet *) &ss2sin6(&saddr)->sin6_addr;
+ faddr.port = ntohs(ss2sin6(&saddr)->sin6_port);
break;
#endif
default: