By Paul Johnson-Oracle on Feb 09, 2010
I needed to find a way to get the physical (MAC) address using C. From what I could gather from searching opensolaris.org, there are two methods for retrieving it: libdlpi and arp. libdlpi is the more elegant solution as it requires a simple call to dlpi_get_physaddr(). This is how ifconfig prints your network interface's MAC address. Unfortunately, libdlpi calls are only permitted as root.
As explained by James Carlson:
The reason it was like this was historical: getting the MAC address in
ifconfig meant opening up the DLPI node and talking to the driver. As
the drivers didn't have discrete privileges for each operation, and
you had to be almighty root to touch them, 'ifconfig' didn't show the
MAC address when not privileged.
The second solution is to use arp. In Solaris you can determine the physical address by looking at the arp tables directly (`arp -a | grep <INTERFACE>` or `netstat -p | grep <INTERFACE>`). With C, this can be done by using the if sockets and arp libraries.
I wrote up a solution called "getmac" using both methods. You can gather it here.
$ wget http://www.pauliesworld.org/project/getmac.c $ gcc getmac.c -o getmac -lsocket -ldlpi $ ./getmac <interface_name> arp: ffffffffffff dlpi: dlpi failure, are you root? $ pfexec ./getmac <interface_name> arp: ffffffffffff dlpi: ffffffffffff