#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>

#include <linux/if.h>
#include <linux/ethtool.h>
#include <linux/sockios.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define PROG "get-perm-mac-addr"
#define ADDR_LEN 6

int main(int argc, char **argv) {
  int fd, ret;
  char *iface;
  struct ethtool_perm_addr *edata;
  struct ifreq ifr;

  if (argc != 2) {
    fprintf(stderr, "Usage: " PROG " <interface>\n");
    exit(1);
  }

  iface = argv[1];
  strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name)-1);

  edata = (struct ethtool_perm_addr *)
    malloc(sizeof(struct ethtool_perm_addr) + ADDR_LEN);
  edata->cmd = ETHTOOL_GPERMADDR;
  edata->size = ADDR_LEN;
  ifr.ifr_data = edata;

  fd = socket(AF_INET, SOCK_DGRAM, 0);
  if (fd == -1) {
    perror(PROG);
    exit(2);
  }
  if (ioctl(fd, SIOCETHTOOL, &ifr) == -1) {
    perror(PROG);
    exit(3);
  }
  close(fd);

  printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
	 edata->data[0], edata->data[1], edata->data[2],
	 edata->data[3], edata->data[4], edata->data[5]);

  exit(0);
}

