ret_t cherokee_socket_pton (cherokee_socket_t *socket, cherokee_buffer_t *host) { int re; switch (SOCKET_AF(socket)) { case AF_INET: #ifdef HAVE_INET_PTON re = inet_pton (AF_INET, host->buf, &SOCKET_SIN_ADDR(socket)); if (re <= 0) return ret_error; #else re = inet_aton (host->buf, &SOCKET_SIN_ADDR(socket)); if (re == 0) return ret_error; #endif break; #ifdef HAVE_IPV6 case AF_INET6: re = inet_pton (AF_INET6, host->buf, &SOCKET_SIN6_ADDR(socket)); if (re <= 0) return ret_error; break; #endif default: LOG_CRITICAL (CHEROKEE_ERROR_SOCKET_BAD_FAMILY, SOCKET_AF(socket)); return ret_error; } return ret_ok; }
ret_t cherokee_socket_update_from_addrinfo (cherokee_socket_t *socket, const struct addrinfo *addr, cuint_t num) { const struct addrinfo *ai; if (unlikely (addr == NULL)) return ret_error; /* Find the right address */ ai = addr; while (num > 0) { num -= 1; ai = ai->ai_next; if (ai == NULL) { return ret_not_found; } } /* Copy the information */ SOCKET_AF(socket) = addr->ai_family; socket->client_addr_len = addr->ai_addrlen; switch (addr->ai_family) { case AF_INET: memcpy (&SOCKET_SIN_ADDR(socket), &((struct sockaddr_in *) ai->ai_addr)->sin_addr, sizeof(struct in_addr)); break; case AF_INET6: memcpy (&SOCKET_SIN6_ADDR(socket), &((struct sockaddr_in6 *) ai->ai_addr)->sin6_addr, sizeof(struct in6_addr)); break; default: SHOULDNT_HAPPEN; return ret_error; } return ret_ok; }
ret_t cherokee_socket_gethostbyname (cherokee_socket_t *socket, cherokee_buffer_t *hostname) { if (SOCKET_AF(socket) == AF_UNIX) { #ifdef _WIN32 SHOULDNT_HAPPEN; return ret_no_sys; #else memset ((char*) SOCKET_SUN_PATH(socket), 0, sizeof (SOCKET_ADDR_UNIX(socket))); SOCKET_ADDR_UNIX(socket)->sun_family = AF_UNIX; strncpy (SOCKET_SUN_PATH (socket), hostname->buf, sizeof (SOCKET_ADDR_UNIX(socket)->sun_path) - sizeof(short)); return ret_ok; #endif } return cherokee_gethostbyname (hostname->buf, &SOCKET_SIN_ADDR(socket)); }