--- libaitio/src/Attic/tools.c 2012/05/14 12:49:21 1.11 +++ libaitio/src/Attic/tools.c 2012/05/14 16:14:13 1.12 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: tools.c,v 1.11 2012/05/14 12:49:21 misho Exp $ +* $Id: tools.c,v 1.12 2012/05/14 16:14:13 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -480,23 +480,28 @@ io_n2addr(io_sockaddr_t * __restrict addr, ait_val_t * io_sockaddr_t * io_gethostbyname(const char *psHost, u_short port, io_sockaddr_t * __restrict addr) { - struct hostent *host; + struct hostent *host = NULL; 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)); - memset(addr, 0, sizeof(io_sockaddr_t)); - switch (host->h_addrtype) { + if (*psHost != '/') { + /* 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; + } else + addr->sa.sa_family = host->h_addrtype; + } else + addr->sa.sa_family = AF_LOCAL; + + switch (addr->sa.sa_family) { case AF_INET: addr->sin.sin_len = sizeof(struct sockaddr_in); addr->sin.sin_family = AF_INET; @@ -509,9 +514,14 @@ io_gethostbyname(const char *psHost, u_short port, io_ addr->sin6.sin6_port = htons(port); memcpy(&addr->sin6.sin6_addr, host->h_addr, sizeof addr->sin6.sin6_addr); return addr; + case AF_LOCAL: + addr->sun.sun_len = sizeof(struct sockaddr_un); + addr->sun.sun_family = AF_LOCAL; + memset(addr->sun.sun_path, 0, sizeof addr->sun.sun_path); + snprintf(addr->sun.sun_path, sizeof addr->sun.sun_path, "%s-%hu", psHost, port); + return addr; default: - io_SetErr(EPROTONOSUPPORT, "Unsuported address family %d", - host->h_addrtype); + io_SetErr(EPROTONOSUPPORT, "Unsuported address family %d", addr->sa.sa_family); break; }