From 369bd0ff9f3313ddf91702cb808bb5fd168a593a Mon Sep 17 00:00:00 2001 From: Anton Keks Date: Tue, 12 Mar 2013 00:24:02 +0200 Subject: [PATCH] make sure MAC is not resolved twice if both MACFetcher and MACVendorFetcher are active, but in random order --- src/net/azib/ipscan/fetchers/MACFetcher.java | 16 +++++++++++----- src/net/azib/ipscan/fetchers/UnixMACFetcher.java | 11 +++++------ src/net/azib/ipscan/fetchers/WinMACFetcher.java | 9 +++++---- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/net/azib/ipscan/fetchers/MACFetcher.java b/src/net/azib/ipscan/fetchers/MACFetcher.java index 0622d614..af5eedfc 100644 --- a/src/net/azib/ipscan/fetchers/MACFetcher.java +++ b/src/net/azib/ipscan/fetchers/MACFetcher.java @@ -2,6 +2,7 @@ package net.azib.ipscan.fetchers; import net.azib.ipscan.core.ScanningSubject; +import java.net.InetAddress; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -13,6 +14,16 @@ public abstract class MACFetcher extends AbstractFetcher { return ID; } + @Override + public final String scan(ScanningSubject subject) { + String mac = (String) subject.getParameter(ID); + if (mac == null) mac = resolveMAC(subject.getAddress()); + subject.setParameter(ID, mac); + return mac; + } + + protected abstract String resolveMAC(InetAddress address); + static String bytesToMAC(byte[] bytes) { StringBuilder mac = new StringBuilder(); for (byte b : bytes) mac.append(String.format("%02X", b)).append(":"); @@ -24,9 +35,4 @@ public abstract class MACFetcher extends AbstractFetcher { Matcher m = macAddressPattern.matcher(line); return m.find() ? m.group().toUpperCase() : null; } - - String remember(String mac, ScanningSubject subject) { - subject.setParameter(ID, mac); - return mac; - } } diff --git a/src/net/azib/ipscan/fetchers/UnixMACFetcher.java b/src/net/azib/ipscan/fetchers/UnixMACFetcher.java index 778c4ba0..445f14d0 100644 --- a/src/net/azib/ipscan/fetchers/UnixMACFetcher.java +++ b/src/net/azib/ipscan/fetchers/UnixMACFetcher.java @@ -1,6 +1,5 @@ package net.azib.ipscan.fetchers; -import net.azib.ipscan.core.ScanningSubject; import net.azib.ipscan.util.IOUtils; import java.io.BufferedReader; @@ -13,8 +12,8 @@ public class UnixMACFetcher extends MACFetcher { @Override public void init() { } - @Override public String scan(ScanningSubject subject) { - String ip = subject.getAddress().getHostAddress(); + @Override public String resolveMAC(InetAddress address) { + String ip = address.getHostAddress(); BufferedReader reader = null; try { // highly inefficient implementation, there must be a better way (using JNA?) @@ -23,7 +22,7 @@ public class UnixMACFetcher extends MACFetcher { String line; while ((line = reader.readLine()) != null) { if (line.contains(ip)) - return remember(extractMAC(line), subject); + return extractMAC(line); } // see if it is a local address @@ -34,8 +33,8 @@ public class UnixMACFetcher extends MACFetcher { Enumeration addrs = netif.getInetAddresses(); while (addrs.hasMoreElements()) { InetAddress addr = addrs.nextElement(); - if (addr.equals(subject.getAddress())) - return remember(bytesToMAC(netif.getHardwareAddress()), subject); + if (addr.equals(address)) + return bytesToMAC(netif.getHardwareAddress()); } } } diff --git a/src/net/azib/ipscan/fetchers/WinMACFetcher.java b/src/net/azib/ipscan/fetchers/WinMACFetcher.java index 5eb8a787..a5dc9e35 100644 --- a/src/net/azib/ipscan/fetchers/WinMACFetcher.java +++ b/src/net/azib/ipscan/fetchers/WinMACFetcher.java @@ -2,10 +2,11 @@ package net.azib.ipscan.fetchers; import com.sun.jna.Memory; import com.sun.jna.Pointer; -import net.azib.ipscan.core.ScanningSubject; import net.azib.ipscan.core.net.WinIpHlpDll; import net.azib.ipscan.core.net.WinIpHlpDll.IpAddrByVal; +import java.net.InetAddress; + public class WinMACFetcher extends MACFetcher { private WinIpHlpDll dll; @@ -13,9 +14,9 @@ public class WinMACFetcher extends MACFetcher { dll = WinIpHlpDll.Loader.load(); } - @Override public String scan(ScanningSubject subject) { + @Override public String resolveMAC(InetAddress address) { IpAddrByVal destIP = new IpAddrByVal(); - destIP.bytes = subject.getAddress().getAddress(); + destIP.bytes = address.getAddress(); Pointer pmac = new Memory(8); Pointer plen = new Memory(4); @@ -26,6 +27,6 @@ public class WinMACFetcher extends MACFetcher { if (result != 0) return null; byte[] bytes = pmac.getByteArray(0, plen.getInt(0)); - return remember(bytesToMAC(bytes), subject); + return bytesToMAC(bytes); } }