Fixed broken timeout condition
authorAndreas Eversberg <jolly@eversberg.eu>
Fri, 2 Sep 2011 08:01:07 +0000 (10:01 +0200)
committerAndreas Eversberg <jolly@eversberg.eu>
Fri, 2 Sep 2011 08:01:07 +0000 (10:01 +0200)
A given timeout condition never made the rule match.

action.cpp
route.c

index 478406d..514c016 100644 (file)
@@ -2283,11 +2283,12 @@ void EndpointAppPBX::process_dialing(int timeout)
                }
 
                gettimeofday(&current_time, NULL);
                }
 
                gettimeofday(&current_time, NULL);
-               if (timeout && TIME_SMALLER(&e_match_timeout.timeout, &current_time)) {
+               if (e_match_to_action && TIME_SMALLER(&e_match_timeout.timeout, &current_time)) {
                        /* return timeout rule */
                        PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal '%s' dialing: '%s', timeout in ruleset '%s'\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.id, e_ruleset->name);
                        unsched_timer(&e_match_timeout);
                        e_action = e_match_to_action;
                        /* return timeout rule */
                        PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal '%s' dialing: '%s', timeout in ruleset '%s'\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.id, e_ruleset->name);
                        unsched_timer(&e_match_timeout);
                        e_action = e_match_to_action;
+                       e_match_to_action = NULL;
                        e_extdialing = e_match_to_extdialing;
                        trace_header("ROUTING (timeout)", DIRECTION_NONE);
                        add_trace("action", NULL, "%s", action_defs[e_action->index].name);
                        e_extdialing = e_match_to_extdialing;
                        trace_header("ROUTING (timeout)", DIRECTION_NONE);
                        add_trace("action", NULL, "%s", action_defs[e_action->index].name);
diff --git a/route.c b/route.c
index c1bf079..3caed2b 100644 (file)
--- a/route.c
+++ b/route.c
@@ -2313,12 +2313,13 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset)
 
                        cond = cond->next;
                }
 
                        cond = cond->next;
                }
-               if (timeout>now_ll && match==1) /* the matching rule with timeout in the future */
-               if (match_timeout == 0 || timeout < match_timeout) { /* first timeout or lower */
-                       /* set timeout in the furture */
-                       match_timeout = timeout;
-                       e_match_to_action = rule->action_first;
-                       e_match_to_extdialing = e_dialinginfo.id + dialing_required;
+               if (timeout>now_ll && match==1) { /* the matching rule with timeout in the future */
+                       if (match_timeout == 0 || timeout < match_timeout) { /* first timeout or lower */
+                               /* set timeout in the furture */
+                               match_timeout = timeout;
+                               e_match_to_action = rule->action_first;
+                               e_match_to_extdialing = e_dialinginfo.id + dialing_required;
+                       }
                        match = 0; /* matches in the future */
                }
                if (match == 1) {
                        match = 0; /* matches in the future */
                }
                if (match == 1) {
@@ -2338,7 +2339,7 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset)
        if (match_timeout == 0)
                unsched_timer(&e_match_timeout); /* no timeout */
        else {
        if (match_timeout == 0)
                unsched_timer(&e_match_timeout); /* no timeout */
        else {
-               schedule_timer(&e_match_timeout, match_timeout / 1000000, match_timeout % 1000000);
+               schedule_timer(&e_match_timeout, (match_timeout-now_ll) / 1000000, (match_timeout-now_ll) % 1000000);
        }
        return(action);
 }
        }
        return(action);
 }