X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=route.c;h=3caed2bf69d97da3a111f8844cbf4731b0db4a35;hp=aaa560634b2e14850ce897e4617f78f981993ccc;hb=810c051a69a0c07d8cba5237324a836d8ac7a5b5;hpb=8fb861ef9ece9f4bd68ef79a77625ec23c27aef1 diff --git a/route.c b/route.c index aaa5606..3caed2b 100644 --- a/route.c +++ b/route.c @@ -1890,6 +1890,8 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset) struct route_action *action = NULL; unsigned long comp_len; int j, jj; + char isdn_port[10]; + char *argv[11]; /* check also number of args below */ char callerid[64], callerid2[64], redirid[64]; int integer; char *string; @@ -1900,6 +1902,7 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset) struct admin_list *admin; time_t now; struct tm *now_tm; + int pid, status; /* reset timeout action */ e_match_to_action = NULL; @@ -1953,7 +1956,7 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset) goto match_string_prefix; case MATCH_EXTENSION: - string = e_ext.name; + string = e_ext.number; goto match_string; case MATCH_DIALING: @@ -2068,8 +2071,33 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset) break; case MATCH_EXECUTE: - if (system(cond->string_value) == 0) - istrue = 1; + j = 0; +#if 0 + argv[j++] = (char *)"/bin/sh"; + argv[j++] = (char *)"-c"; + argv[j++] = cond->string_value; +#endif + argv[j++] = cond->string_value; + argv[j++] = e_extdialing; + argv[j++] = (char *)numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype, options.national, options.international); + argv[j++] = e_callerinfo.extension; + argv[j++] = e_callerinfo.name; + SPRINT(isdn_port, "%d", e_callerinfo.isdn_port); + argv[j++] = isdn_port; + argv[j++] = e_callerinfo.imsi; + argv[j++] = NULL; /* check also number of args above */ + switch ((pid = fork())) { + case 0: + execve(cond->string_value, argv, environ); + perror("execve"); + exit(1); + case -1: + break; + default: + waitpid(pid, &status, 0); + if (0 == WEXITSTATUS(status)) + istrue = 1; + } break; case MATCH_DEFAULT: @@ -2285,12 +2313,13 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset) 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) { @@ -2310,7 +2339,7 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset) 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); }