aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/pppd
diff options
context:
space:
mode:
authorMaxim Konovalov <maxim@FreeBSD.org>2004-04-09 16:59:05 +0000
committerMaxim Konovalov <maxim@FreeBSD.org>2004-04-09 16:59:05 +0000
commitefccc7dc2509c651afbabd5aae3e2a64d0b0ef1b (patch)
tree9e2e1db1e9c5978d92def9c0e23cce822a844916 /usr.sbin/pppd
parente89e6a3c11787f124466cf3080bcfe222e2b6b13 (diff)
downloadsrc-efccc7dc2509c651afbabd5aae3e2a64d0b0ef1b.tar.gz
src-efccc7dc2509c651afbabd5aae3e2a64d0b0ef1b.zip
o SIOCGIFCONF->getifaddrs(2) conversion.
PR: bin/9379 Obtained from: NetBSD
Notes
Notes: svn path=/head/; revision=128062
Diffstat (limited to 'usr.sbin/pppd')
-rw-r--r--usr.sbin/pppd/sys-bsd.c127
1 files changed, 51 insertions, 76 deletions
diff --git a/usr.sbin/pppd/sys-bsd.c b/usr.sbin/pppd/sys-bsd.c
index ed4bd411b835..3ca43c0cb2ed 100644
--- a/usr.sbin/pppd/sys-bsd.c
+++ b/usr.sbin/pppd/sys-bsd.c
@@ -76,6 +76,8 @@ static char rcsid[] = "$FreeBSD$";
#endif
#endif
+#include <ifaddrs.h>
+
#include "pppd.h"
#include "fsm.h"
#include "ipcp.h"
@@ -1362,84 +1364,69 @@ int cipxfaddr (int unit)
* get_ether_addr - get the hardware address of an interface on the
* the same subnet as ipaddr.
*/
-#define MAX_IFS 32
-
static int
get_ether_addr(ipaddr, hwaddr)
u_int32_t ipaddr;
struct sockaddr_dl *hwaddr;
{
- struct ifreq *ifr, *ifend, *ifp;
u_int32_t ina, mask;
struct sockaddr_dl *dla;
- struct ifreq ifreq;
- struct ifconf ifc;
- struct ifreq ifs[MAX_IFS];
-
- ifc.ifc_len = sizeof(ifs);
- ifc.ifc_req = ifs;
- if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {
- syslog(LOG_ERR, "ioctl(SIOCGIFCONF): %m");
- return 0;
- }
+ struct ifaddrs *ifap, *ifa, *ifp;
/*
* Scan through looking for an interface with an Internet
* address on the same subnet as `ipaddr'.
*/
- ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
- for (ifr = ifc.ifc_req; ifr < ifend;
- ifr = (struct ifreq *) ((char *)&ifr->ifr_addr
- + MAX(ifr->ifr_addr.sa_len, sizeof(ifr->ifr_addr)))) {
- 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));
- /*
- * Check that the interface is up, and not point-to-point
- * or loopback.
- */
- if (ioctl(sockfd, SIOCGIFFLAGS, &ifreq) < 0)
- continue;
- if ((ifreq.ifr_flags &
- (IFF_UP|IFF_BROADCAST|IFF_POINTOPOINT|IFF_LOOPBACK|IFF_NOARP))
- != (IFF_UP|IFF_BROADCAST))
- continue;
- /*
- * Get its netmask and check that it's on the right subnet.
- */
- if (ioctl(sockfd, SIOCGIFNETMASK, &ifreq) < 0)
+ if (getifaddrs(&ifap) != 0) {
+ syslog(LOG_ERR, "getifaddrs: %m");
+ return 0;
+ }
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+ if (ifa->ifa_addr->sa_family != AF_INET)
+ continue;
+ ina = ((struct sockaddr_in *) ifa->ifa_addr)->sin_addr.s_addr;
+ /*
+ * Check that the interface is up, and not point-to-point
+ * or loopback.
+ */
+ if ((ifa->ifa_flags &
+ (IFF_UP|IFF_BROADCAST|IFF_POINTOPOINT|IFF_LOOPBACK|IFF_NOARP))
+ != (IFF_UP|IFF_BROADCAST))
continue;
- mask = ((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr.s_addr;
- if ((ipaddr & mask) != (ina & mask))
+ /*
+ * Get its netmask and check that it's on the right subnet.
+ */
+ mask = ((struct sockaddr_in *) ifa->ifa_netmask)->sin_addr.s_addr;
+ if ((ipaddr & mask) != (ina & mask))
continue;
-
- break;
- }
+ break;
}
-
- if (ifr >= ifend)
+ if (!ifa) {
+ freeifaddrs(ifap);
return 0;
- syslog(LOG_INFO, "found interface %s for proxy arp", ifr->ifr_name);
+ }
+ syslog(LOG_INFO, "found interface %s for proxy arp", ifa->ifa_name);
/*
* Now scan through again looking for a link-level address
* for this interface.
*/
- ifp = ifr;
- for (ifr = ifc.ifc_req; ifr < ifend; ) {
- if (strcmp(ifp->ifr_name, ifr->ifr_name) == 0
- && ifr->ifr_addr.sa_family == AF_LINK) {
- /*
- * Found the link-level address - copy it out
- */
- dla = (struct sockaddr_dl *) &ifr->ifr_addr;
- BCOPY(dla, hwaddr, dla->sdl_len);
- return 1;
- }
- ifr = (struct ifreq *) ((char *)&ifr->ifr_addr
- + MAX(ifr->ifr_addr.sa_len, sizeof(ifr->ifr_addr)));
+ ifp = ifa;
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+ if (strcmp(ifp->ifa_name, ifa->ifa_name) != 0)
+ continue;
+ if (ifa->ifa_addr->sa_family != AF_LINK)
+ continue;
+ /*
+ * Found the link-level address - copy it out
+ */
+ dla = (struct sockaddr_dl *) ifa->ifa_addr;
+ BCOPY(dla, hwaddr, dla->sdl_len);
+ freeifaddrs(ifap);
+ return 1;
}
+ freeifaddrs(ifap);
return 0;
}
@@ -1456,9 +1443,7 @@ GetMask(addr)
u_int32_t addr;
{
u_int32_t mask, nmask, ina;
- struct ifreq *ifr, *ifend, ifreq;
- struct ifconf ifc;
- struct ifreq ifs[MAX_IFS];
+ struct ifaddrs *ifap, *ifa;
addr = ntohl(addr);
if (IN_CLASSA(addr)) /* determine network mask for address class */
@@ -1473,41 +1458,31 @@ GetMask(addr)
/*
* Scan through the system's network interfaces.
*/
- ifc.ifc_len = sizeof(ifs);
- ifc.ifc_req = ifs;
- if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {
- syslog(LOG_WARNING, "ioctl(SIOCGIFCONF): %m");
+ if (getifaddrs(&ifap) != 0) {
+ syslog(LOG_WARNING, "getifaddrs: %m");
return mask;
}
- ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
- for (ifr = ifc.ifc_req; ifr < ifend;
- ifr = (struct ifreq *) ((char *)&ifr->ifr_addr
- + MAX(ifr->ifr_addr.sa_len, sizeof(ifr->ifr_addr)))) {
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
/*
* Check the interface's internet address.
*/
- if (ifr->ifr_addr.sa_family != AF_INET)
+ if (ifa->ifa_addr->sa_family != AF_INET)
continue;
- ina = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr;
+ ina = ((struct sockaddr_in *)&ifa->ifa_addr)->sin_addr.s_addr;
if ((ntohl(ina) & nmask) != (addr & nmask))
continue;
/*
* Check that the interface is up, and not point-to-point or loopback.
*/
- strncpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
- if (ioctl(sockfd, SIOCGIFFLAGS, &ifreq) < 0)
- continue;
- if ((ifreq.ifr_flags & (IFF_UP|IFF_POINTOPOINT|IFF_LOOPBACK))
- != IFF_UP)
+ if ((ifa->ifa_flags & (IFF_UP|IFF_POINTOPOINT|IFF_LOOPBACK)) != IFF_UP)
continue;
/*
* Get its netmask and OR it into our mask.
*/
- if (ioctl(sockfd, SIOCGIFNETMASK, &ifreq) < 0)
- continue;
- mask |= ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr.s_addr;
+ mask |= ((struct sockaddr_in *)&ifa->ifa_netmask)->sin_addr.s_addr;
}
+ freeifaddrs(ifap);
return mask;
}