package com.limegroup.gnutella.updates;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;
import com.limegroup.gnutella.util.CommonUtils;
/**
* Finds out the Mac address of the machine.
* @author Sumeet Thadani
*/
public class MacAddressFinder {
/**
* Package access. Find the Mac address of the machine depending on the
* operating system.
* <p>
* @return null if we cannot find out.
*/
String getMacAddress() {
try {
if(CommonUtils.isWindows()) {
return getWindowsMac();
}
else if(CommonUtils.isMacOSX()) {
return getOSXMac();
}
else if(CommonUtils.isSolaris()) {
return getSolarisMac();
}
else if(CommonUtils.isLinux()) {
getLinuxMac();
}
else {
return null;
}
} catch (IOException iox) {
return null;
}
return null;
}
private String getWindowsMac() throws IOException {
String result = runCommand("ipconfig /all");
return parseResult(result,":");
}
private String getOSXMac() throws IOException {
String result = runCommand("ifconfig -a");
return parseResult(result,"ether");
}
private String getLinuxMac() throws IOException {
String result = runCommand("LANG=C /sbin/ifconfig");
if(result.length()<17)//unknown result, but it's gotta be bigger than 17
result = runCommand("LANG=C /bin/ifconfig");
if(result.length() < 17) //need to try another?
result = runCommand("LANG=C ifconfig");//getting desperate here.
return parseResult(result,"hwaddr");
}
private String getSolarisMac() throws IOException {
String result = runCommand("ifconfig -a");//TODO1: correct command?
return parseResult(result,"ether");//TODO1: correct delimiter?
}
private String parseResult(String result, String delimiter) {
result = result.toLowerCase();//lets ignore all case
StringTokenizer tok = new StringTokenizer(result,"\n");
while(tok.hasMoreTokens()) {//for each line of result
String line = tok.nextToken();
int index = line.indexOf(delimiter);
if(index >= 0) {//the line contains the delimiter
String address=line.substring(index+delimiter.length()).trim();
//address contains the rest of the line after the delimiter.
address = canonicalizeMacAddress(address);
if(address!=null)
return address;//null if in bad form
}
}
return null;
}
private String canonicalizeMacAddress(String address) {
if(address.length()!=17)
return null;
//check that we have six pair of numbers, separated by : or -
StringBuffer ret = new StringBuffer();
StringTokenizer tok = new StringTokenizer(address,":.-");
for(int i=0; i<6;i++) {
String val=null;
try {
val = tok.nextToken();
if(val.length()!=2)
return null;
} catch (NoSuchElementException nsex) {
return null;
}
ret.append(val);
if(i<5)
ret.append("-");
}
return ret.toString();
}
/**
* @return the results of the command we just ran
* @param command the command - platform dependent.
*/
private String runCommand(String command) throws IOException {
//TODO1: make sure the path is set correctly, or we are not going to be
//able to execute the command
Process process = Runtime.getRuntime().exec(command);
InputStream iStream = new BufferedInputStream(process.getInputStream());
StringBuffer buffer = new StringBuffer();//store the resutls
while(true) {
int c = iStream.read();
if(c==-1) //eof?
break;
buffer.append((char)c);
}//buffer has all the data from the command.
iStream.close();
return buffer.toString();
}
public static void main(String[] args) {
MacAddressFinder f = new MacAddressFinder();
System.out.println("The mac address is "+f.getMacAddress());
}
}