summaryrefslogtreecommitdiffstats
path: root/hunt
diff options
context:
space:
mode:
authordholland <dholland@NetBSD.org>2014-03-30 04:39:40 +0000
committerdholland <dholland@NetBSD.org>2014-03-30 04:39:40 +0000
commitf0fe7328be681a256ca099af64bf9406e2c0aecb (patch)
tree3032deb344222479d2e4760802bb258fec524991 /hunt
parent4c815854a9d17ac78d0088e0955ada99898b5ca5 (diff)
downloadbsdgames-darwin-f0fe7328be681a256ca099af64bf9406e2c0aecb.tar.gz
bsdgames-darwin-f0fe7328be681a256ca099af64bf9406e2c0aecb.tar.zst
bsdgames-darwin-f0fe7328be681a256ca099af64bf9406e2c0aecb.zip
Tidy up list of broadcast addresses.
Diffstat (limited to 'hunt')
-rw-r--r--hunt/hunt/server.c65
1 files changed, 39 insertions, 26 deletions
diff --git a/hunt/hunt/server.c b/hunt/hunt/server.c
index a909d2d0..463df047 100644
--- a/hunt/hunt/server.c
+++ b/hunt/hunt/server.c
@@ -1,4 +1,4 @@
-/* $NetBSD: server.c,v 1.6 2014/03/30 04:31:21 dholland Exp $ */
+/* $NetBSD: server.c,v 1.7 2014/03/30 04:39:40 dholland Exp $ */
/*
* Copyright (c) 1983-2003, Regents of the University of California.
* All rights reserved.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: server.c,v 1.6 2014/03/30 04:31:21 dholland Exp $");
+__RCSID("$NetBSD: server.c,v 1.7 2014/03/30 04:39:40 dholland Exp $");
#include <sys/param.h>
#include <sys/stat.h>
@@ -57,11 +57,11 @@ __RCSID("$NetBSD: server.c,v 1.6 2014/03/30 04:31:21 dholland Exp $");
* Code for finding and talking to hunt daemons.
*/
-static SOCKET *daemons;
+static struct sockaddr_in *daemons;
static unsigned int numdaemons, maxdaemons;
-static SOCKET *brdv;
-static int brdc;
+static struct sockaddr_in *broadcastaddrs;
+static int numbroadcastaddrs;
static bool initial = true;
static struct in_addr local_address;
@@ -157,33 +157,45 @@ have_daemon_addr(const struct sockaddr_storage *addr)
return false;
}
-static int
-getbroadcastaddrs(struct sockaddr_in **vector)
+static void
+getbroadcastaddrs(void)
{
- int vec_cnt;
+ unsigned num, i;
struct ifaddrs *ifp, *ip;
- *vector = NULL;
- if (getifaddrs(&ifp) < 0)
- return 0;
+ broadcastaddrs = NULL;
+ numbroadcastaddrs = 0;
- vec_cnt = 0;
- for (ip = ifp; ip; ip = ip->ifa_next)
+ if (getifaddrs(&ifp) < 0) {
+ return;
+ }
+
+ num = 0;
+ for (ip = ifp; ip; ip = ip->ifa_next) {
if ((ip->ifa_addr->sa_family == AF_INET) &&
- (ip->ifa_flags & IFF_BROADCAST))
- vec_cnt++;
+ (ip->ifa_flags & IFF_BROADCAST)) {
+ num++;
+ }
+ }
- *vector = malloc(vec_cnt * sizeof(struct sockaddr_in));
+ broadcastaddrs = malloc(num * sizeof(broadcastaddrs[0]));
+ if (broadcastaddrs == NULL) {
+ leavex(1, "Out of memory");
+ }
- vec_cnt = 0;
- for (ip = ifp; ip; ip = ip->ifa_next)
+ i = 0;
+ for (ip = ifp; ip; ip = ip->ifa_next) {
if ((ip->ifa_addr->sa_family == AF_INET) &&
- (ip->ifa_flags & IFF_BROADCAST))
- memcpy(&(*vector)[vec_cnt++], ip->ifa_broadaddr,
- sizeof(struct sockaddr_in));
+ (ip->ifa_flags & IFF_BROADCAST)) {
+ memcpy(&broadcastaddrs[i], ip->ifa_broadaddr,
+ sizeof(broadcastaddrs[i]));
+ i++;
+ }
+ }
+ assert(i == num);
+ numbroadcastaddrs = num;
freeifaddrs(ifp);
- return vec_cnt;
}
static void
@@ -224,8 +236,9 @@ send_messages(int contactsock, unsigned short msg)
(struct sockaddr *)&contactaddr, sizeof(contactaddr));
}
- if (initial)
- brdc = getbroadcastaddrs(&brdv);
+ if (initial) {
+ getbroadcastaddrs();
+ }
#ifdef SO_BROADCAST
/* Sun's will broadcast even though this option can't be set */
@@ -239,8 +252,8 @@ send_messages(int contactsock, unsigned short msg)
/* send broadcast packets on all interfaces */
wiremsg = htons(msg);
- for (i = 0; i < brdc; i++) {
- contactaddr.sin_addr = brdv[i].sin_addr;
+ for (i = 0; i < numbroadcastaddrs; i++) {
+ contactaddr.sin_addr = broadcastaddrs[i].sin_addr;
if (sendto(contactsock, &wiremsg, sizeof(wiremsg), 0,
(struct sockaddr *)&contactaddr,
sizeof(contactaddr)) < 0) {