};
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);
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;
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;
} 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);
}
}
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) {
}
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;
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;
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;
}
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);
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;
}
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)) {
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)