]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix filters (reported on mailing list use jira next time =/)
authorAnthony Minessale <anthony.minessale@gmail.com>
Thu, 28 Jan 2010 01:00:04 +0000 (01:00 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Thu, 28 Jan 2010 01:00:04 +0000 (01:00 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16527 d0543943-73ff-0310-b7d9-9358b9ac24b2

libs/esl/src/esl_event.c
libs/esl/src/include/esl_event.h
src/include/switch_event.h
src/mod/event_handlers/mod_event_socket/mod_event_socket.c
src/switch_event.c

index 1188a01707a43a57bd59cd0a9c766006bc249962..2686f332c4eab5e23ee7ffac782c80d6a9b6d7d8 100644 (file)
@@ -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 {
index 790add2d54185c2ed9383ef25a09a62b993d2147..2ed782dc236869d2930c9893dda0787ebc2e58ea 100644 (file)
@@ -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
index 0cfc1bab15a2af9dc38be46aad69b5eb7a753a29..eb3bbde785ca1f5858a454209b9713832a91e956 100644 (file)
@@ -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
index c4120957433a97f6bc4fd438f810288816f33078..13d64ec74467406ea23a98a0a897e1b503b0a33d 100644 (file)
@@ -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);
 
index 85d6ed061a0f380fae488327e374206013824658..b09e0f94a509007566c88e1da2ffbbdbd9855a2d 100644 (file)
@@ -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 {