mirror of https://github.com/sipwise/kamailio.git
* use server_address as contact of SUBSCRIBE reply too * use To header info as target of SUBSCRIBE when in-dialog * fix sca_call_info_update() params * change onhold_bflag parameter behavior Change-Id: I5d112e9187ed6eccce0c44422605482530ab7671changes/43/9043/15
parent
d36252ddc1
commit
3d5a816f42
@ -0,0 +1,376 @@
|
||||
From: Victor Seva <vseva@sipwise.com>
|
||||
Date: Fri, 21 Oct 2016 18:45:59 +0200
|
||||
Subject: sca: fix sca_call_info_update() params
|
||||
|
||||
Change-Id: I6c47ab8ac6bffd328d36f6f134f56b4d0b141dc0
|
||||
---
|
||||
modules/sca/sca.c | 22 ++++++++-
|
||||
modules/sca/sca_call_info.c | 116 +++++++++++++++++++++++++++++---------------
|
||||
modules/sca/sca_call_info.h | 2 +-
|
||||
modules/sca/sca_util.c | 78 +++++++++--------------------
|
||||
modules/sca/sca_util.h | 5 +-
|
||||
5 files changed, 122 insertions(+), 101 deletions(-)
|
||||
|
||||
diff --git a/modules/sca/sca.c b/modules/sca/sca.c
|
||||
index 9dd0143..9e03f6f 100644
|
||||
--- a/modules/sca/sca.c
|
||||
+++ b/modules/sca/sca.c
|
||||
@@ -409,12 +409,30 @@ static int sca_call_info_update_1_f(sip_msg_t* msg, char* p1) {
|
||||
return sca_call_info_update(msg, p1, NULL, NULL);
|
||||
}
|
||||
static int sca_call_info_update_2_f(sip_msg_t* msg, char* p1, char* p2) {
|
||||
- return sca_call_info_update(msg, p1, p2, NULL);
|
||||
+ str uri_to = STR_NULL;
|
||||
+ if(get_str_fparam(&uri_to, msg, (gparam_p)p2)!=0)
|
||||
+ {
|
||||
+ LM_ERR("unable to get value from param pvar_to\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ return sca_call_info_update(msg, p1, &uri_to, NULL);
|
||||
}
|
||||
static int sca_call_info_update_3_f(sip_msg_t* msg,
|
||||
char* p1, char* p2, char * p3)
|
||||
{
|
||||
- return sca_call_info_update(msg, p1, p2, p3);
|
||||
+ str uri_to = STR_NULL;
|
||||
+ str uri_from = STR_NULL;
|
||||
+ if(get_str_fparam(&uri_to, msg, (gparam_p)p2)!=0)
|
||||
+ {
|
||||
+ LM_ERR("unable to get value from param pvar_to\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ if(get_str_fparam(&uri_from, msg, (gparam_p)p3)!=0)
|
||||
+ {
|
||||
+ LM_ERR("unable to get value from param pvar_from\n");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ return sca_call_info_update(msg, p1, &uri_to, &uri_from);
|
||||
}
|
||||
|
||||
int fixup_ciu(void **param, int param_no)
|
||||
diff --git a/modules/sca/sca_call_info.c b/modules/sca/sca_call_info.c
|
||||
index a5854cc..d46c65d 100644
|
||||
--- a/modules/sca/sca_call_info.c
|
||||
+++ b/modules/sca/sca_call_info.c
|
||||
@@ -1863,7 +1863,7 @@ struct sca_call_info_dispatch call_info_dispatch[] = {
|
||||
#define SCA_CALL_INFO_UPDATE_FLAG_FROM_ALLOC (1 << 0)
|
||||
#define SCA_CALL_INFO_UPDATE_FLAG_TO_ALLOC (1 << 1)
|
||||
int
|
||||
-sca_call_info_update( sip_msg_t *msg, char *p1, char *p2, char *p3 )
|
||||
+sca_call_info_update( sip_msg_t *msg, char *p1, str *uri_to, str *uri_from )
|
||||
{
|
||||
sca_call_info call_info;
|
||||
hdr_field_t *call_info_hdr;
|
||||
@@ -1874,6 +1874,7 @@ sca_call_info_update( sip_msg_t *msg, char *p1, char *p2, char *p3 )
|
||||
str to_aor = STR_NULL;
|
||||
str contact_uri = STR_NULL;
|
||||
int aor_flags = SCA_CALL_INFO_UPDATE_FLAG_DEFAULT;
|
||||
+ int to_body_flags = SCA_CALL_INFO_UPDATE_FLAG_DEFAULT;
|
||||
int n_dispatch;
|
||||
int i;
|
||||
int method;
|
||||
@@ -1888,17 +1889,19 @@ sca_call_info_update( sip_msg_t *msg, char *p1, char *p2, char *p3 )
|
||||
break;
|
||||
}
|
||||
}
|
||||
- if ( i >= n_dispatch ) {
|
||||
- LM_DBG( "BUG: sca module does not support Call-Info headers "
|
||||
- "in %.*s requests", STR_FMT( &get_cseq( msg )->method ));
|
||||
- return( 1 );
|
||||
- }
|
||||
|
||||
if ( parse_headers( msg, HDR_EOH_F, 0 ) < 0 ) {
|
||||
LM_ERR( "header parsing failed: bad request" );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
+ if ( i >= n_dispatch ) {
|
||||
+ LM_DBG( "BUG: sca module does not support Call-Info headers "
|
||||
+ "in %.*s requests", STR_FMT( &get_cseq( msg )->method ));
|
||||
+ return( 1 );
|
||||
+ }
|
||||
+
|
||||
+
|
||||
if ( p1 != NULL ) {
|
||||
if ( get_int_fparam( &update_mask, msg, (fparam_t *)p1 ) < 0 ) {
|
||||
if(msg->cseq==NULL && ((parse_headers(msg, HDR_CSEQ_F, 0)==-1) ||
|
||||
@@ -1939,25 +1942,39 @@ sca_call_info_update( sip_msg_t *msg, char *p1, char *p2, char *p3 )
|
||||
}
|
||||
}
|
||||
|
||||
- if (p3 != NULL) {
|
||||
- if (sca_get_pv_from_header(msg, &from, (pv_spec_t *) p3) < 0) {
|
||||
- LM_ERR("Bad From pvar\n");
|
||||
- return (-1);
|
||||
+ if (uri_from != NULL) {
|
||||
+ if(sca_build_to_body_from_uri(msg, &from, uri_from)<0){
|
||||
+ LM_ERR( "Bad From uri from param\n" );
|
||||
+ return( -1 );
|
||||
+ }
|
||||
+ LM_DBG("from[%.*s] param\n", STR_FMT(uri_from));
|
||||
+ to_body_flags |= SCA_CALL_INFO_UPDATE_FLAG_FROM_ALLOC;
|
||||
+ if ( sca_uri_extract_aor( &from->uri, &from_aor ) < 0 ) {
|
||||
+ LM_ERR( "Failed to extract AoR from From URI %.*s",
|
||||
+ STR_FMT( &from->uri ));
|
||||
+ goto done;
|
||||
}
|
||||
}
|
||||
else if ( sca_get_msg_from_header( msg, &from ) < 0 ) {
|
||||
LM_ERR( "Bad From header" );
|
||||
return( -1 );
|
||||
}
|
||||
- if (p2 != NULL) {
|
||||
- if (sca_get_pv_to_header(msg, &to, (pv_spec_t *) p2) < 0) {
|
||||
- LM_ERR("Bad To pvar\n");
|
||||
- return (-1);
|
||||
- }
|
||||
+ if (uri_to != NULL) {
|
||||
+ if(sca_build_to_body_from_uri(msg, &to, uri_to)<0){
|
||||
+ LM_ERR( "Bad From uri to param\n" );
|
||||
+ goto done;
|
||||
+ }
|
||||
+ LM_DBG("to[%.*s] param\n", STR_FMT(uri_to));
|
||||
+ to_body_flags |= SCA_CALL_INFO_UPDATE_FLAG_TO_ALLOC;
|
||||
+ if ( sca_uri_extract_aor( &to->uri, &to_aor ) < 0 ) {
|
||||
+ LM_ERR( "Failed to extract AoR from To URI %.*s",
|
||||
+ STR_FMT( &to->uri ));
|
||||
+ goto done;
|
||||
+ }
|
||||
}
|
||||
else if ( sca_get_msg_to_header( msg, &to ) < 0 ) {
|
||||
LM_ERR( "Bad To header" );
|
||||
- return( -1 );
|
||||
+ goto done;
|
||||
}
|
||||
|
||||
memset( &c_uri, 0, sizeof( sip_uri_t ));
|
||||
@@ -1967,39 +1984,50 @@ sca_call_info_update( sip_msg_t *msg, char *p1, char *p2, char *p3 )
|
||||
if ( parse_uri( contact_uri.s, contact_uri.len, &c_uri ) < 0 ) {
|
||||
LM_ERR( "Failed to parse Contact URI %.*s",
|
||||
STR_FMT( &contact_uri ));
|
||||
- return( -1 );
|
||||
+ rc = -1;
|
||||
+ goto done;
|
||||
}
|
||||
} else if ( rc < 0 ) {
|
||||
LM_ERR( "Bad Contact" );
|
||||
- return( -1 );
|
||||
+ goto done;
|
||||
}
|
||||
/* reset rc to -1 so we don't end up returning 0 to the script */
|
||||
rc = -1;
|
||||
|
||||
/* reconcile mismatched Contact users and To/From URIs */
|
||||
if ( msg->first_line.type == SIP_REQUEST ) {
|
||||
- if ( sca_create_canonical_aor( msg, &from_aor ) < 0 ) {
|
||||
- return( -1 );
|
||||
- }
|
||||
- aor_flags |= SCA_CALL_INFO_UPDATE_FLAG_FROM_ALLOC;
|
||||
-
|
||||
- if ( sca_uri_extract_aor( &to->uri, &to_aor ) < 0 ) {
|
||||
- LM_ERR( "Failed to extract AoR from To URI %.*s",
|
||||
- STR_FMT( &to->uri ));
|
||||
- goto done;
|
||||
- }
|
||||
+ if(uri_from==NULL) {
|
||||
+ if ( sca_create_canonical_aor( msg, &from_aor ) < 0 ) {
|
||||
+ goto done;
|
||||
+ }
|
||||
+ aor_flags |= SCA_CALL_INFO_UPDATE_FLAG_FROM_ALLOC;
|
||||
+ }
|
||||
+ if(uri_to==NULL) {
|
||||
+ if ( sca_uri_extract_aor( &to->uri, &to_aor ) < 0 ) {
|
||||
+ LM_ERR( "Failed to extract AoR from To URI %.*s",
|
||||
+ STR_FMT( &to->uri ));
|
||||
+ goto done;
|
||||
+ }
|
||||
+ }
|
||||
} else {
|
||||
- if ( sca_uri_extract_aor( &from->uri, &from_aor ) < 0 ) {
|
||||
- LM_ERR( "Failed to extract AoR from From URI %.*s",
|
||||
- STR_FMT( &from->uri ));
|
||||
- goto done;
|
||||
- }
|
||||
- if ( sca_create_canonical_aor( msg, &to_aor ) < 0 ) {
|
||||
- return( -1 );
|
||||
- }
|
||||
- aor_flags |= SCA_CALL_INFO_UPDATE_FLAG_TO_ALLOC;
|
||||
+ if(uri_from==NULL) {
|
||||
+ if ( sca_uri_extract_aor( &from->uri, &from_aor ) < 0 ) {
|
||||
+ LM_ERR( "Failed to extract AoR from From URI %.*s",
|
||||
+ STR_FMT( &from->uri ));
|
||||
+ goto done;
|
||||
+ }
|
||||
+ }
|
||||
+ if(uri_to==NULL) {
|
||||
+ if ( sca_create_canonical_aor( msg, &to_aor ) < 0 ) {
|
||||
+ goto done;
|
||||
+ }
|
||||
+ aor_flags |= SCA_CALL_INFO_UPDATE_FLAG_TO_ALLOC;
|
||||
+ }
|
||||
}
|
||||
|
||||
+ LM_DBG("to_aor[%.*s] from_aor[%.*s]\n",
|
||||
+ STR_FMT(&to_aor), STR_FMT(&from_aor));
|
||||
+
|
||||
/* early check to see if we're dealing with any SCA endpoints */
|
||||
if ( sca_uri_is_shared_appearance( sca, &from_aor )) {
|
||||
if (( update_mask & SCA_CALL_INFO_SHARED_CALLER )) {
|
||||
@@ -2032,7 +2060,8 @@ sca_call_info_update( sip_msg_t *msg, char *p1, char *p2, char *p3 )
|
||||
|
||||
if ( sca_call_info_header_remove( msg ) < 0 ) {
|
||||
LM_ERR( "Failed to remove Call-Info header" );
|
||||
- return( -1 );
|
||||
+ rc = -1;
|
||||
+ goto done;
|
||||
}
|
||||
|
||||
if ( call_info.ua_shared == SCA_CALL_INFO_SHARED_NONE ) {
|
||||
@@ -2059,6 +2088,15 @@ done:
|
||||
pkg_free( to_aor.s );
|
||||
}
|
||||
}
|
||||
-
|
||||
+ if (( to_body_flags & SCA_CALL_INFO_UPDATE_FLAG_FROM_ALLOC )) {
|
||||
+ if ( from != NULL ) {
|
||||
+ free_to( from );
|
||||
+ }
|
||||
+ }
|
||||
+ if (( to_body_flags & SCA_CALL_INFO_UPDATE_FLAG_TO_ALLOC )) {
|
||||
+ if ( to != NULL ) {
|
||||
+ free_to( to );
|
||||
+ }
|
||||
+ }
|
||||
return( rc );
|
||||
}
|
||||
diff --git a/modules/sca/sca_call_info.h b/modules/sca/sca_call_info.h
|
||||
index 2806cb7..1171701 100644
|
||||
--- a/modules/sca/sca_call_info.h
|
||||
+++ b/modules/sca/sca_call_info.h
|
||||
@@ -63,7 +63,7 @@ typedef struct _sca_call_info sca_call_info;
|
||||
extern const str SCA_CALL_INFO_HEADER_STR;
|
||||
|
||||
|
||||
-int sca_call_info_update( sip_msg_t *, char *, char * , char *);
|
||||
+int sca_call_info_update( sip_msg_t *, char *, str*, str* );
|
||||
void sca_call_info_sl_reply_cb( void * );
|
||||
void sca_call_info_ack_cb( struct cell *, int, struct tmcb_params * );
|
||||
|
||||
diff --git a/modules/sca/sca_util.c b/modules/sca/sca_util.c
|
||||
index 721810d..60c178c 100644
|
||||
--- a/modules/sca/sca_util.c
|
||||
+++ b/modules/sca/sca_util.c
|
||||
@@ -114,6 +114,28 @@ sca_get_msg_cseq_method( sip_msg_t *msg )
|
||||
return( get_cseq( msg )->method_id );
|
||||
}
|
||||
|
||||
+/* caller needs to call free_to for *body */
|
||||
+int
|
||||
+sca_build_to_body_from_uri(sip_msg_t *msg, struct to_body **body, str *uri)
|
||||
+{
|
||||
+ assert( msg != NULL );
|
||||
+ assert( body != NULL );
|
||||
+ assert( uri != NULL );
|
||||
+
|
||||
+ *body = pkg_malloc(sizeof(struct to_body));
|
||||
+ if(*body == NULL) {
|
||||
+ LM_ERR("cannot allocate pkg memory\n");
|
||||
+ return(-1);
|
||||
+ }
|
||||
+
|
||||
+ parse_to(uri->s, uri->s + uri->len + 1, *body);
|
||||
+ if ((*body)->error != PARSE_OK) {
|
||||
+ LM_ERR("Bad uri value[%.*s]\n", STR_FMT(uri));
|
||||
+ free_to(*body);
|
||||
+ return(-1);
|
||||
+ }
|
||||
+ return (0);
|
||||
+}
|
||||
|
||||
int
|
||||
sca_get_msg_from_header( sip_msg_t *msg, struct to_body **from )
|
||||
@@ -184,62 +206,6 @@ sca_get_msg_to_header( sip_msg_t *msg, struct to_body **to )
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
-int sca_get_pv_from_header(sip_msg_t *msg, struct to_body **from, pv_spec_t *sp)
|
||||
-{
|
||||
- struct to_body parsed_from;
|
||||
- pv_value_t pv_val;
|
||||
-
|
||||
- assert(msg != NULL);
|
||||
- assert(from != NULL);
|
||||
- assert(sp != NULL);
|
||||
-
|
||||
- if (pv_get_spec_value(msg, sp, &pv_val) < 0) {
|
||||
- LM_ERR("can't get value from to_pvar\n");
|
||||
- return (-1);
|
||||
- }
|
||||
- if (pv_val.flags & PV_VAL_STR) {
|
||||
- parse_to(pv_val.rs.s, pv_val.rs.s + pv_val.rs.len + 1, &parsed_from);
|
||||
- if (parsed_from.error != PARSE_OK) {
|
||||
- LM_ERR("Bad From value from from_pvar\n");
|
||||
- return (-1);
|
||||
- }
|
||||
- *from = &parsed_from;
|
||||
- return (0);
|
||||
- }
|
||||
- else {
|
||||
- LM_ERR("value from from_pvar is not a string\n");
|
||||
- }
|
||||
- return (-1);
|
||||
-}
|
||||
-
|
||||
-int sca_get_pv_to_header(sip_msg_t *msg, struct to_body **to, pv_spec_t *sp)
|
||||
-{
|
||||
- struct to_body parsed_to;
|
||||
- pv_value_t pv_val;
|
||||
-
|
||||
- assert(msg != NULL);
|
||||
- assert(to != NULL);
|
||||
- assert(sp != NULL);
|
||||
-
|
||||
- if (pv_get_spec_value(msg, sp, &pv_val) < 0) {
|
||||
- LM_ERR("can't get value from to_pvar\n");
|
||||
- return (-1);
|
||||
- }
|
||||
- if (pv_val.flags & PV_VAL_STR) {
|
||||
- parse_to(pv_val.rs.s, pv_val.rs.s + pv_val.rs.len + 1, &parsed_to);
|
||||
- if (parsed_to.error != PARSE_OK) {
|
||||
- LM_ERR("Bad To value from to_pvar\n");
|
||||
- return (-1);
|
||||
- }
|
||||
- *to = &parsed_to;
|
||||
- return (0);
|
||||
- }
|
||||
- else {
|
||||
- LM_ERR("value from to_pvar is not a string\n");
|
||||
- }
|
||||
- return (-1);
|
||||
-}
|
||||
-
|
||||
/* count characters requiring escape as defined by escape_common */
|
||||
int
|
||||
sca_uri_display_escapes_count( str *display )
|
||||
diff --git a/modules/sca/sca_util.h b/modules/sca/sca_util.h
|
||||
index 4a08dba..fdaf149 100644
|
||||
--- a/modules/sca/sca_util.h
|
||||
+++ b/modules/sca/sca_util.h
|
||||
@@ -40,15 +40,14 @@ int sca_get_msg_cseq_number( sip_msg_t * );
|
||||
/* convenient extraction of cseq method from Cseq header */
|
||||
int sca_get_msg_cseq_method( sip_msg_t * );
|
||||
|
||||
+int sca_build_to_body_from_uri(sip_msg_t *, struct to_body **, str *);
|
||||
+
|
||||
/* convenient From header parsing and extraction */
|
||||
int sca_get_msg_from_header( sip_msg_t *, struct to_body ** );
|
||||
|
||||
/* convenient To header parsing and extraction */
|
||||
int sca_get_msg_to_header( sip_msg_t *, struct to_body ** );
|
||||
|
||||
-int sca_get_pv_from_header(sip_msg_t *, struct to_body **, pv_spec_t *);
|
||||
-int sca_get_pv_to_header(sip_msg_t *, struct to_body **, pv_spec_t *);
|
||||
-
|
||||
/* count number of characters requiring escape as defined by escape_common */
|
||||
int sca_uri_display_escapes_count( str * );
|
||||
|
@ -0,0 +1,35 @@
|
||||
From: Victor Seva <vseva@sipwise.com>
|
||||
Date: Fri, 21 Oct 2016 13:44:47 +0200
|
||||
Subject: sca: use To header if in-dialog as target
|
||||
|
||||
Change-Id: I4ce7628da2b481d06895eeea33f564c33163f285
|
||||
---
|
||||
modules/sca/sca_subscribe.c | 11 +++++++----
|
||||
1 file changed, 7 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/modules/sca/sca_subscribe.c b/modules/sca/sca_subscribe.c
|
||||
index 0d797da..25fac54 100644
|
||||
--- a/modules/sca/sca_subscribe.c
|
||||
+++ b/modules/sca/sca_subscribe.c
|
||||
@@ -1124,14 +1124,17 @@ sca_subscription_from_request( sca_mod *scam, sip_msg_t *msg, int event_type,
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
- }
|
||||
-
|
||||
- req_sub->subscriber = contact_uri;
|
||||
- if ( sca_uri_extract_aor( ruri, &req_sub->target_aor) < 0) {
|
||||
+ if ( sca_uri_extract_aor( ruri, &req_sub->target_aor) < 0) {
|
||||
LM_ERR( "Failed to extract AoR from RURI %.*s",
|
||||
STR_FMT( ruri ));
|
||||
goto error;
|
||||
}
|
||||
+ }
|
||||
+ else {
|
||||
+ req_sub->target_aor = to->uri;
|
||||
+ }
|
||||
+
|
||||
+ req_sub->subscriber = contact_uri;
|
||||
req_sub->event = event_type;
|
||||
req_sub->index = SCA_CALL_INFO_APPEARANCE_INDEX_ANY;
|
||||
req_sub->expires = expires;
|
@ -0,0 +1,49 @@
|
||||
From: Victor Seva <vseva@sipwise.com>
|
||||
Date: Mon, 24 Oct 2016 11:34:39 +0200
|
||||
Subject: sca: use onhold_bflag value only when set
|
||||
|
||||
Change-Id: Icc6d7edd407299b6de2f85ad8ecc5fe8d9b89339
|
||||
---
|
||||
modules/sca/doc/sca_admin.xml | 3 ++-
|
||||
modules/sca/sca_util.c | 7 +++++--
|
||||
2 files changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/modules/sca/doc/sca_admin.xml b/modules/sca/doc/sca_admin.xml
|
||||
index 1108126..b376e41 100644
|
||||
--- a/modules/sca/doc/sca_admin.xml
|
||||
+++ b/modules/sca/doc/sca_admin.xml
|
||||
@@ -268,7 +268,8 @@ modparam( "sca", "db_update_interval", 120 )
|
||||
<para>
|
||||
<para>
|
||||
Which branch flag should be used by the module to identify if the call
|
||||
- is on-hold instead of parsing the sdp.
|
||||
+ is on-hold instead of parsing the sdp. If the bflag not is set the
|
||||
+ sdp will be parsed.
|
||||
</para>
|
||||
<para>
|
||||
<emphasis>
|
||||
diff --git a/modules/sca/sca_util.c b/modules/sca/sca_util.c
|
||||
index 60c178c..32a20bc 100644
|
||||
--- a/modules/sca/sca_util.c
|
||||
+++ b/modules/sca/sca_util.c
|
||||
@@ -454,8 +454,10 @@ sca_call_is_held( sip_msg_t *msg )
|
||||
int rc;
|
||||
|
||||
if(sca->cfg->onhold_bflag >= 0) {
|
||||
- LM_DBG("sca_call_is_held: skip parse_sdp and use onhold_bflag\n");
|
||||
- return isbflagset(0, (flag_t)sca->cfg->onhold_bflag);
|
||||
+ if(isbflagset(0, (flag_t)sca->cfg->onhold_bflag) == 1) {
|
||||
+ LM_DBG("onhold_bflag set, skip parse_sdp and set held\n");
|
||||
+ return ( 1 );
|
||||
+ }
|
||||
}
|
||||
rc = parse_sdp( msg );
|
||||
if ( rc < 0 ) {
|
||||
@@ -475,6 +477,7 @@ sca_call_is_held( sip_msg_t *msg )
|
||||
stream != NULL;
|
||||
n_str++, stream = get_sdp_stream( msg, n_sess, n_str )) {
|
||||
if ( stream->is_on_hold ) {
|
||||
+ LM_DBG("sca_call_is_held: parse_sdp detected stream is on hold\n");
|
||||
is_held = 1;
|
||||
goto done;
|
||||
}
|
Loading…
Reference in new issue