11285115cSWilliam A. Kennington III /* 21285115cSWilliam A. Kennington III * Copyright 2021 Google LLC 31285115cSWilliam A. Kennington III * 41285115cSWilliam A. Kennington III * Licensed under the Apache License, Version 2.0 (the "License"); 51285115cSWilliam A. Kennington III * you may not use this file except in compliance with the License. 61285115cSWilliam A. Kennington III * You may obtain a copy of the License at 71285115cSWilliam A. Kennington III * 81285115cSWilliam A. Kennington III * http://www.apache.org/licenses/LICENSE-2.0 91285115cSWilliam A. Kennington III * 101285115cSWilliam A. Kennington III * Unless required by applicable law or agreed to in writing, software 111285115cSWilliam A. Kennington III * distributed under the License is distributed on an "AS IS" BASIS, 121285115cSWilliam A. Kennington III * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131285115cSWilliam A. Kennington III * See the License for the specific language governing permissions and 141285115cSWilliam A. Kennington III * limitations under the License. 151285115cSWilliam A. Kennington III */ 161285115cSWilliam A. Kennington III 171285115cSWilliam A. Kennington III #include <inttypes.h> 181285115cSWilliam A. Kennington III #include <net/ethernet.h> 191285115cSWilliam A. Kennington III #include <stdio.h> 201285115cSWilliam A. Kennington III 211285115cSWilliam A. Kennington III #define ETH_STRLEN (ETH_ALEN * 3) 221285115cSWilliam A. Kennington III #define HEX_OUT "%02" PRIx8 231285115cSWilliam A. Kennington III #define ETH_OUT \ 241285115cSWilliam A. Kennington III HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT 251285115cSWilliam A. Kennington III #define HEX_IN "%2" SCNx8 261285115cSWilliam A. Kennington III #define ETH_IN HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN 271285115cSWilliam A. Kennington III 281285115cSWilliam A. Kennington III int to_ether_addr(const char* str, struct ether_addr* ret) 291285115cSWilliam A. Kennington III { 301285115cSWilliam A. Kennington III char sentinel; 311285115cSWilliam A. Kennington III return sscanf(str, ETH_IN "%c", &ret->ether_addr_octet[0], 321285115cSWilliam A. Kennington III &ret->ether_addr_octet[1], &ret->ether_addr_octet[2], 331285115cSWilliam A. Kennington III &ret->ether_addr_octet[3], &ret->ether_addr_octet[4], 341285115cSWilliam A. Kennington III &ret->ether_addr_octet[5], &sentinel) != ETH_ALEN; 351285115cSWilliam A. Kennington III } 361285115cSWilliam A. Kennington III 371285115cSWilliam A. Kennington III void from_ether_addr(const struct ether_addr* addr, char* ret) 381285115cSWilliam A. Kennington III { 391285115cSWilliam A. Kennington III sprintf(ret, ETH_OUT, addr->ether_addr_octet[0], addr->ether_addr_octet[1], 401285115cSWilliam A. Kennington III addr->ether_addr_octet[2], addr->ether_addr_octet[3], 411285115cSWilliam A. Kennington III addr->ether_addr_octet[4], addr->ether_addr_octet[5]); 421285115cSWilliam A. Kennington III } 431285115cSWilliam A. Kennington III 441285115cSWilliam A. Kennington III int main(int argc, char* argv[]) 451285115cSWilliam A. Kennington III { 461285115cSWilliam A. Kennington III if (argc < 1) 471285115cSWilliam A. Kennington III { 481285115cSWilliam A. Kennington III return 1; 491285115cSWilliam A. Kennington III } 501285115cSWilliam A. Kennington III if (argc != 2) 511285115cSWilliam A. Kennington III { 521285115cSWilliam A. Kennington III fprintf(stderr, "Usage: %s <mac address>\n", argv[0]); 531285115cSWilliam A. Kennington III return 1; 541285115cSWilliam A. Kennington III } 551285115cSWilliam A. Kennington III 561285115cSWilliam A. Kennington III struct ether_addr addr; 571285115cSWilliam A. Kennington III if (to_ether_addr(argv[1], &addr) != 0) 581285115cSWilliam A. Kennington III { 591285115cSWilliam A. Kennington III fprintf(stderr, "Invalid MAC Address: %s\n", argv[1]); 601285115cSWilliam A. Kennington III return 2; 611285115cSWilliam A. Kennington III } 621285115cSWilliam A. Kennington III 631285115cSWilliam A. Kennington III char str[ETH_STRLEN]; 641285115cSWilliam A. Kennington III from_ether_addr(&addr, str); 651285115cSWilliam A. Kennington III printf("%s\n", str); 661285115cSWilliam A. Kennington III return 0; 671285115cSWilliam A. Kennington III } 68