summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2014-07-03 15:36:04 -0400
committerGreg Hudson <ghudson@mit.edu>2014-07-04 15:13:57 -0400
commitdc04419132e73ec5e38f6680055f1e2e627d42d7 (patch)
treeb92abc190ed3d62e78011d7cd29389cdac7b96cd
parentfd352d41a79013114708e99510b6be3836200237 (diff)
downloadkrb5-dc04419132e73ec5e38f6680055f1e2e627d42d7.tar.gz
krb5-dc04419132e73ec5e38f6680055f1e2e627d42d7.tar.xz
krb5-dc04419132e73ec5e38f6680055f1e2e627d42d7.zip
Simplify net-server.c UDP listener setup
In setup_udp_port_1, remove the haddrbuf parameter and use paddr like we already do for one of the log messages. In setup_udp_port, remove the long switch statement and just look for AF_INET/AF_INET6 addresses. Split up udp_flags into two booleans for clarity. Update the comment in loop_setup_network since we did the "To do" item a long time ago.
-rw-r--r--src/lib/apputils/net-server.c83
1 files changed, 22 insertions, 61 deletions
diff --git a/src/lib/apputils/net-server.c b/src/lib/apputils/net-server.c
index 437c0371c..2dd435b76 100644
--- a/src/lib/apputils/net-server.c
+++ b/src/lib/apputils/net-server.c
@@ -381,9 +381,8 @@ struct socksetup {
void *handle;
const char *prog;
krb5_error_code retval;
- int udp_flags;
-#define UDP_DO_IPV4 1
-#define UDP_DO_IPV6 2
+ krb5_boolean do_ipv4_udp_all;
+ krb5_boolean do_ipv6_udp_all;
};
static void
@@ -835,8 +834,7 @@ union pktinfo {
};
static int
-setup_udp_port_1(struct socksetup *data, struct sockaddr *addr,
- char *haddrbuf, int pktinfo);
+setup_udp_port_1(struct socksetup *data, struct sockaddr *addr, int pktinfo);
static void
setup_udp_pktinfo_ports(struct socksetup *data)
@@ -851,9 +849,9 @@ setup_udp_pktinfo_ports(struct socksetup *data)
#ifdef HAVE_SA_LEN
sa.sin_len = sizeof(sa);
#endif
- r = setup_udp_port_1(data, (struct sockaddr *) &sa, "0.0.0.0", 4);
+ r = setup_udp_port_1(data, (struct sockaddr *)&sa, 4);
if (r == 0)
- data->udp_flags &= ~UDP_DO_IPV4;
+ data->do_ipv4_udp_all = FALSE;
}
#endif
#ifdef IPV6_PKTINFO
@@ -866,9 +864,9 @@ setup_udp_pktinfo_ports(struct socksetup *data)
#ifdef HAVE_SA_LEN
sa.sin6_len = sizeof(sa);
#endif
- r = setup_udp_port_1(data, (struct sockaddr *) &sa, "::", 6);
+ r = setup_udp_port_1(data, (struct sockaddr *)&sa, 6);
if (r == 0)
- data->udp_flags &= ~UDP_DO_IPV6;
+ data->do_ipv6_udp_all = FALSE;
}
#endif
}
@@ -880,8 +878,7 @@ setup_udp_pktinfo_ports(struct socksetup *data)
#endif
static int
-setup_udp_port_1(struct socksetup *data, struct sockaddr *addr,
- char *haddrbuf, int pktinfo)
+setup_udp_port_1(struct socksetup *data, struct sockaddr *addr, int pktinfo)
{
int sock = -1, i, r;
u_short port;
@@ -902,14 +899,13 @@ setup_udp_port_1(struct socksetup *data, struct sockaddr *addr,
if (r) {
com_err(data->prog, r,
_("Cannot request packet info for udp socket address "
- "%s port %d"), haddrbuf, port);
+ "%s port %d"), paddr(addr), port);
close(sock);
return 1;
}
}
krb5_klog_syslog(LOG_INFO, _("listening on fd %d: udp %s%s"), sock,
- paddr((struct sockaddr *)addr),
- pktinfo ? " (pktinfo)" : "");
+ paddr(addr), pktinfo ? " (pktinfo)" : "");
if (add_udp_fd (data, sock, pktinfo) == 0) {
close(sock);
return 1;
@@ -919,49 +915,14 @@ setup_udp_port_1(struct socksetup *data, struct sockaddr *addr,
}
static int
-setup_udp_port(void *P_data, struct sockaddr *addr)
+setup_udp_port(void *arg, struct sockaddr *addr)
{
- struct socksetup *data = P_data;
- char haddrbuf[NI_MAXHOST];
- int err;
+ struct socksetup *data = arg;
- if (addr->sa_family == AF_INET && !(data->udp_flags & UDP_DO_IPV4))
- return 0;
-#ifdef AF_INET6
- if (addr->sa_family == AF_INET6 && !(data->udp_flags & UDP_DO_IPV6))
- return 0;
-#endif
- err = getnameinfo(addr, socklen(addr), haddrbuf, sizeof(haddrbuf),
- 0, 0, NI_NUMERICHOST);
- if (err)
- strlcpy(haddrbuf, "<unprintable>", sizeof(haddrbuf));
-
- switch (addr->sa_family) {
- case AF_INET:
- break;
-#ifdef AF_INET6
- case AF_INET6:
- break;
-#endif
-#ifdef AF_LINK /* some BSD systems, AIX */
- case AF_LINK:
- return 0;
-#endif
-#ifdef AF_DLI /* Direct Link Interface - DEC Ultrix/OSF1 link layer? */
- case AF_DLI:
- return 0;
-#endif
-#ifdef AF_APPLETALK
- case AF_APPLETALK:
- return 0;
-#endif
- default:
- krb5_klog_syslog(LOG_INFO,
- _("skipping unrecognized local address family %d"),
- addr->sa_family);
- return 0;
- }
- return setup_udp_port_1(data, addr, haddrbuf, 0);
+ if ((addr->sa_family == AF_INET && data->do_ipv4_udp_all) ||
+ (addr->sa_family == AF_INET6 && data->do_ipv6_udp_all))
+ return setup_udp_port_1(data, addr, 0);
+ return 0;
}
#ifdef HAVE_STRUCT_RT_MSGHDR
@@ -1141,14 +1102,14 @@ loop_setup_network(verto_ctx *ctx, void *handle, const char *prog)
krb5_klog_syslog(LOG_INFO, _("setting up network..."));
/*
- * To do: Use RFC 2292 interface (or follow-on) and IPV6_PKTINFO,
- * so we might need only one UDP socket; fall back to binding
- * sockets on each address only if IPV6_PKTINFO isn't
- * supported.
+ * Start by assuming we need a UDP listener socket for each address for
+ * IPv4 and IPv6. setup_udp_pktinfo_ports will unset appropriate flags if
+ * it sets up a wildcard socket using IP_PKTINFO or IPV6_PKTINFO.
*/
- setup_data.udp_flags = UDP_DO_IPV4 | UDP_DO_IPV6;
+ setup_data.do_ipv4_udp_all = TRUE;
+ setup_data.do_ipv6_udp_all = TRUE;
setup_udp_pktinfo_ports(&setup_data);
- if (setup_data.udp_flags) {
+ if (setup_data.do_ipv4_udp_all || setup_data.do_ipv6_udp_all) {
if (foreach_localaddr (&setup_data, setup_udp_port, 0, 0)) {
return setup_data.retval;
}