summaryrefslogtreecommitdiffstats
path: root/action.cpp
diff options
context:
space:
mode:
authorSuper User2008-02-04 12:39:47 +0100
committerSuper User2008-02-04 12:39:47 +0100
commit87c6cddd9411591029446910df897259eeb20c8a (patch)
tree8304618f52fbfe4c3dc291348aec09726f6fecd2 /action.cpp
parentnow gives warning if mISDN branch is wrong. (diff)
downloadlcr-87c6cddd9411591029446910df897259eeb20c8a.tar.gz
lcr-87c6cddd9411591029446910df897259eeb20c8a.tar.xz
lcr-87c6cddd9411591029446910df897259eeb20c8a.zip
added execute patch by martin
now execute works and forks modified: action.cpp modified: todo.txt
Diffstat (limited to 'action.cpp')
-rw-r--r--action.cpp44
1 files changed, 27 insertions, 17 deletions
diff --git a/action.cpp b/action.cpp
index 6856fcc..6d9d1dd 100644
--- a/action.cpp
+++ b/action.cpp
@@ -2035,8 +2035,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 +2049,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;
+ }
}