From b2e532a36c2e34d056755e4a8f819184f77678e8 Mon Sep 17 00:00:00 2001
From: Bruce M Simpson <bms@FreeBSD.org>
Date: Mon, 31 Mar 2008 10:13:37 +0000
Subject: Pick up patches which were in FreeBSD base before mrouted got
 de-orbitted.

PR:		122223
Submitted by:	swp at swp dot pp dot ru
---
 net/mrouted/Makefile              |   1 +
 net/mrouted/files/patch-cfparse.y | 178 ++++++++++++++++++++++++++++++++++++++
 net/mrouted/files/patch-config.c  | 173 ++++++++++++++++++++++++++++++++++++
 3 files changed, 352 insertions(+)
 create mode 100644 net/mrouted/files/patch-cfparse.y
 create mode 100644 net/mrouted/files/patch-config.c

(limited to 'net/mrouted')

diff --git a/net/mrouted/Makefile b/net/mrouted/Makefile
index 96f684e0ae2a..478a4675f494 100644
--- a/net/mrouted/Makefile
+++ b/net/mrouted/Makefile
@@ -7,6 +7,7 @@
 
 PORTNAME=	mrouted
 PORTVERSION=	3.9
+PORTREVISION=	1
 CATEGORIES=	net
 MASTER_SITES=	ftp://ftp.research.att.com/pub/fenner/mrouted/ \
 		http://www.mirrorservice.org/sites/www.ibiblio.org/gentoo/distfiles/
