|
|
| version 1.5, 2013/06/19 00:11:16 | version 1.6.4.1, 2013/07/08 01:11:34 |
|---|---|
| Line 46 SUCH DAMAGE. | Line 46 SUCH DAMAGE. |
| #include "global.h" | #include "global.h" |
| static char hexlist[] = "0123456789abcdef"; | |
| /* | /* |
| * e_link_ntoa() - String ethernet address from link address | |
| * | |
| * @sdl = link address | |
| * return: =NULL error or !=NULL ethernet address, should be e_free() | |
| */ | |
| char * | |
| e_link_ntoa(const struct sockaddr_dl *sdl) | |
| { | |
| static char obuf[64]; | |
| char *out = obuf; | |
| int i; | |
| u_char *in = (u_char*) LLADDR(sdl); | |
| u_char *inlim = in + sdl->sdl_alen; | |
| int firsttime = 1; | |
| if (sdl->sdl_nlen) { | |
| memcpy(obuf, sdl->sdl_data, sdl->sdl_nlen); | |
| out += sdl->sdl_nlen; | |
| if (sdl->sdl_alen) | |
| *out++ = '!'; | |
| } | |
| while (in < inlim) { | |
| if (firsttime) | |
| firsttime ^= firsttime; | |
| else | |
| *out++ = ':'; | |
| i = *in++; | |
| if (i > 0xf) { | |
| out[1] = hexlist[i & 0xf]; | |
| i >>= 4; | |
| } else | |
| out[1] = hexlist[0]; | |
| out[0] = hexlist[i]; | |
| out += 2; | |
| } | |
| *out = 0; | |
| return obuf; | |
| } | |
| /* | |
| * e_ether_ntoa() - Convert ethernet address to string | * e_ether_ntoa() - Convert ethernet address to string |
| * | * |
| * @n = ethernet address structure, like struct ether_addr | * @n = ethernet address structure, like struct ether_addr |
| Line 162 e_n2addr(sockaddr_t * __restrict addr, ait_val_t * __r | Line 207 e_n2addr(sockaddr_t * __restrict addr, ait_val_t * __r |
| ret = addr->sun.sun_path; | ret = addr->sun.sun_path; |
| break; | break; |
| case AF_LINK: | case AF_LINK: |
| if (!(s = link_ntoa(&addr->sdl))) { | if (!(s = e_link_ntoa(&addr->sdl))) { |
| LOGERR; | LOGERR; |
| return ret; | return ret; |
| } else | } else |
| Line 392 e_getnet(const char *net) | Line 437 e_getnet(const char *net) |
| e_free(str); | e_free(str); |
| return n; | return n; |
| } | |
| /* | |
| * e_ether_addr() - Get or set ethernet address from interface name | |
| * | |
| * @ifname = interface name | |
| * @addr = if addr is !=NULL then set this for new address | |
| * return: NULL error or !=NULL get ethernet address | |
| */ | |
| ether_addr_t * | |
| e_ether_addr(const char *ifname, ether_addr_t * __restrict addr) | |
| { | |
| ether_addr_t *a = NULL; | |
| struct ifaddrs *p, *ifa = NULL; | |
| if (!ifname) | |
| return NULL; | |
| a = e_malloc(sizeof(ether_addr_t)); | |
| if (!a) | |
| return NULL; | |
| else | |
| memset(a, 0, sizeof(ether_addr_t)); | |
| getifaddrs(&ifa); | |
| for (p = ifa; p; p++) | |
| if (!strcmp(p->ifa_name, ifname) && p->ifa_addr && | |
| p->ifa_addr->sa_family == AF_LINK) { | |
| memcpy(a, LLADDR((struct sockaddr_dl*) p->ifa_addr), sizeof(ether_addr_t)); | |
| break; | |
| } | |
| freeifaddrs(ifa); | |
| return a; | |
| } | } |