diff --git a/apps/app_externalivr.c b/apps/app_externalivr.c index 39088c576f906b66534cb3e2067695c9596e5fbb..ba9c211fb61a2974f6846cfb8a357c5910feffc8 100644 --- a/apps/app_externalivr.c +++ b/apps/app_externalivr.c @@ -144,7 +144,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 struct ast_str *args, const struct ast_flags flags); int eivr_connect_socket(struct ast_channel *chan, const char *host, int port); @@ -353,9 +353,9 @@ static int app_exec(struct ast_channel *chan, const char *data) struct ast_flags flags = { 0, }; char *opts[0]; 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 pid; @@ -479,10 +479,9 @@ static int app_exec(struct ast_channel *chan, const char *data) if (!(ser = ast_tcptls_client_create(&ivr_desc)) || !(ser = ast_tcptls_client_start(ser))) { goto exit; } - res = eivr_comm(chan, u, ser->fd, ser->fd, -1, comma_delim_args, flags); + res = eivr_comm(chan, u, &ser->fd, &ser->fd, NULL, comma_delim_args, flags); } else { - if (pipe(child_stdin)) { ast_chan_log(LOG_ERROR, chan, "Could not create pipe for child input: %s\n", strerror(errno)); goto exit; @@ -517,12 +516,12 @@ static int app_exec(struct ast_channel *chan, const char *data) } else { /* 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_args, flags); + child_stderr[1] = -1; + res = eivr_comm(chan, u, &child_stdin[1], &child_stdout[0], &child_stderr[0], comma_delim_args, flags); } } @@ -530,22 +529,22 @@ static int app_exec(struct ast_channel *chan, const char *data) if (u->gen_active) { ast_deactivate_generator(chan); } - if (child_stdin[0]) { + if (child_stdin[0] > -1) { close(child_stdin[0]); } - if (child_stdin[1]) { + if (child_stdin[1] > -1) { close(child_stdin[1]); } - if (child_stdout[0]) { + if (child_stdout[0] > -1) { close(child_stdout[0]); } - if (child_stdout[1]) { + if (child_stdout[1] > -1) { close(child_stdout[1]); } - if (child_stderr[0]) { + if (child_stderr[0] > -1) { close(child_stderr[0]); } - if (child_stderr[1]) { + if (child_stderr[1] > -1) { close(child_stderr[1]); } if (ser) { @@ -558,7 +557,7 @@ static int app_exec(struct ast_channel *chan, const char *data) } 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 struct ast_str *args, const struct ast_flags flags) { struct playlist_entry *entry; @@ -566,7 +565,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; int res = -1; int test_available_fd = -1; @@ -576,16 +575,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_ERROR, 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_ERROR, chan, "Could not open stream to receive commands\n"); goto exit; } - if (eivr_errors_fd > -1) { /* 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_ERROR, chan, "Could not open stream to receive errors\n"); goto exit; } @@ -621,7 +620,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 (chan->_state == AST_STATE_UP && !AST_LIST_EMPTY(&u->finishlist)) { AST_LIST_LOCK(&u->finishlist); @@ -664,10 +663,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_ERROR, chan, "Child process went away\n"); break; } @@ -784,7 +783,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)) { @@ -802,25 +801,24 @@ 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); - + *eivr_errors_fd = -1; + } return res; - } static int unload_module(void)