From 7c4f0a18ff9c104323885f8dbc59f34144cbf30e Mon Sep 17 00:00:00 2001 From: Joerg Wunsch Date: Tue, 3 Oct 1995 10:50:42 +0000 Subject: [PATCH] Finally applied the fix from PR # 701 for the broken prxyarp option of pppd(8). Reviewed by: several people on -hackers, and me Submitted by: Stephen McKay --- usr.sbin/pppd/sys-bsd.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/usr.sbin/pppd/sys-bsd.c b/usr.sbin/pppd/sys-bsd.c index 647315167383..1539ee853ca3 100644 --- a/usr.sbin/pppd/sys-bsd.c +++ b/usr.sbin/pppd/sys-bsd.c @@ -19,7 +19,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: sys-bsd.c,v 1.2 1994/09/25 02:32:15 wollman Exp $"; +static char rcsid[] = "$Id: sys-bsd.c,v 1.3 1995/05/30 03:51:16 rgrimes Exp $"; #endif /* @@ -638,6 +638,12 @@ cifproxyarp(unit, hisaddr) #endif /* RTM_VERSION */ +/* + * How to find the next ifreq structure in the stuff returned by SIOCGIFCONF. + */ +#define next_ifreq(ifr) \ + ((struct ifreq *) ((char *)&(ifr)->ifr_addr + (ifr)->ifr_addr.sa_len)) + /* * get_ether_addr - get the hardware address of an interface on the * the same subnet as ipaddr. @@ -668,7 +674,7 @@ get_ether_addr(ipaddr, hwaddr) * address on the same subnet as `ipaddr'. */ ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len); - for (ifr = ifc.ifc_req; ifr < ifend; ) { + for (ifr = ifc.ifc_req; ifr < ifend; ifr = next_ifreq(ifr)) { if (ifr->ifr_addr.sa_family == AF_INET) { ina = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr; strncpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name)); @@ -687,13 +693,12 @@ get_ether_addr(ipaddr, hwaddr) */ if (ioctl(s, SIOCGIFNETMASK, &ifreq) < 0) continue; - mask = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr; + mask = ((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr.s_addr; if ((ipaddr & mask) != (ina & mask)) continue; break; } - ifr = (struct ifreq *) ((char *)&ifr->ifr_addr + ifr->ifr_addr.sa_len); } if (ifr >= ifend) @@ -705,7 +710,7 @@ get_ether_addr(ipaddr, hwaddr) * for this interface. */ ifp = ifr; - for (ifr = ifc.ifc_req; ifr < ifend; ) { + for (ifr = ifc.ifc_req; ifr < ifend; ifr = next_ifreq(ifr)) { if (strcmp(ifp->ifr_name, ifr->ifr_name) == 0 && ifr->ifr_addr.sa_family == AF_LINK) { /* @@ -715,7 +720,6 @@ get_ether_addr(ipaddr, hwaddr) BCOPY(dla, hwaddr, dla->sdl_len); return 1; } - ifr = (struct ifreq *) ((char *)&ifr->ifr_addr + ifr->ifr_addr.sa_len); } return 0;