1 #include <inttypes.h> 2 #include <net/ethernet.h> 3 #include <stdio.h> 4 5 #define ETH_STRLEN (ETH_ALEN * 3) 6 #define HEX_OUT "%02" PRIx8 7 #define ETH_OUT \ 8 HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT 9 #define HEX_IN "%2" SCNx8 10 #define ETH_IN HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN 11 12 int to_ether_addr(const char* str, struct ether_addr* ret) 13 { 14 char sentinel; 15 return sscanf(str, ETH_IN "%c", &ret->ether_addr_octet[0], 16 &ret->ether_addr_octet[1], &ret->ether_addr_octet[2], 17 &ret->ether_addr_octet[3], &ret->ether_addr_octet[4], 18 &ret->ether_addr_octet[5], &sentinel) != ETH_ALEN; 19 } 20 21 void from_ether_addr(const struct ether_addr* addr, char* ret) 22 { 23 sprintf(ret, ETH_OUT, addr->ether_addr_octet[0], addr->ether_addr_octet[1], 24 addr->ether_addr_octet[2], addr->ether_addr_octet[3], 25 addr->ether_addr_octet[4], addr->ether_addr_octet[5]); 26 } 27 28 int main(int argc, char* argv[]) 29 { 30 if (argc < 1) 31 { 32 return 1; 33 } 34 if (argc != 2) 35 { 36 fprintf(stderr, "Usage: %s <mac address>\n", argv[0]); 37 return 1; 38 } 39 40 struct ether_addr addr; 41 if (to_ether_addr(argv[1], &addr) != 0) 42 { 43 fprintf(stderr, "Invalid MAC Address: %s\n", argv[1]); 44 return 2; 45 } 46 47 char str[ETH_STRLEN]; 48 from_ether_addr(&addr, str); 49 printf("%s\n", str); 50 return 0; 51 } 52