--- libaitio/src/Attic/tools.c 2011/10/31 13:53:51 1.6 +++ libaitio/src/Attic/tools.c 2011/12/13 02:22:05 1.6.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: tools.c,v 1.6 2011/10/31 13:53:51 misho Exp $ +* $Id: tools.c,v 1.6.2.1 2011/12/13 02:22:05 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -346,4 +346,120 @@ io_ether_aton(const char *a, struct io_ether_addr *e) e->ether_addr_octet[5] = o5; 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; }