|
|
| version 1.5.4.2, 2011/10/14 07:39:47 | version 1.6.2.1, 2011/12/13 02:22:05 |
|---|---|
| Line 347 io_ether_aton(const char *a, struct io_ether_addr *e) | Line 347 io_ether_aton(const char *a, struct io_ether_addr *e) |
| return e; | return e; |
| } | } |
| /* | |
| * io_n2port() Extract port from network structure | |
| * @addr = Address | |
| * return: 0 not supported family type or port number | |
| */ | |
| inline u_short | |
| io_n2port(io_sockaddr_t * __restrict addr) | |
| { | |
| u_short port = 0; | |
| if (!addr) | |
| return port; | |
| switch (addr->sa.sa_family) { | |
| case AF_INET: | |
| return ntohs(addr->sin.sin_port); | |
| case AF_INET6: | |
| return ntohs(addr->sin6.sin6_port); | |
| default: | |
| io_SetErr(ESOCKTNOSUPPORT, "Unsuported address family %d", | |
| addr->sa.sa_family); | |
| break; | |
| } | |
| return port; | |
| } | |
| /* | |
| * io_n2addr() Extract address from network structure | |
| * @addr = Address | |
| * @val = Value for store string address | |
| * return: NULL error or !=NULL string address from val | |
| */ | |
| const char * | |
| io_n2addr(io_sockaddr_t * __restrict addr, ait_val_t * __restrict val) | |
| { | |
| char str[INET6_ADDRSTRLEN] = { 0 }; | |
| const char *ret = NULL; | |
| if (!addr || !val) | |
| return ret; | |
| switch (addr->sa.sa_family) { | |
| case AF_INET: | |
| if (!inet_ntop(AF_INET, &addr->sin.sin_addr, str, INET_ADDRSTRLEN)) { | |
| LOGERR; | |
| return ret; | |
| } else | |
| ret = str; | |
| break; | |
| case AF_INET6: | |
| if (!inet_ntop(AF_INET6, &addr->sin6.sin6_addr, str, INET6_ADDRSTRLEN)) { | |
| LOGERR; | |
| return ret; | |
| } else | |
| ret = str; | |
| break; | |
| default: | |
| io_SetErr(EPROTONOSUPPORT, "Unsuported address family %d", | |
| addr->sa.sa_family); | |
| return ret; | |
| } | |
| AIT_FREE_VAL(val); | |
| AIT_SET_STR(val, ret); | |
| return ret; | |
| } | |
| /* | |
| * io_gethostbyname() Get host and port and make network structure | |
| * @psHost = Hostname | |
| * @port = Port | |
| * @addr = Network address structure | |
| * return: NULL error or !=NULL network structure | |
| */ | |
| io_sockaddr_t * | |
| io_gethostbyname(const char *psHost, u_short port, io_sockaddr_t * __restrict addr) | |
| { | |
| struct hostent *host; | |
| if (!psHost || !addr) | |
| return NULL; | |
| /* resolver */ | |
| if (!addr->sa.sa_family) | |
| host = gethostbyname(psHost); | |
| else | |
| host = gethostbyname2(psHost, addr->sa.sa_family); | |
| if (!host) { | |
| io_SetErr(EINVAL, "Resolver #%d - %s", h_errno, hstrerror(h_errno)); | |
| return NULL; | |
| } | |
| memset(addr, 0, sizeof(io_sockaddr_t)); | |
| switch (host->h_addrtype) { | |
| case AF_INET: | |
| addr->sin.sin_len = sizeof(struct sockaddr_in); | |
| addr->sin.sin_family = AF_INET; | |
| addr->sin.sin_port = htons(port); | |
| memcpy(&addr->sin.sin_addr, host->h_addr, sizeof addr->sin.sin_addr); | |
| return addr; | |
| case AF_INET6: | |
| addr->sin6.sin6_len = sizeof(struct sockaddr_in6); | |
| addr->sin6.sin6_family = AF_INET6; | |
| addr->sin6.sin6_port = htons(port); | |
| memcpy(&addr->sin6.sin6_addr, host->h_addr, sizeof addr->sin6.sin6_addr); | |
| return addr; | |
| default: | |
| io_SetErr(EPROTONOSUPPORT, "Unsuported address family %d", | |
| host->h_addrtype); | |
| break; | |
| } | |
| return NULL; | |
| } |