From f8599649930f76bd72ed49d038f35ebc33dcec34 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 28 Jan 2010 01:00:04 +0000 Subject: [PATCH] fix filters (reported on mailing list use jira next time =/) git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16527 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- libs/esl/src/esl_event.c | 4 +-- libs/esl/src/include/esl_event.h | 3 +- src/include/switch_event.h | 3 +- .../mod_event_socket/mod_event_socket.c | 32 ++++++++++++------- src/switch_event.c | 4 +-- 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/libs/esl/src/esl_event.c b/libs/esl/src/esl_event.c index 1188a01707..2686f332c4 100644 --- a/libs/esl/src/esl_event.c +++ b/libs/esl/src/esl_event.c @@ -254,7 +254,7 @@ ESL_DECLARE(char *)esl_event_get_body(esl_event_t *event) return (event ? event->body : NULL); } -ESL_DECLARE(esl_status_t) esl_event_del_header(esl_event_t *event, const char *header_name) +ESL_DECLARE(esl_status_t) esl_event_del_header_val(esl_event_t *event, const char *header_name, const char *val) { esl_event_header_t *hp, *lp = NULL, *tp; esl_status_t status = ESL_FAIL; @@ -271,7 +271,7 @@ ESL_DECLARE(esl_status_t) esl_event_del_header(esl_event_t *event, const char *h esl_assert(x < 1000); hash = esl_ci_hashfunc_default(header_name, &hlen); - if (hp->name && (!hp->hash || hash == hp->hash) && !strcasecmp(header_name, hp->name)) { + if (hp->name && (!hp->hash || hash == hp->hash) && !strcasecmp(header_name, hp->name) && (esl_strlen_zero(val) || !strcmp(hp->value, val))) { if (lp) { lp->next = hp->next; } else { diff --git a/libs/esl/src/include/esl_event.h b/libs/esl/src/include/esl_event.h index 790add2d54..2ed782dc23 100644 --- a/libs/esl/src/include/esl_event.h +++ b/libs/esl/src/include/esl_event.h @@ -226,7 +226,8 @@ ESL_DECLARE(esl_status_t) esl_event_add_header(esl_event_t *event, esl_stack_t s */ ESL_DECLARE(esl_status_t) esl_event_add_header_string(esl_event_t *event, esl_stack_t stack, const char *header_name, const char *data); -ESL_DECLARE(esl_status_t) esl_event_del_header(esl_event_t *event, const char *header_name); +ESL_DECLARE(esl_status_t) esl_event_del_header_val(esl_event_t *event, const char *header_name, const char *var); +#define esl_event_del_header(_e, _h) esl_event_del_header_val(_e, _h, NULL) /*! \brief Destroy an event diff --git a/src/include/switch_event.h b/src/include/switch_event.h index 0cfc1bab15..eb3bbde785 100644 --- a/src/include/switch_event.h +++ b/src/include/switch_event.h @@ -182,7 +182,8 @@ SWITCH_DECLARE(switch_status_t) switch_event_set_subclass_name(switch_event_t *e */ SWITCH_DECLARE(switch_status_t) switch_event_add_header_string(switch_event_t *event, switch_stack_t stack, const char *header_name, const char *data); -SWITCH_DECLARE(switch_status_t) switch_event_del_header(switch_event_t *event, const char *header_name); +SWITCH_DECLARE(switch_status_t) switch_event_del_header_val(switch_event_t *event, const char *header_name, const char *val); +#define switch_event_del_header(_e, _h) switch_event_del_header_val(_e, _h, NULL) /*! \brief Destroy an event diff --git a/src/mod/event_handlers/mod_event_socket/mod_event_socket.c b/src/mod/event_handlers/mod_event_socket/mod_event_socket.c index c412095743..13d64ec744 100644 --- a/src/mod/event_handlers/mod_event_socket/mod_event_socket.c +++ b/src/mod/event_handlers/mod_event_socket/mod_event_socket.c @@ -1705,36 +1705,44 @@ static switch_status_t parse_command(listener_t *listener, switch_event_t **even if (!strncasecmp(cmd, "filter ", 7)) { char *header_name = cmd + 7; - char *header_val; + char *header_val = NULL; strip_cr(header_name); while(header_name && *header_name && *header_name == ' ') header_name++; - if (!(header_val = strchr(header_name, ' '))) { - switch_snprintf(reply, reply_len, "-ERR invalid syntax"); - goto done; + if ((header_val = strchr(header_name, ' '))) { + *header_val++ = '\0'; } - - *header_val++ = '\0'; - - + switch_mutex_lock(listener->filter_mutex); if (!listener->filters) { switch_event_create_plain(&listener->filters, SWITCH_EVENT_CHANNEL_DATA); } if (!strcasecmp(header_name, "delete")) { - if (!strcasecmp(header_val, "all")) { + header_name = header_val; + if ((header_val = strchr(header_name, ' '))) { + *header_val++ = '\0'; + } + if (!strcasecmp(header_name, "all")) { switch_event_destroy(&listener->filters); switch_event_create_plain(&listener->filters, SWITCH_EVENT_CHANNEL_DATA); } else { - switch_event_del_header(listener->filters, header_val); + switch_event_del_header_val(listener->filters, header_name, header_val); + } + switch_snprintf(reply, reply_len, "+OK filter deleted. [%s][%s]", header_name, switch_str_nil(header_val)); + } else if (header_val) { + if (!strcasecmp(header_name, "add")) { + header_name = header_val; + if ((header_val = strchr(header_name, ' '))) { + *header_val++ = '\0'; + } } - switch_snprintf(reply, reply_len, "+OK filter deleted. [%s]", header_val); - } else { switch_event_add_header_string(listener->filters, SWITCH_STACK_BOTTOM, header_name, header_val); switch_snprintf(reply, reply_len, "+OK filter added. [%s]=[%s]", header_name, header_val); + } else { + switch_snprintf(reply, reply_len, "-ERR invalid syntax"); } switch_mutex_unlock(listener->filter_mutex); diff --git a/src/switch_event.c b/src/switch_event.c index 85d6ed061a..b09e0f94a5 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -697,7 +697,7 @@ SWITCH_DECLARE(char *) switch_event_get_body(switch_event_t *event) return (event ? event->body : NULL); } -SWITCH_DECLARE(switch_status_t) switch_event_del_header(switch_event_t *event, const char *header_name) +SWITCH_DECLARE(switch_status_t) switch_event_del_header_val(switch_event_t *event, const char *header_name, const char *val) { switch_event_header_t *hp, *lp = NULL, *tp; switch_status_t status = SWITCH_STATUS_FALSE; @@ -714,7 +714,7 @@ SWITCH_DECLARE(switch_status_t) switch_event_del_header(switch_event_t *event, c switch_assert(x < 1000); hash = switch_ci_hashfunc_default(header_name, &hlen); - if ((!hp->hash || hash == hp->hash) && !strcasecmp(header_name, hp->name)) { + if ((!hp->hash || hash == hp->hash) && !strcasecmp(header_name, hp->name) && (zstr(val) || !strcmp(hp->value, val))) { if (lp) { lp->next = hp->next; } else {