diff --git a/net/mrouted/files/patch-cfparse.y b/net/mrouted/files/patch-cfparse.y
new file mode 100644
index 000000000000..91d4d8b5ced2
--- /dev/null
+++ b/net/mrouted/files/patch-cfparse.y
@@ -0,0 +1,178 @@
+--- cfparse.y.orig	1998-03-01 07:48:58.000000000 +0600
++++ cfparse.y	2008-03-30 20:52:40.000000000 +0700
+@@ -4,6 +4,7 @@
+  *
+  * Written by Bill Fenner, NRL, 1994
+  *
++ * $FreeBSD: /tmp/pcvs/ports/net/mrouted/files/Attic/patch-cfparse.y,v 1.1 2008-03-31 10:13:37 bms Exp $
+  * cfparse.y,v 3.8.4.30 1998/03/01 01:48:58 fenner Exp
+  */
+ #include <stdio.h>
+@@ -14,17 +15,18 @@
+ #endif
+ #include "defs.h"
+ #include <netdb.h>
++#include <ifaddrs.h>
+ 
+ /*
+  * Local function declarations
+  */
+-static void		fatal __P((char *fmt, ...));
+-static void		warn __P((char *fmt, ...));
++static void		fatal __P((char *fmt, ...)) __printflike(1, 2);
++static void		warn __P((char *fmt, ...)) __printflike(1, 2);
+ static void		yyerror __P((char *s));
+ static char *		next_word __P((void));
+ static int		yylex __P((void));
+ static u_int32		valid_if __P((char *s));
+-static struct ifreq *	ifconfaddr __P((struct ifconf *ifcp, u_int32 a));
++static const char *	ifconfaddr(u_int32_t a);
+ int			yyparse __P((void));
+ 
+ static FILE *f;
+@@ -34,9 +36,6 @@
+ extern int cache_lifetime;
+ extern int prune_lifetime;
+ 
+-/* imported from config.c, with slight memory leak */
+-extern struct ifconf ifc;
+-
+ int allow_black_holes = 0;
+ 
+ static int lineno;
+@@ -127,15 +126,14 @@
+ 					}
+ 		ifmods
+ 	| TUNNEL interface addrname	{
+-
+-			struct ifreq *ifr;
++			const char *ifname;
+ 			struct ifreq ffr;
+ 			vifi_t vifi;
+ 
+ 			order++;
+ 
+-			ifr = ifconfaddr(&ifc, $2);
+-			if (ifr == 0)
++			ifname = ifconfaddr($2);
++			if (ifname == 0)
+ 			    fatal("Tunnel local address %s is not mine",
+ 				inet_fmt($2, s1));
+ 
+@@ -144,7 +142,7 @@
+ 			    fatal("Tunnel local address %s is a loopback address",
+ 				inet_fmt($2, s1));
+ 
+-			if (ifconfaddr(&ifc, $3) != 0)
++			if (ifconfaddr($3) != 0)
+ 			    fatal("Tunnel remote address %s is one of mine",
+ 				inet_fmt($3, s1));
+ 
+@@ -164,7 +162,7 @@
+ 			if (numvifs == MAXVIFS)
+ 			    fatal("too many vifs");
+ 
+-			strncpy(ffr.ifr_name, ifr->ifr_name, IFNAMSIZ);
++			strlcpy(ffr.ifr_name, ifname, sizeof(ffr.ifr_name));
+ 			if (ioctl(udp_socket, SIOCGIFFLAGS, (char *)&ffr)<0)
+ 			    fatal("ioctl SIOCGIFFLAGS on %s", ffr.ifr_name);
+ 
+@@ -175,7 +173,7 @@
+ 			v->uv_lcl_addr	= $2;
+ 			v->uv_rmt_addr	= $3;
+ 			v->uv_dst_addr	= $3;
+-			strncpy(v->uv_name, ffr.ifr_name, IFNAMSIZ);
++			strlcpy(v->uv_name, ffr.ifr_name, sizeof(v->uv_name));
+ 
+ 			if (!(ffr.ifr_flags & IFF_UP)) {
+ 			    v->uv_flags |= VIFF_DOWN;
+@@ -577,7 +575,8 @@
+ addrname	: ADDR		{ $$ = $1; }
+ 	| STRING		{ struct hostent *hp;
+ 
+-				  if ((hp = gethostbyname($1)) == NULL)
++				  if ((hp = gethostbyname($1)) == NULL ||
++					hp->h_length != sizeof($$))
+ 				    fatal("No such host %s", $1);
+ 
+ 				  if (hp->h_addr_list[1])
+@@ -655,7 +654,7 @@
+ fatal(char *fmt, ...)
+ {
+ 	va_list ap;
+-	char buf[200];
++	char buf[MAXHOSTNAMELEN + 100];
+ 
+ 	va_start(ap, fmt);
+ #else
+@@ -666,11 +665,11 @@
+ va_dcl
+ {
+ 	va_list ap;
+-	char buf[200];
++	char buf[MAXHOSTNAMELEN + 100];
+ 
+ 	va_start(ap);
+ #endif
+-	vsprintf(buf, fmt, ap);
++	vsnprintf(buf, sizeof(buf), fmt, ap);
+ 	va_end(ap);
+ 
+ 	log(LOG_ERR,0,"%s: %s near line %d", configfilename, buf, lineno);
+@@ -696,7 +695,7 @@
+ 
+ 	va_start(ap);
+ #endif
+-	vsprintf(buf, fmt, ap);
++	vsnprintf(buf, sizeof(buf), fmt, ap);
+ 	va_end(ap);
+ 
+ 	log(LOG_WARNING,0,"%s: %s near line %d", configfilename, buf, lineno);
+@@ -902,28 +901,24 @@
+ 	return 0;
+ }
+ 
+-static struct ifreq *
+-ifconfaddr(ifcp, a)
+-    struct ifconf *ifcp;
+-    u_int32 a;
+-{
+-    int n;
+-    struct ifreq *ifrp = (struct ifreq *)ifcp->ifc_buf;
+-    struct ifreq *ifend = (struct ifreq *)((char *)ifrp + ifcp->ifc_len);
+-
+-    while (ifrp < ifend) {
+-	    if (ifrp->ifr_addr.sa_family == AF_INET &&
+-		((struct sockaddr_in *)&ifrp->ifr_addr)->sin_addr.s_addr == a)
+-		    return (ifrp);
+-#ifdef HAVE_SA_LEN
+-		n = ifrp->ifr_addr.sa_len + sizeof(ifrp->ifr_name);
+-		if (n < sizeof(*ifrp))
+-			++ifrp;
+-		else
+-			ifrp = (struct ifreq *)((char *)ifrp + n);
+-#else
+-		++ifrp;
+-#endif
++static const char *
++ifconfaddr(u_int32_t a)
++{
++    static char ifname[IFNAMSIZ];
++    struct ifaddrs *ifap, *ifa;
++
++    if (getifaddrs(&ifap) != 0)
++	return (NULL);
++
++    for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
++	if (ifa->ifa_addr->sa_family == AF_INET &&
++	    ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr == a) {
++	    strlcpy(ifname, ifa->ifa_name, sizeof(ifname));
++	    freeifaddrs(ifap);
++	    return (ifname);
++	}
+     }
+-    return (0);
++
++    freeifaddrs(ifap);
++    return (NULL);
+ }
diff --git a/net/mrouted/files/patch-config.c b/net/mrouted/files/patch-config.c
new file mode 100644
index 000000000000..adb2e21063a9
--- /dev/null
+++ b/net/mrouted/files/patch-config.c
@@ -0,0 +1,173 @@
+--- config.c.orig	1998-01-06 07:57:41.000000000 +0600
++++ config.c	2008-03-30 20:39:31.000000000 +0700
+@@ -10,15 +10,13 @@
+  * config.c,v 3.8.4.10 1998/01/06 01:57:41 fenner Exp
+  */
+ 
+-
+-#include "defs.h"
+-
+ #ifndef lint
+-static char rcsid[] = "@(#) $Id: \
+-config.c,v 3.8.4.10 1998/01/06 01:57:41 fenner Exp $";
+-#endif
++static const char rcsid[] =
++  "$FreeBSD: /tmp/pcvs/ports/net/mrouted/files/Attic/patch-config.c,v 1.1 2008-03-31 10:13:37 bms Exp $";
++#endif /* not lint */
+ 
+-struct ifconf ifc;
++#include "defs.h"
++#include <ifaddrs.h>
+ 
+ /*
+  * Query the kernel to find network interfaces that are multicast-capable
+@@ -27,94 +25,47 @@
+ void
+ config_vifs_from_kernel()
+ {
+-    struct ifreq *ifrp, *ifend;
++    struct ifaddrs *ifa, *ifap;
+     register struct uvif *v;
+     register vifi_t vifi;
+-    int n;
+     u_int32 addr, mask, subnet;
+-    short flags;
+-    int num_ifreq = 32;
+-
+-    ifc.ifc_len = num_ifreq * sizeof(struct ifreq);
+-    ifc.ifc_buf = malloc(ifc.ifc_len);
+-    while (ifc.ifc_buf) {
+-	if (ioctl(udp_socket, SIOCGIFCONF, (char *)&ifc) < 0)
+-	    log(LOG_ERR, errno, "ioctl SIOCGIFCONF");
+-
+-	/*
+-	 * If the buffer was large enough to hold all the addresses
+-	 * then break out, otherwise increase the buffer size and
+-	 * try again.
+-	 *
+-	 * The only way to know that we definitely had enough space
+-	 * is to know that there was enough space for at least one
+-	 * more struct ifreq. ???
+-	 */
+-	if ((num_ifreq * sizeof(struct ifreq)) >=
+-	     ifc.ifc_len + sizeof(struct ifreq))
+-	     break;
+-
+-	num_ifreq *= 2;
+-	ifc.ifc_len = num_ifreq * sizeof(struct ifreq);
+-	ifc.ifc_buf = realloc(ifc.ifc_buf, ifc.ifc_len);
+-    }
+-    if (ifc.ifc_buf == NULL)
+-	log(LOG_ERR, 0, "config_vifs_from_kernel: ran out of memory");
++    int flags;
+ 
+-    ifrp = (struct ifreq *)ifc.ifc_buf;
+-    ifend = (struct ifreq *)(ifc.ifc_buf + ifc.ifc_len);
++    if (getifaddrs(&ifap) < 0)
++	log(LOG_ERR, errno, "getifaddrs");
+     /*
+      * Loop through all of the interfaces.
+      */
+-    for (; ifrp < ifend; ifrp = (struct ifreq *)((char *)ifrp + n)) {
+-	struct ifreq ifr;
+-#ifdef HAVE_SA_LEN
+-	n = ifrp->ifr_addr.sa_len + sizeof(ifrp->ifr_name);
+-	if (n < sizeof(*ifrp))
+-	    n = sizeof(*ifrp);
+-#else
+-	n = sizeof(*ifrp);
+-#endif
++    for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+ 	/*
+ 	 * Ignore any interface for an address family other than IP.
+ 	 */
+-	if (ifrp->ifr_addr.sa_family != AF_INET)
++	if (ifa->ifa_addr->sa_family != AF_INET)
+ 	    continue;
+ 
+-	addr = ((struct sockaddr_in *)&ifrp->ifr_addr)->sin_addr.s_addr;
+-
+-	/*
+-	 * Need a template to preserve address info that is
+-	 * used below to locate the next entry.  (Otherwise,
+-	 * SIOCGIFFLAGS stomps over it because the requests
+-	 * are returned in a union.)
+-	 */
+-	bcopy(ifrp->ifr_name, ifr.ifr_name, sizeof(ifr.ifr_name));
++	addr = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
+ 
+ 	/*
+ 	 * Ignore loopback interfaces and interfaces that do not support
+ 	 * multicast.
+ 	 */
+-	if (ioctl(udp_socket, SIOCGIFFLAGS, (char *)&ifr) < 0)
+-	    log(LOG_ERR, errno, "ioctl SIOCGIFFLAGS for %s", ifr.ifr_name);
+-	flags = ifr.ifr_flags;
+-	if ((flags & (IFF_LOOPBACK|IFF_MULTICAST)) != IFF_MULTICAST) continue;
++	flags = ifa->ifa_flags;
++	if ((flags & (IFF_LOOPBACK|IFF_MULTICAST)) != IFF_MULTICAST)
++	    continue;
+ 
+ 	/*
+ 	 * Ignore any interface whose address and mask do not define a
+ 	 * valid subnet number, or whose address is of the form {subnet,0}
+ 	 * or {subnet,-1}.
+ 	 */
+-	if (ioctl(udp_socket, SIOCGIFNETMASK, (char *)&ifr) < 0)
+-	    log(LOG_ERR, errno, "ioctl SIOCGIFNETMASK for %s", ifr.ifr_name);
+-	mask = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr;
++	mask = ((struct sockaddr_in *)ifa->ifa_netmask)->sin_addr.s_addr;
+ 	subnet = addr & mask;
+ 	if (!inet_valid_subnet(subnet, mask) ||
+ 	    addr == subnet ||
+ 	    addr == (subnet | ~mask)) {
+ 	    log(LOG_WARNING, 0,
+ 		"ignoring %s, has invalid address (%s) and/or mask (%s)",
+-		ifr.ifr_name, inet_fmt(addr, s1), inet_fmt(mask, s2));
++		ifa->ifa_name, inet_fmt(addr, s1), inet_fmt(mask, s2));
+ 	    continue;
+ 	}
+ 
+@@ -123,7 +74,7 @@
+ 	 * one already installed in the uvifs array.
+ 	 */
+ 	for (vifi = 0, v = uvifs; vifi < numvifs; ++vifi, ++v) {
+-	    if (strcmp(v->uv_name, ifr.ifr_name) == 0) {
++	    if (strcmp(v->uv_name, ifa->ifa_name) == 0) {
+ 		log(LOG_DEBUG, 0, "skipping %s (%s on subnet %s) (alias for vif#%u?)",
+ 			v->uv_name, inet_fmt(addr, s1),
+ 			inet_fmts(subnet, mask, s2), vifi);
+@@ -132,7 +83,7 @@
+ 	    if ((addr & v->uv_subnetmask) == v->uv_subnet ||
+ 		(v->uv_subnet & mask) == subnet) {
+ 		log(LOG_WARNING, 0, "ignoring %s, same subnet as %s",
+-					ifr.ifr_name, v->uv_name);
++		    ifa->ifa_name, v->uv_name);
+ 		break;
+ 	    }
+ 	}
+@@ -142,7 +93,7 @@
+ 	 * If there is room in the uvifs array, install this interface.
+ 	 */
+ 	if (numvifs == MAXVIFS) {
+-	    log(LOG_WARNING, 0, "too many vifs, ignoring %s", ifr.ifr_name);
++	    log(LOG_WARNING, 0, "too many vifs, ignoring %s", ifa->ifa_name);
+ 	    continue;
+ 	}
+ 	v  = &uvifs[numvifs];
+@@ -151,7 +102,7 @@
+ 	v->uv_subnet      = subnet;
+ 	v->uv_subnetmask  = mask;
+ 	v->uv_subnetbcast = subnet | ~mask;
+-	strncpy(v->uv_name, ifr.ifr_name, IFNAMSIZ);
++	strlcpy(v->uv_name, ifa->ifa_name, sizeof(v->uv_name));
+ 
+ 	if (flags & IFF_POINTOPOINT)
+ 	    v->uv_flags |= VIFF_REXMIT_PRUNES;
+@@ -171,4 +122,6 @@
+ 	    vifs_down = TRUE;
+ 	}
+     }
++
++    freeifaddrs(ifap);
+ }
-- 
cgit v1.2.3