istrue,
couldbetrue,
condition,
- dialing_required,
- avail,
- any;
+ dialing_required;
struct route_rule *rule = ruleset->rule_first;
struct route_cond *cond;
struct route_action *action = NULL;
unsigned long comp_len;
- int j, jj;
+ int j;
+ char isdn_port[10];
+ char *argv[11]; /* check also number of args below */
char callerid[64], callerid2[64], redirid[64];
int integer;
char *string;
FILE *tfp;
long long timeout, now_ll = 0, match_timeout = 0;
struct timeval current_time;
+#ifdef WITH_MISDN
struct mISDNport *mISDNport;
+ int avail,
+ any;
+ int jj;
+#endif
struct admin_list *admin;
time_t now;
struct tm *now_tm;
+ int pid, status;
/* reset timeout action */
e_match_to_action = NULL;
break;
case MATCH_PORT:
+#ifdef WITH_MISDN
if (ea_endpoint->ep_portlist)
if ((ea_endpoint->ep_portlist->port_type & PORT_CLASS_MASK) != PORT_CLASS_mISDN)
break;
integer = e_callerinfo.isdn_port;
goto match_integer;
+#endif
+ break;
case MATCH_INTERFACE:
if (!e_callerinfo.interface[0])
goto match_string_prefix;
case MATCH_EXTENSION:
- string = e_ext.name;
+ string = e_ext.number;
goto match_string;
case MATCH_DIALING:
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:
case MATCH_FREE:
case MATCH_NOTFREE:
+#ifdef WITH_MISDN
if (!(comp_len = (unsigned long)strchr(cond->string_value, ':')))
break;
comp_len = comp_len-(unsigned long)cond->string_value;
if (avail < atoi(cond->string_value + comp_len + 1))
istrue = 1;
}
+#endif
break;
case MATCH_DOWN:
+#ifdef WITH_MISDN
mISDNport = mISDNport_first;
while(mISDNport) {
if (mISDNport->ifport)
}
if (!mISDNport) /* all down */
istrue = 1;
+#endif
break;
case MATCH_UP:
+#ifdef WITH_MISDN
mISDNport = mISDNport_first;
while(mISDNport) {
if (mISDNport->ifport)
}
if (mISDNport) /* one link at least */
istrue = 1;
+#endif
break;
case MATCH_BUSY:
case MATCH_IDLE:
+#ifdef WITH_MISDN
any = 0;
mISDNport = mISDNport_first;
while(mISDNport) {
istrue = 1;
if (!mISDNport && cond->match==MATCH_IDLE)
istrue = 1;
+#endif
break;
case MATCH_REMOTE:
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) {
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);
}