void h2o_socketpool_init_by_hostport(h2o_socketpool_t *pool, h2o_iovec_t host, uint16_t port, size_t capacity) { struct sockaddr_in sin = {}; if (h2o_hostinfo_aton(host, &sin.sin_addr) == 0) { sin.sin_family = AF_INET; sin.sin_port = htons(port); h2o_socketpool_init_by_address(pool, (void *)&sin, sizeof(sin), capacity); return; } common_init(pool, H2O_SOCKETPOOL_TYPE_NAMED, capacity); pool->peer.named.host = h2o_strdup(NULL, host.base, host.len); pool->peer.named.port.base = h2o_mem_alloc(sizeof("65535")); pool->peer.named.port.len = sprintf(pool->peer.named.port.base, "%u", (unsigned)port); }
void h2o_socketpool_init_by_hostport(h2o_socketpool_t *pool, h2o_iovec_t host, uint16_t port, int is_ssl, size_t capacity) { struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); if (h2o_hostinfo_aton(host, &sin.sin_addr) == 0) { sin.sin_family = AF_INET; sin.sin_port = htons(port); h2o_socketpool_init_by_address(pool, (void *)&sin, sizeof(sin), is_ssl, capacity); return; } common_init(pool, H2O_SOCKETPOOL_TYPE_NAMED, host, is_ssl, capacity); pool->peer.named_serv.base = h2o_mem_alloc(sizeof(H2O_UINT16_LONGEST_STR)); pool->peer.named_serv.len = sprintf(pool->peer.named_serv.base, "%u", (unsigned)port); }
void h2o_socketpool_init(h2o_socketpool_t *pool, h2o_iovec_t host, uint16_t port, size_t capacity) { memset(pool, 0, sizeof(*pool)); if (h2o_hostinfo_aton(host, &pool->peer.sin.sin_addr) == 0) { pool->peer.sin.sin_family = AF_INET; pool->peer.sin.sin_port = htons(port); } else { pool->peer.named.host = h2o_strdup(NULL, host.base, host.len); pool->peer.named.port.base = h2o_mem_alloc(sizeof("65535")); pool->peer.named.port.len = sprintf(pool->peer.named.port.base, "%u", (unsigned)port); pool->peer.is_named = 1; } pool->capacity = capacity; pool->timeout = UINT64_MAX; pthread_mutex_init(&pool->_shared.mutex, NULL); h2o_linklist_init_anchor(&pool->_shared.sockets); }
h2o_socketpool_target_type_t detect_target_type(h2o_url_t *url, struct sockaddr_storage *sa, socklen_t *salen) { memset(sa, 0, sizeof(*sa)); const char *to_sun_err = h2o_url_host_to_sun(url->host, (struct sockaddr_un *)sa); if (to_sun_err == h2o_url_host_to_sun_err_is_not_unix_socket) { sa->ss_family = AF_INET; struct sockaddr_in *sin = (struct sockaddr_in *)sa; *salen = sizeof(*sin); if (h2o_hostinfo_aton(url->host, &sin->sin_addr) == 0) { sin->sin_port = htons(h2o_url_get_port(url)); return H2O_SOCKETPOOL_TYPE_SOCKADDR; } else { return H2O_SOCKETPOOL_TYPE_NAMED; } } else { assert(to_sun_err == NULL); struct sockaddr_un *sun = (struct sockaddr_un *)sa; *salen = sizeof(*sun); return H2O_SOCKETPOOL_TYPE_SOCKADDR; } }
static void test_aton(void) { struct in_addr addr; memset(&addr, 0x55, sizeof(addr)); #ifndef _MSC_VER ok(h2o_hostinfo_aton((h2o_iovec_t){H2O_STRLIT("127.0.0.1")}, &addr) == 0); #else ok(h2o_hostinfo_aton((h2o_iovec_t) { H2O_MY_STRLIT("127.0.0.1") }, &addr) == 0); #endif ok(ntohl(addr.s_addr) == 0x7f000001); memset(&addr, 0x55, sizeof(addr)); #ifndef _MSC_VER ok(h2o_hostinfo_aton((h2o_iovec_t){"127.0.0.12", sizeof("127.0.0.1") - 1}, &addr) == 0); #else ok(h2o_hostinfo_aton((h2o_iovec_t) { sizeof("127.0.0.1") - 1 , "127.0.0.12" }, &addr) == 0); #endif ok(ntohl(addr.s_addr) == 0x7f000001); memset(&addr, 0x55, sizeof(addr)); #ifndef _MSC_VER ok(h2o_hostinfo_aton((h2o_iovec_t){H2O_STRLIT("255.001.002.128")}, &addr) == 0); #else ok(h2o_hostinfo_aton((h2o_iovec_t) { H2O_MY_STRLIT("255.001.002.128") }, &addr) == 0); #endif ok(ntohl(addr.s_addr) == 0xff010280); #ifndef _MSC_VER ok(h2o_hostinfo_aton((h2o_iovec_t){H2O_STRLIT("127.0.0.z")}, &addr) != 0); ok(h2o_hostinfo_aton((h2o_iovec_t){H2O_STRLIT("256.0.0.0")}, &addr) != 0); ok(h2o_hostinfo_aton((h2o_iovec_t){H2O_STRLIT("0001.0.0.0")}, &addr) != 0); ok(h2o_hostinfo_aton((h2o_iovec_t){H2O_STRLIT("0.0..1")}, &addr) != 0); ok(h2o_hostinfo_aton((h2o_iovec_t){H2O_STRLIT("1.0.0.0.")}, &addr) != 0); #else ok(h2o_hostinfo_aton((h2o_iovec_t) { H2O_MY_STRLIT("127.0.0.z") }, &addr) != 0); ok(h2o_hostinfo_aton((h2o_iovec_t) { H2O_MY_STRLIT("256.0.0.0") }, &addr) != 0); ok(h2o_hostinfo_aton((h2o_iovec_t) { H2O_MY_STRLIT("0001.0.0.0") }, &addr) != 0); ok(h2o_hostinfo_aton((h2o_iovec_t) { H2O_MY_STRLIT("0.0..1") }, &addr) != 0); ok(h2o_hostinfo_aton((h2o_iovec_t) { H2O_MY_STRLIT("1.0.0.0.") }, &addr) != 0); #endif }