From: Andreas Eversberg Date: Wed, 10 Aug 2011 19:50:45 +0000 (+0200) Subject: Fixed forking, to prevent LCR to run multiple times X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=commitdiff_plain;h=8b70a9a5c2071c587ab4016dcbbb8e4bbf6da181;hp=ca68dbb3a581cd9b4b89253aa2a418721f993f72 Fixed forking, to prevent LCR to run multiple times Executing a script caused very weird behaviour, due to forking of LCR. --- diff --git a/action.cpp b/action.cpp index 352efb4..478406d 100644 --- a/action.cpp +++ b/action.cpp @@ -2003,10 +2003,8 @@ void EndpointAppPBX::action_execute(void) if ((pid2 = fork()) == 0) { execve(command, argv, environ); } - else { - /* Exit immediately and release the waiting parent. The subprocess falls to init because the parent died */ - exit(0); - } + /* Exit immediately and release the waiting parent. The subprocess falls to init because the parent died */ + exit(0); break; default: trace_header("ACTION execute", DIRECTION_NONE); diff --git a/route.c b/route.c index 8217ff1..c1bf079 100644 --- a/route.c +++ b/route.c @@ -1902,7 +1902,7 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset) struct admin_list *admin; time_t now; struct tm *now_tm; - int pid2; + int pid, status; /* reset timeout action */ e_match_to_action = NULL; @@ -2086,10 +2086,17 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset) argv[j++] = isdn_port; argv[j++] = e_callerinfo.imsi; argv[j++] = NULL; /* check also number of args above */ - if (fork() == 0) { - if ((pid2 = fork()) == 0) { - execve(cond->string_value, argv, environ); - } + 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;