| /* vi: set sw=4 ts=4: */ | 
 | /* | 
 |  * This program is free software; you can redistribute it and/or | 
 |  * modify it under the terms of the GNU General Public License | 
 |  * as published by the Free Software Foundation; either version | 
 |  * 2 of the License, or (at your option) any later version. | 
 |  * | 
 |  * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> | 
 |  */ | 
 |  | 
 | #include <net/if_arp.h> | 
 |  | 
 | #include "libbb.h" | 
 | #include "rt_names.h" | 
 | #include "utils.h" | 
 |  | 
 |  | 
 | const char* FAST_FUNC ll_addr_n2a(unsigned char *addr, int alen, int type, char *buf, int blen) | 
 | { | 
 | 	int i; | 
 | 	int l; | 
 |  | 
 | 	if (alen == 4 | 
 | 	 && (type == ARPHRD_TUNNEL || type == ARPHRD_SIT || type == ARPHRD_IPGRE) | 
 | 	) { | 
 | 		return inet_ntop(AF_INET, addr, buf, blen); | 
 | 	} | 
 | 	l = 0; | 
 | 	for (i = 0; i < alen; i++) { | 
 | 		if (i == 0) { | 
 | 			snprintf(buf + l, blen, ":%02x"+1, addr[i]); | 
 | 			blen -= 2; | 
 | 			l += 2; | 
 | 		} else { | 
 | 			snprintf(buf + l, blen, ":%02x", addr[i]); | 
 | 			blen -= 3; | 
 | 			l += 3; | 
 | 		} | 
 | 	} | 
 | 	return buf; | 
 | } | 
 |  | 
 | int FAST_FUNC ll_addr_a2n(unsigned char *lladdr, int len, char *arg) | 
 | { | 
 | 	int i; | 
 |  | 
 | 	if (strchr(arg, '.')) { | 
 | 		inet_prefix pfx; | 
 | 		if (get_addr_1(&pfx, arg, AF_INET)) { | 
 | 			bb_error_msg("\"%s\" is invalid lladdr", arg); | 
 | 			return -1; | 
 | 		} | 
 | 		if (len < 4) { | 
 | 			return -1; | 
 | 		} | 
 | 		memcpy(lladdr, pfx.data, 4); | 
 | 		return 4; | 
 | 	} | 
 |  | 
 | 	for (i = 0; i < len; i++) { | 
 | 		int temp; | 
 | 		char *cp = strchr(arg, ':'); | 
 | 		if (cp) { | 
 | 			*cp = 0; | 
 | 			cp++; | 
 | 		} | 
 | 		if (sscanf(arg, "%x", &temp) != 1 || (temp < 0 || temp > 255)) { | 
 | 			bb_error_msg("\"%s\" is invalid lladdr", arg); | 
 | 			return -1; | 
 | 		} | 
 | 		lladdr[i] = temp; | 
 | 		if (!cp) { | 
 | 			break; | 
 | 		} | 
 | 		arg = cp; | 
 | 	} | 
 | 	return i+1; | 
 | } |