1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-06 12:41:29 +00:00

List all interface aliases on Windows. All aliases of one interface will be

given the same name, e.g., "eth0". Use -e to choose the interface and -S to
choose the source address.
This commit is contained in:
david
2007-11-26 23:44:20 +00:00
parent d2123e7011
commit d08af8a057
3 changed files with 55 additions and 24 deletions

View File

@@ -326,3 +326,23 @@ Index: addr-util.c
if (len < 46)
return (NULL);
o Remember the entry->intf_len before zeroing entry in _ifrow_to_entry.
intf_loop relies on passing the length inside the structure to make sure
interface aliases are accounted for.
Index: src/intf-win32.c
===================================================================
--- src/intf-win32.c (revision 6288)
+++ src/intf-win32.c (working copy)
@@ -103,7 +103,12 @@
struct addr *ap, *lap;
int i;
+ /* The total length of the entry may be passed in inside entry.
+ Remember it and clear the entry. */
+ u_int intf_len = entry->intf_len;
memset(entry, 0, sizeof(*entry));
+ /* Restore the length. */
+ entry->intf_len = intf_len;
for (i = 0; i < intf->ifcombo[ifrow->dwType].cnt; i++) {
if (intf->ifcombo[ifrow->dwType].idx[i] == ifrow->dwIndex)

View File

@@ -103,7 +103,12 @@ _ifrow_to_entry(intf_t *intf, MIB_IFROW *ifrow, struct intf_entry *entry)
struct addr *ap, *lap;
int i;
/* The total length of the entry may be passed in inside entry.
Remember it and clear the entry. */
u_int intf_len = entry->intf_len;
memset(entry, 0, sizeof(*entry));
/* Restore the length. */
entry->intf_len = intf_len;
for (i = 0; i < intf->ifcombo[ifrow->dwType].cnt; i++) {
if (intf->ifcombo[ifrow->dwType].idx[i] == ifrow->dwIndex)

View File

@@ -2600,51 +2600,57 @@ static int collect_dnet_routes(const struct route_entry *entry, void *arg) {
#if WIN32
static int collect_dnet_interfaces(const struct intf_entry *entry, void *arg) {
struct dnet_collector_route_nfo *dcrn = (struct dnet_collector_route_nfo *) arg;
int i;
int numifaces = dcrn->numifaces;
bool primary_done;
int num_aliases_done;
primary_done = false;
num_aliases_done = 0;
while (!primary_done || num_aliases_done < entry->intf_alias_num) {
/* Make sure we have room for the new route */
if (dcrn->numifaces >= dcrn->capacity) {
dcrn->capacity <<= 2;
dcrn->ifaces = (struct interface_info *) safe_realloc(dcrn->ifaces,
dcrn->capacity * sizeof(struct interface_info));
}
/* The first time through the loop we add the primary interface record. After
that we add the aliases one at a time. */
if (!primary_done) {
if (entry->intf_addr.addr_type == ADDR_TYPE_IP) {
addr_ntos(&entry->intf_addr, (struct sockaddr *) &dcrn->ifaces[numifaces].addr);
dcrn->ifaces[numifaces].netmask_bits = entry->intf_addr.addr_bits;
} else {
for(i=0; i < (int) entry->intf_alias_num; i++) {
if (entry->intf_alias_addrs[i].addr_type == ADDR_TYPE_IP) {
addr_ntos(&entry->intf_alias_addrs[i], (struct sockaddr *) &dcrn->ifaces[numifaces].addr);
dcrn->ifaces[numifaces].netmask_bits = entry->intf_alias_addrs[i].addr_bits;
break;
addr_ntos(&entry->intf_addr, (struct sockaddr *) &dcrn->ifaces[dcrn->numifaces].addr);
dcrn->ifaces[dcrn->numifaces].netmask_bits = entry->intf_addr.addr_bits;
}
if (i == (int) entry->intf_alias_num)
return 0; /* No IPv4 addresses found for this interface */
primary_done = true;
} else if (num_aliases_done < (int) entry->intf_alias_num) {
if (entry->intf_alias_addrs[num_aliases_done].addr_type == ADDR_TYPE_IP) {
addr_ntos(&entry->intf_alias_addrs[num_aliases_done], (struct sockaddr *) &dcrn->ifaces[dcrn->numifaces].addr);
dcrn->ifaces[dcrn->numifaces].netmask_bits = entry->intf_alias_addrs[num_aliases_done].addr_bits;
}
num_aliases_done++;
}
/* OK, address/netmask found. Let's get the name */
Strncpy(dcrn->ifaces[numifaces].devname, entry->intf_name, sizeof(dcrn->ifaces[numifaces].devname));
Strncpy(dcrn->ifaces[numifaces].devfullname, entry->intf_name, sizeof(dcrn->ifaces[numifaces].devfullname));
Strncpy(dcrn->ifaces[dcrn->numifaces].devname, entry->intf_name, sizeof(dcrn->ifaces[dcrn->numifaces].devname));
Strncpy(dcrn->ifaces[dcrn->numifaces].devfullname, entry->intf_name, sizeof(dcrn->ifaces[dcrn->numifaces].devfullname));
/* Interface type */
if (entry->intf_type == INTF_TYPE_ETH) {
dcrn->ifaces[numifaces].device_type = devt_ethernet;
dcrn->ifaces[dcrn->numifaces].device_type = devt_ethernet;
/* Collect the MAC address since this is ethernet */
memcpy(dcrn->ifaces[numifaces].mac, &entry->intf_link_addr.addr_eth.data, 6);
memcpy(dcrn->ifaces[dcrn->numifaces].mac, &entry->intf_link_addr.addr_eth.data, 6);
}
else if (entry->intf_type == INTF_TYPE_LOOPBACK)
dcrn->ifaces[numifaces].device_type = devt_loopback;
dcrn->ifaces[dcrn->numifaces].device_type = devt_loopback;
else if (entry->intf_type == INTF_TYPE_TUN)
dcrn->ifaces[numifaces].device_type = devt_p2p;
else dcrn->ifaces[numifaces].device_type = devt_other;
dcrn->ifaces[dcrn->numifaces].device_type = devt_p2p;
else dcrn->ifaces[dcrn->numifaces].device_type = devt_other;
/* Is the interface up and running? */
dcrn->ifaces[numifaces].device_up = (entry->intf_flags & INTF_FLAG_UP)? true : false;
dcrn->ifaces[dcrn->numifaces].device_up = (entry->intf_flags & INTF_FLAG_UP)? true : false;
/* For the rest of the information, we must open the interface directly ... */
dcrn->numifaces++;
}
return 0;
}
#endif /* WIN32 */