This perl script collects MAC addresses on a local ethernet-based IP network.
It does this by sending ICMP ECHO packets asynchronously to the specified
range of addresses, and then picks up the ARP cache by running
arp -a after waiting for replies.
If I recall correctly, this was the first program I wrote that uses raw sockets.
Source code: macaddress.pl.
When calling macaddress as a CGI script, a setuid-root wrapper is needed
to give the Perl process enough privileges for handling raw sockets.
Here is the wrapper I use. Compile it and do:
chown root macaddress && chmod 4711 macaddress.
#include <unistd.h>
#include <stdio.h>
#define PROGRAM_PATH "/usr/local/bin/macaddress.pl"
main(int argc, char *argv[]) {
argv[1] = 0;
execvp(PROGRAM_PATH, argv);
fprintf(stderr, "%s: exec failed.\n", argv[0]);
exit(1);
}