X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=action.cpp;h=83e4965adf624c6757a5b4d2f0025658293ab784;hp=6856fccfd07b6058e013292f1e869c365547c6ac;hb=258c2e57a441f1fd8ed779bb2d88992aba3c1e65;hpb=14f76f1e81f0a4e7a63e83136d1ac958bf85c8a5 diff --git a/action.cpp b/action.cpp index 6856fcc..83e4965 100644 --- a/action.cpp +++ b/action.cpp @@ -1837,13 +1837,18 @@ void EndpointAppPBX::_action_goto_menu(int mode) trace_header("ACTION goto/menu (change to)", DIRECTION_NONE); add_trace("ruleset", NULL, "%s", e_ruleset->name); if (e_dialinginfo.id[0]) + { add_trace("dialing", NULL, "%s", e_dialinginfo.id); + } if ((rparam = routeparam(e_action, PARAM_SAMPLE))) { add_trace("sample", NULL, "%s", rparam->string_value); + end_trace(); set_tone(ea_endpoint->ep_portlist, rparam->string_value); + } else + { + end_trace(); } - end_trace(); /* do dialing with new ruleset */ e_action = NULL; @@ -2035,8 +2040,9 @@ void EndpointAppPBX::action_dialing_setforward(void) void EndpointAppPBX::action_hangup_execute(void) { struct route_param *rparam; + pid_t pid; char *command = "", isdn_port[10]; - char *argv[7+1]; /* check also number of args below */ + char *argv[11]; /* check also number of args below */ int i = 0; /* get script / command */ @@ -2048,26 +2054,35 @@ void EndpointAppPBX::action_hangup_execute(void) end_trace(); return; } - trace_header("ACTION execute", DIRECTION_NONE); - add_trace("command", NULL, "%s", command); - end_trace(); - - argv[0] = command; - while(strchr(argv[0], '/')) - argv[0] = strchr(argv[0], '/')+1; + argv[i++] = "/bin/sh"; + argv[i++] = "-c"; + argv[i++] = command; + argv[i++] = command; if ((rparam = routeparam(e_action, PARAM_PARAM))) { - argv[1] = rparam->string_value; - i++; + argv[i++] = rparam->string_value; } - argv[1+i] = e_extdialing; - argv[2+i] = numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype); - argv[3+i] = e_callerinfo.extension; - argv[4+i] = e_callerinfo.name; + argv[i++] = e_extdialing; + argv[i++] = numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype); + argv[i++] = e_callerinfo.extension; + argv[i++] = e_callerinfo.name; SPRINT(isdn_port, "%d", e_callerinfo.isdn_port); - argv[5+i] = isdn_port; - argv[6+i] = NULL; /* check also number of args above */ - execve("/bin/sh", argv, environ); + argv[i++] = isdn_port; + argv[i++] = NULL; /* check also number of args above */ + switch (pid = fork ()) { + case -1: + trace_header("ACTION execute (fork failed)", DIRECTION_NONE); + end_trace(); + break; + case 0: + execve("/bin/sh", argv, environ); + break; + default: + trace_header("ACTION execute", DIRECTION_NONE); + add_trace("command", NULL, "%s", command); + end_trace(); + break; + } }