1*1285115cSWilliam A. Kennington III /* 2*1285115cSWilliam A. Kennington III * Copyright 2021 Google LLC 3*1285115cSWilliam A. Kennington III * 4*1285115cSWilliam A. Kennington III * Licensed under the Apache License, Version 2.0 (the "License"); 5*1285115cSWilliam A. Kennington III * you may not use this file except in compliance with the License. 6*1285115cSWilliam A. Kennington III * You may obtain a copy of the License at 7*1285115cSWilliam A. Kennington III * 8*1285115cSWilliam A. Kennington III * http://www.apache.org/licenses/LICENSE-2.0 9*1285115cSWilliam A. Kennington III * 10*1285115cSWilliam A. Kennington III * Unless required by applicable law or agreed to in writing, software 11*1285115cSWilliam A. Kennington III * distributed under the License is distributed on an "AS IS" BASIS, 12*1285115cSWilliam A. Kennington III * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*1285115cSWilliam A. Kennington III * See the License for the specific language governing permissions and 14*1285115cSWilliam A. Kennington III * limitations under the License. 15*1285115cSWilliam A. Kennington III */ 16*1285115cSWilliam A. Kennington III 17*1285115cSWilliam A. Kennington III #include <inttypes.h> 18*1285115cSWilliam A. Kennington III #include <net/ethernet.h> 19*1285115cSWilliam A. Kennington III #include <stdio.h> 20*1285115cSWilliam A. Kennington III 21*1285115cSWilliam A. Kennington III #define ETH_STRLEN (ETH_ALEN * 3) 22*1285115cSWilliam A. Kennington III #define HEX_OUT "%02" PRIx8 23*1285115cSWilliam A. Kennington III #define ETH_OUT \ 24*1285115cSWilliam A. Kennington III HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT 25*1285115cSWilliam A. Kennington III #define HEX_IN "%2" SCNx8 26*1285115cSWilliam A. Kennington III #define ETH_IN HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN 27*1285115cSWilliam A. Kennington III 28*1285115cSWilliam A. Kennington III int to_ether_addr(const char* str, struct ether_addr* ret) 29*1285115cSWilliam A. Kennington III { 30*1285115cSWilliam A. Kennington III char sentinel; 31*1285115cSWilliam A. Kennington III return sscanf(str, ETH_IN "%c", &ret->ether_addr_octet[0], 32*1285115cSWilliam A. Kennington III &ret->ether_addr_octet[1], &ret->ether_addr_octet[2], 33*1285115cSWilliam A. Kennington III &ret->ether_addr_octet[3], &ret->ether_addr_octet[4], 34*1285115cSWilliam A. Kennington III &ret->ether_addr_octet[5], &sentinel) != ETH_ALEN; 35*1285115cSWilliam A. Kennington III } 36*1285115cSWilliam A. Kennington III 37*1285115cSWilliam A. Kennington III void from_ether_addr(const struct ether_addr* addr, char* ret) 38*1285115cSWilliam A. Kennington III { 39*1285115cSWilliam A. Kennington III sprintf(ret, ETH_OUT, addr->ether_addr_octet[0], addr->ether_addr_octet[1], 40*1285115cSWilliam A. Kennington III addr->ether_addr_octet[2], addr->ether_addr_octet[3], 41*1285115cSWilliam A. Kennington III addr->ether_addr_octet[4], addr->ether_addr_octet[5]); 42*1285115cSWilliam A. Kennington III } 43*1285115cSWilliam A. Kennington III 44*1285115cSWilliam A. Kennington III int main(int argc, char* argv[]) 45*1285115cSWilliam A. Kennington III { 46*1285115cSWilliam A. Kennington III if (argc < 1) 47*1285115cSWilliam A. Kennington III { 48*1285115cSWilliam A. Kennington III return 1; 49*1285115cSWilliam A. Kennington III } 50*1285115cSWilliam A. Kennington III if (argc != 2) 51*1285115cSWilliam A. Kennington III { 52*1285115cSWilliam A. Kennington III fprintf(stderr, "Usage: %s <mac address>\n", argv[0]); 53*1285115cSWilliam A. Kennington III return 1; 54*1285115cSWilliam A. Kennington III } 55*1285115cSWilliam A. Kennington III 56*1285115cSWilliam A. Kennington III struct ether_addr addr; 57*1285115cSWilliam A. Kennington III if (to_ether_addr(argv[1], &addr) != 0) 58*1285115cSWilliam A. Kennington III { 59*1285115cSWilliam A. Kennington III fprintf(stderr, "Invalid MAC Address: %s\n", argv[1]); 60*1285115cSWilliam A. Kennington III return 2; 61*1285115cSWilliam A. Kennington III } 62*1285115cSWilliam A. Kennington III 63*1285115cSWilliam A. Kennington III char str[ETH_STRLEN]; 64*1285115cSWilliam A. Kennington III from_ether_addr(&addr, str); 65*1285115cSWilliam A. Kennington III printf("%s\n", str); 66*1285115cSWilliam A. Kennington III return 0; 67*1285115cSWilliam A. Kennington III } 68