From 74acf75a496b739a6a9e47eedb91891f18d4085b Mon Sep 17 00:00:00 2001 From: Liong Sauw Ming Date: Fri, 7 Aug 2015 09:00:52 +0000 Subject: Fixed #1878: Compile time option for TCP/TLS transport to not create a listener git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5152 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/src/pjsip/sip_transport_tcp.c | 53 ++++++++++++++++++++++++++++++------- pjsip/src/pjsip/sip_transport_tls.c | 18 ++++++++++--- 2 files changed, 58 insertions(+), 13 deletions(-) (limited to 'pjsip/src') diff --git a/pjsip/src/pjsip/sip_transport_tcp.c b/pjsip/src/pjsip/sip_transport_tcp.c index 096d813f..839d3294 100644 --- a/pjsip/src/pjsip/sip_transport_tcp.c +++ b/pjsip/src/pjsip/sip_transport_tcp.c @@ -258,6 +258,7 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( pj_activesock_cb listener_cb; pj_sockaddr *listener_addr; int addr_len; + pj_bool_t has_listener = PJ_FALSE; pj_status_t status; /* Sanity check */ @@ -278,7 +279,7 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( } } - pool = pjsip_endpt_create_pool(endpt, "tcplis", POOL_LIS_INIT, + pool = pjsip_endpt_create_pool(endpt, "tcptp", POOL_LIS_INIT, POOL_LIS_INC); PJ_ASSERT_RETURN(pool, PJ_ENOMEM); @@ -297,7 +298,7 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( pj_memcpy(&listener->sockopt_params, &cfg->sockopt_params, sizeof(cfg->sockopt_params)); - pj_ansi_strcpy(listener->factory.obj_name, "tcplis"); + pj_ansi_strcpy(listener->factory.obj_name, "tcptp"); if (listener->factory.type==PJSIP_TRANSPORT_TCP6) pj_ansi_strcat(listener->factory.obj_name, "6"); @@ -306,6 +307,8 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( if (status != PJ_SUCCESS) goto on_error; +#if !(defined(PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER) && \ + PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER != 0) /* Create socket */ status = pj_sock_socket(cfg->af, pj_SOCK_STREAM(), 0, &sock); @@ -332,6 +335,10 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( if (cfg->sockopt_params.cnt) status = pj_sock_setsockopt_params(sock, &cfg->sockopt_params); +#else + PJ_UNUSED_ARG(addr_len); +#endif + /* Bind address may be different than factory.local_addr because * factory.local_addr will be resolved below. */ @@ -341,6 +348,9 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( listener_addr = &listener->factory.local_addr; pj_sockaddr_cp(listener_addr, &cfg->bind_addr); +#if !(defined(PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER) && \ + PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER != 0) + status = pj_sock_bind(sock, listener_addr, pj_sockaddr_get_len(listener_addr)); if (status != PJ_SUCCESS) @@ -352,6 +362,8 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( if (status != PJ_SUCCESS) goto on_error; +#endif + /* If published host/IP is specified, then use that address as the * listener advertised address. */ @@ -392,8 +404,11 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( pj_ansi_snprintf(listener->factory.obj_name, sizeof(listener->factory.obj_name), - "tcplis:%d", listener->factory.addr_name.port); + "tcptp:%d", listener->factory.addr_name.port); + +#if !(defined(PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER) && \ + PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER != 0) /* Start listening to the address */ status = pj_sock_listen(sock, PJSIP_TCP_TRANSPORT_BACKLOG); @@ -408,6 +423,8 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( else asock_cfg.async_cnt = cfg->async_cnt; +#endif + /* Create group lock */ status = pj_grp_lock_create(pool, NULL, &listener->grp_lock); if (status != PJ_SUCCESS) @@ -421,11 +438,17 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( pj_bzero(&listener_cb, sizeof(listener_cb)); listener_cb.on_accept_complete = &on_accept_complete; + +#if !(defined(PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER) && \ + PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER != 0) + status = pj_activesock_create(pool, sock, pj_SOCK_STREAM(), &asock_cfg, pjsip_endpt_get_ioqueue(endpt), &listener_cb, listener, &listener->asock); +#endif + /* Register to transport manager */ listener->endpt = endpt; listener->tpmgr = pjsip_endpt_get_tpmgr(endpt); @@ -439,16 +462,28 @@ PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( goto on_error; } +#if !(defined(PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER) && \ + PJSIP_TCP_TRANSPORT_DONT_CREATE_LISTENER != 0) + /* Start pending accept() operations */ status = pj_activesock_start_accept(listener->asock, pool); if (status != PJ_SUCCESS) goto on_error; + + has_listener = PJ_TRUE; - PJ_LOG(4,(listener->factory.obj_name, - "SIP TCP listener ready for incoming connections at %.*s:%d", - (int)listener->factory.addr_name.host.slen, - listener->factory.addr_name.host.ptr, - listener->factory.addr_name.port)); +#endif + + if (has_listener) { + PJ_LOG(4,(listener->factory.obj_name, + "SIP TCP listener ready for incoming connections at %.*s:%d", + (int)listener->factory.addr_name.host.slen, + listener->factory.addr_name.host.ptr, + listener->factory.addr_name.port)); + } else { + PJ_LOG(4,(listener->factory.obj_name, "SIP TCP is ready " + "(client only)")); + } /* Return the pointer to user */ if (p_factory) *p_factory = &listener->factory; @@ -518,7 +553,7 @@ static void lis_on_destroy(void *arg) if (listener->factory.pool) { pj_pool_t *pool = listener->factory.pool; - PJ_LOG(4,(listener->factory.obj_name, "SIP TCP listener destroyed")); + PJ_LOG(4,(listener->factory.obj_name, "SIP TCP transport destroyed")); listener->factory.pool = NULL; pj_pool_release(pool); diff --git a/pjsip/src/pjsip/sip_transport_tls.c b/pjsip/src/pjsip/sip_transport_tls.c index 6302a4d4..ac7ac930 100644 --- a/pjsip/src/pjsip/sip_transport_tls.c +++ b/pjsip/src/pjsip/sip_transport_tls.c @@ -339,7 +339,7 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt, } } - pool = pjsip_endpt_create_pool(endpt, "tlslis", POOL_LIS_INIT, + pool = pjsip_endpt_create_pool(endpt, "tlstp", POOL_LIS_INIT, POOL_LIS_INC); PJ_ASSERT_RETURN(pool, PJ_ENOMEM); @@ -354,7 +354,7 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt, listener->factory.flag = pjsip_transport_get_flag_from_type(listener->factory.type); - pj_ansi_strcpy(listener->factory.obj_name, "tlslis"); + pj_ansi_strcpy(listener->factory.obj_name, "tlstp"); if (is_ipv6) pj_ansi_strcat(listener->factory.obj_name, "6"); @@ -419,6 +419,9 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt, pj_grp_lock_add_handler(listener->grp_lock, pool, listener, &lis_on_destroy); +#if !(defined(PJSIP_TLS_TRANSPORT_DONT_CREATE_LISTENER) && \ + PJSIP_TLS_TRANSPORT_DONT_CREATE_LISTENER != 0) + ssock_param.grp_lock = listener->grp_lock; /* Create SSL socket */ @@ -426,6 +429,8 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt, if (status != PJ_SUCCESS) goto on_error; +#endif + /* Bind address may be different than factory.local_addr because * factory.local_addr will be resolved below. */ @@ -439,6 +444,9 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt, pj_sockaddr_init(af, &listener->bound_addr, NULL, 0); } +#if !(defined(PJSIP_TLS_TRANSPORT_DONT_CREATE_LISTENER) && \ + PJSIP_TLS_TRANSPORT_DONT_CREATE_LISTENER != 0) + /* Check if certificate/CA list for SSL socket is set */ if (listener->tls_setting.cert_file.slen || listener->tls_setting.ca_list_file.slen || @@ -480,6 +488,8 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt, goto on_error; } +#endif + /* If published host/IP is specified, then use that address as the * listener advertised address. */ @@ -518,7 +528,7 @@ PJ_DEF(pj_status_t) pjsip_tls_transport_start2( pjsip_endpoint *endpt, pj_ansi_snprintf(listener->factory.obj_name, sizeof(listener->factory.obj_name), - "tlslis:%d", listener->factory.addr_name.port); + "tlstp:%d", listener->factory.addr_name.port); /* Register to transport manager */ listener->endpt = endpt; @@ -569,7 +579,7 @@ static void lis_on_destroy(void *arg) if (listener->factory.pool) { pj_pool_t *pool = listener->factory.pool; - PJ_LOG(4,(listener->factory.obj_name, "SIP TLS listener destroyed")); + PJ_LOG(4,(listener->factory.obj_name, "SIP TLS transport destroyed")); listener->factory.pool = NULL; pj_pool_release(pool); -- cgit v1.2.3