diff options
author | bms <bms@FreeBSD.org> | 2008-03-31 18:13:37 +0800 |
---|---|---|
committer | bms <bms@FreeBSD.org> | 2008-03-31 18:13:37 +0800 |
commit | ad0e2ffe05c63531024bd17620fdbee13266fa6f (patch) | |
tree | 3dd5ad67fb5db1d5fa0793ac91d86e682c2ad17c /net/mrouted/files | |
parent | f21446632eeaf579fd8f860e33b76658d4de61e4 (diff) | |
download | freebsd-ports-graphics-ad0e2ffe05c63531024bd17620fdbee13266fa6f.tar.gz freebsd-ports-graphics-ad0e2ffe05c63531024bd17620fdbee13266fa6f.tar.zst freebsd-ports-graphics-ad0e2ffe05c63531024bd17620fdbee13266fa6f.zip |
Pick up patches which were in FreeBSD base before mrouted got de-orbitted.
PR: 122223
Submitted by: swp at swp dot pp dot ru
Diffstat (limited to 'net/mrouted/files')
-rw-r--r-- | net/mrouted/files/patch-cfparse.y | 178 | ||||
-rw-r--r-- | net/mrouted/files/patch-config.c | 173 |
2 files changed, 351 insertions, 0 deletions
diff --git a/net/mrouted/files/patch-cfparse.y b/net/mrouted/files/patch-cfparse.y new file mode 100644 index 00000000000..91d4d8b5ced --- /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 00000000000..adb2e21063a --- /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); + } |