diff options
-rw-r--r-- | apps/app_externalivr.c | 115 |
1 files changed, 57 insertions, 58 deletions
diff --git a/apps/app_externalivr.c b/apps/app_externalivr.c index 1d08b2646..41631913c 100644 --- a/apps/app_externalivr.c +++ b/apps/app_externalivr.c @@ -93,7 +93,7 @@ struct gen_state { }; static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, - int eivr_events_fd, int eivr_commands_fd, int eivr_errors_fd, + int *eivr_events_fd, int *eivr_commands_fd, int *eivr_errors_fd, const char *args); static void send_eivr_event(FILE *handle, const char event, const char *data, @@ -297,9 +297,9 @@ static struct playlist_entry *make_entry(const char *filename) static int app_exec(struct ast_channel *chan, void *data) { struct playlist_entry *entry; - int child_stdin[2] = { 0,0 }; - int child_stdout[2] = { 0,0 }; - int child_stderr[2] = { 0,0 }; + int child_stdin[2] = { -1, -1 }; + int child_stdout[2] = { -1, -1 }; + int child_stderr[2] = { -1, -1 }; int res = -1; int gen_active = 0; int pid; @@ -389,44 +389,44 @@ static int app_exec(struct ast_channel *chan, void *data) /* parent process */ close(child_stdin[0]); - child_stdin[0] = 0; + child_stdin[0] = -1; close(child_stdout[1]); - child_stdout[1] = 0; + child_stdout[1] = -1; close(child_stderr[1]); - child_stderr[1] = 0; - res = eivr_comm(chan, u, child_stdin[1], child_stdout[0], child_stderr[0], comma_delim_argbuf); - - exit: - if (gen_active) - ast_deactivate_generator(chan); - - if (child_stdin[0]) - close(child_stdin[0]); - - if (child_stdin[1]) - close(child_stdin[1]); - - if (child_stdout[0]) - close(child_stdout[0]); - - if (child_stdout[1]) - close(child_stdout[1]); - - if (child_stderr[0]) - close(child_stderr[0]); - - if (child_stderr[1]) - close(child_stderr[1]); - - while ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) - ast_free(entry); + child_stderr[1] = -1; + res = eivr_comm(chan, u, &child_stdin[1], &child_stdout[0], &child_stderr[0], comma_delim_argbuf); + } - return res; + exit: + if (gen_active) { + ast_deactivate_generator(chan); } + if (child_stdin[0] > -1) { + close(child_stdin[0]); + } + if (child_stdin[1] > -1) { + close(child_stdin[1]); + } + if (child_stdout[0] > -1) { + close(child_stdout[0]); + } + if (child_stdout[1] > -1) { + close(child_stdout[1]); + } + if (child_stderr[0] > -1) { + close(child_stderr[0]); + } + if (child_stderr[1] > -1) { + close(child_stderr[1]); + } + while ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) { + ast_free(entry); + } + return res; } static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, - int eivr_events_fd, int eivr_commands_fd, int eivr_errors_fd, + int *eivr_events_fd, int *eivr_commands_fd, int *eivr_errors_fd, const char *args) { struct playlist_entry *entry; @@ -434,7 +434,7 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, int ms; int exception; int ready_fd; - int waitfds[2] = { eivr_commands_fd, eivr_errors_fd }; + int waitfds[2] = { *eivr_commands_fd, (eivr_errors_fd) ? *eivr_errors_fd : -1 }; struct ast_channel *rchan; char *command; int res = -1; @@ -444,16 +444,16 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, FILE *eivr_errors = NULL; FILE *eivr_events = NULL; - if (!(eivr_events = fdopen(eivr_events_fd, "w"))) { + if (!(eivr_events = fdopen(*eivr_events_fd, "w"))) { ast_chan_log(LOG_WARNING, chan, "Could not open stream to send events\n"); goto exit; } - if (!(eivr_commands = fdopen(eivr_commands_fd, "r"))) { + if (!(eivr_commands = fdopen(*eivr_commands_fd, "r"))) { ast_chan_log(LOG_WARNING, chan, "Could not open stream to receive commands\n"); goto exit; } - if(eivr_errors_fd) { /*if opening a socket connection, error stream will not be used*/ - if (!(eivr_errors = fdopen(eivr_errors_fd, "r"))) { + if (eivr_errors_fd) { /*if opening a socket connection, error stream will not be used*/ + if (!(eivr_errors = fdopen(*eivr_errors_fd, "r"))) { ast_chan_log(LOG_WARNING, chan, "Could not open stream to receive errors\n"); goto exit; } @@ -486,7 +486,7 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, errno = 0; exception = 0; - rchan = ast_waitfor_nandfds(&chan, 1, waitfds, (eivr_errors_fd == 0) ? 1 : 2, &exception, &ready_fd, &ms); + rchan = ast_waitfor_nandfds(&chan, 1, waitfds, (eivr_errors_fd) ? 2 : 1, &exception, &ready_fd, &ms); if (!AST_LIST_EMPTY(&u->finishlist)) { AST_LIST_LOCK(&u->finishlist); @@ -528,10 +528,10 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, break; } ast_frfree(f); - } else if (ready_fd == eivr_commands_fd) { + } else if (ready_fd == *eivr_commands_fd) { char input[1024]; - if (exception || (dup2(eivr_commands_fd, test_available_fd) == -1) || feof(eivr_commands)) { + if (exception || (dup2(*eivr_commands_fd, test_available_fd) == -1) || feof(eivr_commands)) { ast_chan_log(LOG_WARNING, chan, "Child process went away\n"); res = -1; break; @@ -618,7 +618,7 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, else ast_chan_log(LOG_WARNING, chan, "Unknown option requested '%s'\n", &input[2]); } - } else if (eivr_errors_fd && ready_fd == eivr_errors_fd) { + } else if (eivr_errors_fd && (ready_fd == *eivr_errors_fd)) { char input[1024]; if (exception || feof(eivr_errors)) { @@ -638,26 +638,25 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u, break; } } - - -exit: - + + exit: if (test_available_fd > -1) { close(test_available_fd); } - - if (eivr_events) + if (eivr_events) { fclose(eivr_events); - - if (eivr_commands) + *eivr_events_fd = -1; + } + if (eivr_commands) { fclose(eivr_commands); - - if (eivr_errors) + *eivr_commands_fd = -1; + } + if (eivr_errors) { fclose(eivr_errors); - - return res; - - } + *eivr_errors_fd = -1; + } + return res; + } static int unload_module(void) { |