summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-02-01 03:37:11 +0000
committerBenny Prijono <bennylp@teluu.com>2007-02-01 03:37:11 +0000
commite46a196f3be2820b514ed3ddfe1741be91be3d26 (patch)
tree5be8f8086d94854911f6770e202aad4b1e5b6255 /pjsip
parentff0519500e35668e0963fdc1af57141ebc78b019 (diff)
Fixed ticket #84: pjsua_transport_close() doesn't properly close transport (especially TLS)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@923 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_core.c42
1 files changed, 36 insertions, 6 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c
index 79b39283..26612c3c 100644
--- a/pjsip/src/pjsua-lib/pjsua_core.c
+++ b/pjsip/src/pjsua-lib/pjsua_core.c
@@ -1284,6 +1284,8 @@ PJ_DEF(pj_status_t) pjsua_transport_set_enable( pjsua_transport_id id,
PJ_DEF(pj_status_t) pjsua_transport_close( pjsua_transport_id id,
pj_bool_t force )
{
+ pj_status_t status;
+
/* Make sure id is in range. */
PJ_ASSERT_RETURN(id>=0 && id<PJ_ARRAY_SIZE(pjsua_var.tpdata), PJ_EINVAL);
@@ -1296,28 +1298,56 @@ PJ_DEF(pj_status_t) pjsua_transport_close( pjsua_transport_id id,
if (force) {
switch (pjsua_var.tpdata[id].type) {
case PJSIP_TRANSPORT_UDP:
- return pjsip_transport_destroy(pjsua_var.tpdata[id].data.tp);
+ status = pjsip_transport_shutdown(pjsua_var.tpdata[id].data.tp);
+ if (status != PJ_SUCCESS)
+ return status;
+ status = pjsip_transport_destroy(pjsua_var.tpdata[id].data.tp);
+ if (status != PJ_SUCCESS)
+ return status;
+ break;
+
+ case PJSIP_TRANSPORT_TLS:
case PJSIP_TRANSPORT_TCP:
+ /* This will close the TCP listener, but existing TCP/TLS
+ * connections (if any) will still linger
+ */
+ status = (*pjsua_var.tpdata[id].data.factory->destroy)
+ (pjsua_var.tpdata[id].data.factory);
+ if (status != PJ_SUCCESS)
+ return status;
+
break;
+
default:
- break;
+ return PJ_EINVAL;
}
} else {
+ /* If force is not specified, transports will be closed at their
+ * convenient time. However this will leak PJSUA-API transport
+ * descriptors as PJSUA-API wouldn't know when exactly the
+ * transport is closed thus it can't cleanup PJSUA transport
+ * descriptor.
+ */
switch (pjsua_var.tpdata[id].type) {
case PJSIP_TRANSPORT_UDP:
return pjsip_transport_shutdown(pjsua_var.tpdata[id].data.tp);
+ case PJSIP_TRANSPORT_TLS:
case PJSIP_TRANSPORT_TCP:
return (*pjsua_var.tpdata[id].data.factory->destroy)
(pjsua_var.tpdata[id].data.factory);
default:
- break;
+ return PJ_EINVAL;
}
}
- /* Unreachable */
- pj_assert(!"Unknown transport");
- return PJ_EINVALIDOP;
+ /* Cleanup pjsua data when force is applied */
+ if (force) {
+ pjsua_var.tpdata[id].type = PJSIP_TRANSPORT_UNSPECIFIED;
+ pjsua_var.tpdata[id].data.ptr = NULL;
+ }
+
+ return PJ_SUCCESS;
}