ret_t cherokee_socket_gethostbyname (cherokee_socket_t *socket, cherokee_buffer_t *hostname) { #ifndef _WIN32 ret_t ret; cherokee_resolv_cache_t *resolv = NULL; /* Unix sockets */ if (SOCKET_AF(socket) == AF_UNIX) { memset ((char*) SOCKET_SUN_PATH(socket), 0, sizeof (SOCKET_ADDR_UNIX(socket))); SOCKET_ADDR_UNIX(socket)->sun_family = AF_UNIX; if (hostname->buf[0] == '@') { strncpy (SOCKET_SUN_PATH (socket) + 1, hostname->buf + 1, (sizeof (SOCKET_ADDR_UNIX(socket)->sun_path) - 1) - sizeof(short)); SOCKET_SUN_PATH (socket)[0] = 0; } else { strncpy (SOCKET_SUN_PATH (socket), hostname->buf, sizeof (SOCKET_ADDR_UNIX(socket)->sun_path) - sizeof(short)); } return ret_ok; } /* TCP sockets */ ret = cherokee_resolv_cache_get_default (&resolv); if (ret != ret_ok) { return ret_error; } ret = cherokee_resolv_cache_get_host (resolv, hostname, socket); if (ret != ret_ok) { return ret_error; } return ret_ok; #else SHOULDNT_HAPPEN; return ret_no_sys; #endif }
ret_t cherokee_proxy_util_init_socket (cherokee_socket_t *socket, cherokee_source_t *src) { ret_t ret; cherokee_resolv_cache_t *resolv; TRACE (ENTRIES, "Initializing proxy socket: %s\n", cherokee_string_is_ipv6 (&src->host) ? "IPv6": "IPv4"); /* Family */ if (cherokee_string_is_ipv6 (&src->host)) { ret = cherokee_socket_set_client (socket, AF_INET6); } else { ret = cherokee_socket_set_client (socket, AF_INET); } if (unlikely(ret != ret_ok)) return ret_error; /* TCP port */ SOCKET_SIN_PORT(socket) = htons (src->port); /* IP host */ ret = cherokee_resolv_cache_get_default (&resolv); if (unlikely (ret != ret_ok)) { return ret_error; } ret = cherokee_resolv_cache_get_host (resolv, &src->host, socket); if (ret != ret_ok) { return ret_error; } /* Set a few properties */ cherokee_fd_set_closexec (socket->socket); cherokee_fd_set_nonblocking (socket->socket, true); cherokee_fd_set_nodelay (socket->socket, true); return ret_ok; }