1/* vi: set sw=4 ts=4: */ 2/* 3 * ll_addr.c 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License 7 * as published by the Free Software Foundation; either version 8 * 2 of the License, or (at your option) any later version. 9 * 10 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 11 */ 12 13#include <net/if_arp.h> 14 15#include "libbb.h" 16#include "rt_names.h" 17#include "utils.h" 18 19 20const char* FAST_FUNC ll_addr_n2a(unsigned char *addr, int alen, int type, char *buf, int blen) 21{ 22 int i; 23 int l; 24 25 if (alen == 4 26 && (type == ARPHRD_TUNNEL || type == ARPHRD_SIT || type == ARPHRD_IPGRE) 27 ) { 28 return inet_ntop(AF_INET, addr, buf, blen); 29 } 30 l = 0; 31 for (i = 0; i < alen; i++) { 32 if (i == 0) { 33 snprintf(buf + l, blen, ":%02x"+1, addr[i]); 34 blen -= 2; 35 l += 2; 36 } else { 37 snprintf(buf + l, blen, ":%02x", addr[i]); 38 blen -= 3; 39 l += 3; 40 } 41 } 42 return buf; 43} 44 45int FAST_FUNC ll_addr_a2n(unsigned char *lladdr, int len, char *arg) 46{ 47 int i; 48 49 if (strchr(arg, '.')) { 50 inet_prefix pfx; 51 if (get_addr_1(&pfx, arg, AF_INET)) { 52 bb_error_msg("\"%s\" is invalid lladdr", arg); 53 return -1; 54 } 55 if (len < 4) { 56 return -1; 57 } 58 memcpy(lladdr, pfx.data, 4); 59 return 4; 60 } 61 62 for (i = 0; i < len; i++) { 63 int temp; 64 char *cp = strchr(arg, ':'); 65 if (cp) { 66 *cp = 0; 67 cp++; 68 } 69 if (sscanf(arg, "%x", &temp) != 1 || (temp < 0 || temp > 255)) { 70 bb_error_msg("\"%s\" is invalid lladdr", arg); 71 return -1; 72 } 73 lladdr[i] = temp; 74 if (!cp) { 75 break; 76 } 77 arg = cp; 78 } 79 return i+1; 80} 81