diff --git a/libnetutil/netutil.cc b/libnetutil/netutil.cc index 947f12d0e..89bea8be6 100644 --- a/libnetutil/netutil.cc +++ b/libnetutil/netutil.cc @@ -1436,7 +1436,7 @@ int ipaddr2devname(char *dev, const struct sockaddr_storage *addr) { return -1; } -int devname2ipaddr(char *dev, struct sockaddr_storage *addr) { +int devname2ipaddr(char *dev, int af, struct sockaddr_storage *addr) { struct interface_info *ifaces; int numifaces; int i; @@ -1446,7 +1446,7 @@ int devname2ipaddr(char *dev, struct sockaddr_storage *addr) { return -1; for (i = 0; i < numifaces; i++) { - if (!strcmp(dev, ifaces[i].devfullname)) { + if (af == ifaces[i].addr.ss_family && !strcmp(dev, ifaces[i].devfullname)) { *addr = ifaces[i].addr; return 0; } diff --git a/libnetutil/netutil.h b/libnetutil/netutil.h index 05334a7db..40bf7d97a 100644 --- a/libnetutil/netutil.h +++ b/libnetutil/netutil.h @@ -318,7 +318,7 @@ int ipaddr2devname( char *dev, const struct sockaddr_storage *addr ); /* Convert a network interface name (IE ppp0 eth0) to an IP address. * Returns 0 on success or -1 in case of error. */ -int devname2ipaddr(char *dev, struct sockaddr_storage *addr); +int devname2ipaddr(char *dev, int af, struct sockaddr_storage *addr); int sockaddr_equal(const struct sockaddr_storage *a, const struct sockaddr_storage *b); diff --git a/nmap.cc b/nmap.cc index de3732387..52ca14ab0 100644 --- a/nmap.cc +++ b/nmap.cc @@ -1729,7 +1729,7 @@ void apply_delayed_options() { if (*o.device && !o.SourceSockAddr()) { struct sockaddr_storage tmpsock; memset(&tmpsock, 0, sizeof(tmpsock)); - if (devname2ipaddr(o.device, &tmpsock) == -1) { + if (devname2ipaddr(o.device, o.af(), &tmpsock) == -1) { fatal("I cannot figure out what source address to use for device %s, does it even exist?", o.device); } o.setSourceSockAddr(&tmpsock, sizeof(tmpsock)); diff --git a/nping/NpingOps.cc b/nping/NpingOps.cc index 4481e4fc7..4cd08c864 100644 --- a/nping/NpingOps.cc +++ b/nping/NpingOps.cc @@ -1416,7 +1416,6 @@ struct sockaddr_storage *NpingOps::getSourceSockAddr(struct sockaddr_storage *ss s6->sin6_addr=this->getIPv6SourceAddress(); else s6->sin6_addr=in6addr_any; - s6->sin6_addr=this->getIPv6SourceAddress(); s6->sin6_family=AF_INET6; if(this->issetSourcePort()) s6->sin6_port=htons(this->getSourcePort()); @@ -2392,7 +2391,7 @@ if( this->getMode()!=TCP_CONNECT && this->getMode()!=UDP_UNPRIV && this->getRole else this->setDevice( dev ); /* Libpcap gave us a device name, try to obtain it's IP */ - if ( devname2ipaddr_alt(this->getDevice(), &ifaddr) != 0 ){ + if ( devname2ipaddr(this->getDevice(), this->af(), &ifaddr) != 0 ){ if( this->isRoot() ) nping_fatal(QT_3,"Cannot figure out what source address to use for device %s, does it even exist?", this->getDevice()); else diff --git a/nping/common_modified.cc b/nping/common_modified.cc index 103405b34..4ea9788aa 100644 --- a/nping/common_modified.cc +++ b/nping/common_modified.cc @@ -736,48 +736,3 @@ void getpts_aux(const char *origexpr, int nested, u8 *porttbl, int *portwarning) #ifndef IPPROTO_SCTP #define IPPROTO_SCTP 132 #endif - - - - -/* IPv6 compatible version of Nmap's devname2ipaddr() - * @warning For this to work we need getinterfaces() not to skip IPv6 */ -int devname2ipaddr_alt(char *dev, struct sockaddr_storage *addr) { -struct interface_info *mydevs; -struct sockaddr_storage *s=NULL; -struct sockaddr_in *s4=NULL; -struct sockaddr_in6 *s6=NULL; -int numdevs; -int i; -mydevs = getinterfaces(&numdevs, NULL, 0); - -if (!mydevs) return -1; - -if( !addr || !dev ) - fatal("devname2ipaddr(): NULL values supplied."); - - for(i=0; i < numdevs; i++) { - s=(struct sockaddr_storage *)&mydevs[i].addr; - s4=(struct sockaddr_in *)&mydevs[i].addr; - s6=(struct sockaddr_in6 *)&mydevs[i].addr; - if (s4->sin_family==AF_INET || s6->sin6_family==AF_INET6){ - if (!strcmp(dev, mydevs[i].devfullname)) { - memcpy(addr, s, sizeof(struct sockaddr_storage)); - return 0; - } - } else{ /* Unknown family, skipping it... */ - continue; - } - } - return -1; - -} /* End of devname2ipaddr() */ - - - - - - - - - diff --git a/nping/common_modified.h b/nping/common_modified.h index e7acd3942..ac4edb418 100644 --- a/nping/common_modified.h +++ b/nping/common_modified.h @@ -135,7 +135,6 @@ class TargetGroup { /***************************************************************************** * STUFF FROM tcpip.cc ****************************************************************************/ -int devname2ipaddr_alt(char *dev, struct sockaddr_storage *addr); void getpts_aux(const char *origexpr, int nested, u8 *porttbl, int *portwarning); #endif