SIOCGIFCONF->getifaddrs conversion

This commit is contained in:
itojun 2003-08-17 22:12:43 +00:00
parent f4c0491af5
commit cdf8146ccf
1 changed files with 16 additions and 21 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: mtrace.c,v 1.31 2003/05/16 23:24:38 dsl Exp $ */
/* $NetBSD: mtrace.c,v 1.32 2003/08/17 22:12:43 itojun Exp $ */
/*
* mtrace.c
@ -52,7 +52,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: mtrace.c,v 1.31 2003/05/16 23:24:38 dsl Exp $");
__RCSID("$NetBSD: mtrace.c,v 1.32 2003/08/17 22:12:43 itojun Exp $");
#endif
#include <sys/types.h>
@ -65,6 +65,7 @@ __RCSID("$NetBSD: mtrace.c,v 1.31 2003/05/16 23:24:38 dsl Exp $");
#include <memory.h>
#include <netdb.h>
#include <string.h>
#include <ifaddrs.h>
#include "defs.h"
#include <stdarg.h>
@ -296,37 +297,31 @@ flag_type(u_int type)
u_int32_t
get_netmask(int s, u_int32_t dst)
{
unsigned int i;
char ifbuf[5000];
struct ifconf ifc;
struct ifreq *ifr;
u_int32_t if_addr, if_mask;
u_int32_t retval = 0xFFFFFFFF;
int found = FALSE;
struct ifaddrs *ifap, *ifa;
ifc.ifc_buf = ifbuf;
ifc.ifc_len = sizeof(ifbuf);
if (ioctl(s, SIOCGIFCONF, (char *) &ifc) < 0) {
perror("ioctl (SIOCGIFCONF)");
if (getifaddrs(&ifap) != 0) {
perror("getifaddrs");
return (retval);
}
for (i = 0; i < ifc.ifc_len; ) {
ifr = (struct ifreq *)((char *)ifc.ifc_req + i);
i += sizeof(ifr->ifr_name) + ifr->ifr_addr.sa_len;
if_addr = ((struct sockaddr_in *)&(ifr->ifr_addr))->sin_addr.s_addr;
if (ioctl(s, SIOCGIFNETMASK, (char *)ifr) >= 0) {
if_mask = ((struct sockaddr_in *)&(ifr->ifr_addr))->sin_addr.s_addr;
if ((dst & if_mask) == (if_addr & if_mask)) {
retval = if_mask;
if (lcl_addr == 0) lcl_addr = if_addr;
}
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
if_addr = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
if_mask = ((struct sockaddr_in *)ifa->ifa_netmask)->sin_addr.s_addr;
if ((dst & if_mask) == (if_addr & if_mask)) {
retval = if_mask;
if (lcl_addr == 0)
lcl_addr = if_addr;
}
if (lcl_addr == if_addr) found = TRUE;
if (lcl_addr == if_addr)
found = TRUE;
}
if (!found && lcl_addr != 0) {
printf("Interface address is not valid\n");
exit(1);
}
freeifaddrs(ifap);
return (retval);
}