78,79d77 < static void nxt_router_listen_sockets_sort(nxt_router_t *router, < nxt_router_temp_conf_t *tmcf); 92,93c90,93 < static nxt_socket_conf_t *nxt_router_socket_conf(nxt_task_t *task, nxt_mp_t *mp, < nxt_sockaddr_t *sa); --- > static nxt_socket_conf_t *nxt_router_socket_conf(nxt_task_t *task, > nxt_router_temp_conf_t *tmcf, nxt_str_t *name); > static nxt_int_t nxt_router_listen_socket_find(nxt_router_temp_conf_t *tmcf, > nxt_socket_conf_t *nskcf, nxt_sockaddr_t *sa); 104d103 < static void nxt_router_engine_socket_count(nxt_queue_t *sockets); 136,137d134 < static void nxt_router_listen_socket_release(nxt_task_t *task, < nxt_socket_conf_joint_t *joint); 139a137,138 > static void nxt_router_listen_socket_release(nxt_task_t *task, > nxt_socket_conf_t *skcf); 154a154 > static nxt_sockaddr_t *nxt_router_local_addr(nxt_task_t *task, nxt_conn_t *c); 823c823 < s = skcf->listen.socket; --- > s = skcf->listen->socket; 829c829 < nxt_free(skcf->socket); --- > nxt_free(skcf->listen); 963c963 < nxt_sockaddr_t *sa; --- > nxt_router_t *router; 1000a1001,1002 > router = tmcf->conf->router; > 1030c1032 < prev = nxt_router_app_find(&tmcf->conf->router->apps, &name); --- > prev = nxt_router_app_find(&router->apps, &name); 1129,1140c1131 < sa = nxt_sockaddr_parse(mp, &name); < if (sa == NULL) { < nxt_log(task, NXT_LOG_CRIT, "invalid listener \"%V\"", &name); < goto fail; < } < < sa->type = SOCK_STREAM; < < nxt_debug(task, "router listener: \"%*s\"", < sa->length, nxt_sockaddr_start(sa)); < < skcf = nxt_router_socket_conf(task, mp, sa); --- > skcf = nxt_router_socket_conf(task, tmcf, &name); 1172c1163 < skcf->listen.handler = nxt_router_conn_init; --- > skcf->listen->handler = nxt_router_conn_init; 1177,1178d1167 < < nxt_queue_insert_tail(&tmcf->pending, &skcf->link); 1181c1170,1171 < nxt_router_listen_sockets_sort(tmcf->conf->router, tmcf); --- > nxt_queue_add(&tmcf->deleting, &router->sockets); > nxt_queue_init(&router->sockets); 1236c1226,1227 < nxt_router_socket_conf(nxt_task_t *task, nxt_mp_t *mp, nxt_sockaddr_t *sa) --- > nxt_router_socket_conf(nxt_task_t *task, nxt_router_temp_conf_t *tmcf, > nxt_str_t *name) 1238c1229,1234 < nxt_socket_conf_t *skcf; --- > size_t size; > nxt_int_t ret; > nxt_bool_t wildcard; > nxt_sockaddr_t *sa; > nxt_socket_conf_t *skcf; > nxt_listen_socket_t *ls; 1240c1236,1247 < skcf = nxt_mp_zget(mp, sizeof(nxt_socket_conf_t)); --- > sa = nxt_sockaddr_parse(tmcf->mem_pool, name); > if (nxt_slow_path(sa == NULL)) { > nxt_log(task, NXT_LOG_CRIT, "invalid listener \"%V\"", name); > return NULL; > } > > sa->type = SOCK_STREAM; > > nxt_debug(task, "router listener: \"%*s\"", > sa->length, nxt_sockaddr_start(sa)); > > skcf = nxt_mp_zget(tmcf->conf->mem_pool, sizeof(nxt_socket_conf_t)); 1245c1252 < skcf->sockaddr = sa; --- > size = nxt_sockaddr_size(sa); 1247c1254 < skcf->listen.sockaddr = sa; --- > ret = nxt_router_listen_socket_find(tmcf, skcf, sa); 1249c1256 < nxt_listen_socket_remote_size(&skcf->listen, sa); --- > if (ret != NXT_OK) { 1251,1254c1258,1261 < skcf->listen.socket = -1; < skcf->listen.backlog = NXT_LISTEN_BACKLOG; < skcf->listen.flags = NXT_NONBLOCK; < skcf->listen.read_after_accept = 1; --- > ls = nxt_zalloc(sizeof(nxt_listen_socket_t) + size); > if (nxt_slow_path(ls == NULL)) { > return NULL; > } 1255a1263,1301 > skcf->listen = ls; > > ls->sockaddr = nxt_pointer_to(ls, sizeof(nxt_listen_socket_t)); > nxt_memcpy(ls->sockaddr, sa, size); > > nxt_listen_socket_remote_size(ls); > > ls->socket = -1; > ls->backlog = NXT_LISTEN_BACKLOG; > ls->flags = NXT_NONBLOCK; > ls->read_after_accept = 1; > } > > switch (sa->u.sockaddr.sa_family) { > #if (NXT_HAVE_UNIX_DOMAIN) > case AF_UNIX: > wildcard = 0; > break; > #endif > #if (NXT_INET6) > case AF_INET6: > wildcard = IN6_IS_ADDR_UNSPECIFIED(&sa->u.sockaddr_in6.sin6_addr); > break; > #endif > case AF_INET: > default: > wildcard = (sa->u.sockaddr_in.sin_addr.s_addr == INADDR_ANY); > break; > } > > if (!wildcard) { > skcf->sockaddr = nxt_mp_zget(tmcf->conf->mem_pool, size); > if (nxt_slow_path(skcf->sockaddr == NULL)) { > return NULL; > } > > nxt_memcpy(skcf->sockaddr, sa, size); > } > 1260,1262c1306,1308 < static void < nxt_router_listen_sockets_sort(nxt_router_t *router, < nxt_router_temp_conf_t *tmcf) --- > static nxt_int_t > nxt_router_listen_socket_find(nxt_router_temp_conf_t *tmcf, > nxt_socket_conf_t *nskcf, nxt_sockaddr_t *sa) 1264,1265c1310,1312 < nxt_queue_link_t *nqlk, *oqlk, *next; < nxt_socket_conf_t *nskcf, *oskcf; --- > nxt_router_t *router; > nxt_queue_link_t *qlk; > nxt_socket_conf_t *skcf; 1267,1269c1314,1318 < for (nqlk = nxt_queue_first(&tmcf->pending); < nqlk != nxt_queue_tail(&tmcf->pending); < nqlk = next) --- > router = tmcf->conf->router; > > for (qlk = nxt_queue_first(&router->sockets); > qlk != nxt_queue_tail(&router->sockets); > qlk = nxt_queue_next(qlk)) 1271,1272c1320 < next = nxt_queue_next(nqlk); < nskcf = nxt_queue_link_data(nqlk, nxt_socket_conf_t, link); --- > skcf = nxt_queue_link_data(qlk, nxt_socket_conf_t, link); 1274,1278c1322,1323 < for (oqlk = nxt_queue_first(&router->sockets); < oqlk != nxt_queue_tail(&router->sockets); < oqlk = nxt_queue_next(oqlk)) < { < oskcf = nxt_queue_link_data(oqlk, nxt_socket_conf_t, link); --- > if (nxt_sockaddr_cmp(skcf->listen->sockaddr, sa)) { > nskcf->listen = skcf->listen; 1280,1282c1325,1326 < if (nxt_sockaddr_cmp(nskcf->sockaddr, oskcf->sockaddr)) { < nskcf->socket = oskcf->socket; < nskcf->listen.socket = oskcf->listen.socket; --- > nxt_queue_remove(qlk); > nxt_queue_insert_tail(&tmcf->keeping, qlk); 1284,1285c1328 < nxt_queue_remove(oqlk); < nxt_queue_insert_tail(&tmcf->keeping, oqlk); --- > nxt_queue_insert_tail(&tmcf->updating, &nskcf->link); 1287,1291c1330 < nxt_queue_remove(nqlk); < nxt_queue_insert_tail(&tmcf->updating, nqlk); < < break; < } --- > return NXT_OK; 1295,1296c1334,1336 < nxt_queue_add(&tmcf->deleting, &router->sockets); < nxt_queue_init(&router->sockets); --- > nxt_queue_insert_tail(&tmcf->pending, &nskcf->link); > > return NXT_DECLINED; 1319c1359 < size = nxt_sockaddr_size(skcf->sockaddr); --- > size = nxt_sockaddr_size(skcf->listen->sockaddr); 1326c1366 < b->mem.free = nxt_cpymem(b->mem.free, skcf->sockaddr, size); --- > b->mem.free = nxt_cpymem(b->mem.free, skcf->listen->sockaddr, size); 1355,1358c1395,1397 < nxt_int_t ret; < nxt_socket_t s; < nxt_socket_rpc_t *rpc; < nxt_router_socket_t *rtsk; --- > nxt_int_t ret; > nxt_socket_t s; > nxt_socket_rpc_t *rpc; 1369c1408 < nxt_socket_defer_accept(task, s, rpc->socket_conf->sockaddr); --- > nxt_socket_defer_accept(task, s, rpc->socket_conf->listen->sockaddr); 1376,1379c1415 < rtsk = nxt_malloc(sizeof(nxt_router_socket_t)); < if (nxt_slow_path(rtsk == NULL)) { < goto fail; < } --- > rpc->socket_conf->listen->socket = s; 1381,1386d1416 < rtsk->count = 0; < rtsk->fd = s; < < rpc->socket_conf->listen.socket = s; < rpc->socket_conf->socket = rtsk; < 1423c1453 < sa = rpc->socket_conf->sockaddr; --- > sa = rpc->socket_conf->listen->sockaddr; 1532,1533c1562 < nxt_int_t ret; < nxt_thread_spinlock_t *lock; --- > nxt_int_t ret; 1547,1555d1575 < lock = &tmcf->conf->router->lock; < < nxt_thread_spin_lock(lock); < < nxt_router_engine_socket_count(&tmcf->creating); < nxt_router_engine_socket_count(&tmcf->updating); < < nxt_thread_spin_unlock(lock); < 1564,1565c1584 < nxt_int_t ret; < nxt_thread_spinlock_t *lock; --- > nxt_int_t ret; 1584,1591d1602 < lock = &tmcf->conf->router->lock; < < nxt_thread_spin_lock(lock); < < nxt_router_engine_socket_count(&tmcf->creating); < < nxt_thread_spin_unlock(lock); < 1667,1682d1677 < static void < nxt_router_engine_socket_count(nxt_queue_t *sockets) < { < nxt_queue_link_t *qlk; < nxt_socket_conf_t *skcf; < < for (qlk = nxt_queue_first(sockets); < qlk != nxt_queue_tail(sockets); < qlk = nxt_queue_next(qlk)) < { < skcf = nxt_queue_link_data(qlk, nxt_socket_conf_t, link); < skcf->socket->count++; < } < } < < 1944c1939,1940 < nxt_listen_event_t *listen; --- > nxt_socket_conf_t *skcf; > nxt_listen_event_t *lev; 1945a1942 > nxt_thread_spinlock_t *lock; 1951,1952d1947 < ls = &joint->socket_conf->listen; < 1955,1957c1950,1955 < listen = nxt_listen_event(task, ls); < if (nxt_slow_path(listen == NULL)) { < nxt_router_listen_socket_release(task, joint); --- > skcf = joint->socket_conf; > ls = skcf->listen; > > lev = nxt_listen_event(task, ls); > if (nxt_slow_path(lev == NULL)) { > nxt_router_listen_socket_release(task, skcf); 1961c1959 < listen->socket.data = joint; --- > lev->socket.data = joint; 1962a1961,1966 > lock = &skcf->router_conf->router->lock; > > nxt_thread_spin_lock(lock); > ls->count++; > nxt_thread_spin_unlock(lock); > 1976c1980 < nxt_listen_event_t *listen; --- > nxt_listen_event_t *lev; 1978c1982 < fd = skcf->socket->fd; --- > fd = skcf->listen->socket; 1984c1988 < listen = nxt_queue_link_data(qlk, nxt_listen_event_t, link); --- > lev = nxt_queue_link_data(qlk, nxt_listen_event_t, link); 1986,1987c1990,1991 < if (fd == listen->socket.fd) { < return listen; --- > if (fd == lev->socket.fd) { > return lev; 2000c2004 < nxt_listen_event_t *listen; --- > nxt_listen_event_t *lev; 2010,2011c2014,2015 < listen = nxt_router_listen_event(&engine->listen_connections, < joint->socket_conf); --- > lev = nxt_router_listen_event(&engine->listen_connections, > joint->socket_conf); 2013,2015c2017,2019 < old = listen->socket.data; < listen->socket.data = joint; < listen->listen = &joint->socket_conf->listen; --- > old = lev->socket.data; > lev->socket.data = joint; > lev->listen = joint->socket_conf->listen; 2036c2040 < nxt_listen_event_t *listen; --- > nxt_listen_event_t *lev; 2044c2048 < listen = nxt_router_listen_event(&engine->listen_connections, skcf); --- > lev = nxt_router_listen_event(&engine->listen_connections, skcf); 2046c2050 < nxt_fd_event_delete(engine, &listen->socket); --- > nxt_fd_event_delete(engine, &lev->socket); 2049c2053 < listen->socket.fd); --- > lev->socket.fd); 2051,2052c2055,2056 < listen->timer.handler = nxt_router_listen_socket_close; < listen->timer.work_queue = &engine->fast_work_queue; --- > lev->timer.handler = nxt_router_listen_socket_close; > lev->timer.work_queue = &engine->fast_work_queue; 2054c2058 < nxt_timer_add(engine, &listen->timer, 0); --- > nxt_timer_add(engine, &lev->timer, 0); 2084c2088 < nxt_listen_event_t *listen; --- > nxt_listen_event_t *lev; 2088,2089c2092,2093 < listen = nxt_timer_data(timer, nxt_listen_event_t, timer); < joint = listen->socket.data; --- > lev = nxt_timer_data(timer, nxt_listen_event_t, timer); > joint = lev->socket.data; 2092c2096 < listen->socket.fd); --- > lev->socket.fd); 2094c2098 < nxt_queue_remove(&listen->link); --- > nxt_queue_remove(&lev->link); 2096c2100 < /* 'task' refers to listen->task and we cannot use after nxt_free() */ --- > /* 'task' refers to lev->task and we cannot use after nxt_free() */ 2099c2103 < nxt_free(listen); --- > nxt_router_listen_socket_release(task, joint->socket_conf); 2101c2105,2107 < nxt_router_listen_socket_release(task, joint); --- > nxt_free(lev); > > nxt_router_conf_release(task, joint); 2106,2107c2112 < nxt_router_listen_socket_release(nxt_task_t *task, < nxt_socket_conf_joint_t *joint) --- > nxt_router_listen_socket_release(nxt_task_t *task, nxt_socket_conf_t *skcf) 2109,2110c2114 < nxt_socket_conf_t *skcf; < nxt_router_socket_t *rtsk; --- > nxt_listen_socket_t *ls; 2113,2114c2117 < skcf = joint->socket_conf; < rtsk = skcf->socket; --- > ls = skcf->listen; 2119,2120c2122,2123 < nxt_debug(task, "engine %p: listen socket release: rtsk->count %D", < task->thread->engine, rtsk->count); --- > nxt_debug(task, "engine %p: listen socket release: ls->count %D", > task->thread->engine, ls->count); 2122,2123c2125,2126 < if (--rtsk->count != 0) { < rtsk = NULL; --- > if (--ls->count != 0) { > ls = NULL; 2128,2131c2131,2133 < if (rtsk != NULL) { < nxt_socket_close(task, rtsk->fd); < nxt_free(rtsk); < skcf->socket = NULL; --- > if (ls != NULL) { > nxt_socket_close(task, ls->socket); > nxt_free(ls); 2133,2134d2134 < < nxt_router_conf_release(task, joint); 2263a2264 > nxt_socket_conf_t *skcf; 2271a2273 > c->joint = joint; 2274c2276,2279 < size = joint->socket_conf->header_buffer_size; --- > skcf = joint->socket_conf; > c->local = skcf->sockaddr; > > size = skcf->header_buffer_size; 2788c2793 < joint = c->listen->socket.data; --- > joint = c->joint; 2889c2894 < joint = c->listen->socket.data; --- > joint = c->joint; 2906,2908c2911,2915 < local = joint->socket_conf->sockaddr; < ap->r.local.start = nxt_sockaddr_address(local); < ap->r.local.length = local->address_length; --- > /* > * TODO: need an application flag to get local address > * required by "SERVER_ADDR" in Pyhton and PHP. Not used in Go. > */ > local = nxt_router_local_addr(task, c); 2909a2917,2921 > if (nxt_fast_path(local != NULL)) { > ap->r.local.start = nxt_sockaddr_address(local); > ap->r.local.length = local->address_length; > } > 3002a3015,3066 > static nxt_sockaddr_t * > nxt_router_local_addr(nxt_task_t *task, nxt_conn_t *c) > { > int ret; > size_t size; > socklen_t socklen; > nxt_sockaddr_t *sa; > > if (c->local != NULL) { > return c->local; > } > > /* AF_UNIX should not get in here. */ > > switch (c->remote->u.sockaddr.sa_family) { > #if (NXT_INET6) > case AF_INET6: > socklen = sizeof(struct sockaddr_in6); > size = offsetof(nxt_sockaddr_t, u) + socklen + NXT_INET6_ADDR_STR_LEN; > break; > #endif > case AF_INET: > default: > socklen = sizeof(struct sockaddr_in6); > size = offsetof(nxt_sockaddr_t, u) + socklen + NXT_INET_ADDR_STR_LEN; > break; > } > > sa = nxt_mp_get(c->mem_pool, size); > if (nxt_slow_path(sa == NULL)) { > return NULL; > } > > ret = getsockname(c->socket.fd, &sa->u.sockaddr, &socklen); > if (nxt_slow_path(ret != 0)) { > nxt_log(task, NXT_LOG_CRIT, "getsockname(%d) failed", c->socket.fd); > return NULL; > } > > c->local = sa; > > nxt_sockaddr_text(sa); > > /* > * TODO: here we can adjust the end of non-freeable block > * in c->mem_pool to the end of actual sockaddr length. > */ > > return sa; > } > > 3043c3107 < joint = c->listen->socket.data; --- > joint = c->joint; 3588c3652 < joint = c->listen->socket.data; --- > joint = c->joint; 3656c3720 < joint = c->listen->socket.data; --- > joint = c->joint;