Do not abort, if forking/pipes fail while starting routing script
This commit is contained in:
parent
d8ebec0d6f
commit
8fd49584e6
|
@ -317,7 +317,7 @@ static int routing_handle_stdout(struct osmo_fd *ofd, unsigned int what);
|
|||
static int routing_handle_stderr(struct osmo_fd *ofd, unsigned int what);
|
||||
|
||||
/* run script */
|
||||
void routing_start(routing_t *routing, const char *script, const char *shell)
|
||||
int routing_start(routing_t *routing, const char *script, const char *shell)
|
||||
{
|
||||
int in_pipe[2], out_pipe[2], err_pipe[2];
|
||||
pid_t pid;
|
||||
|
@ -326,21 +326,33 @@ void routing_start(routing_t *routing, const char *script, const char *shell)
|
|||
|
||||
rc = pipe(in_pipe);
|
||||
if (rc < 0) {
|
||||
epipe:
|
||||
LOGP(DROUTER, LOGL_ERROR, "pipe() failed: errno=%d\n", errno);
|
||||
abort();
|
||||
LOGP(DROUTER, LOGL_ERROR, "STDIN pipe() failed: errno=%d\n", errno);
|
||||
error_in_pipe:
|
||||
return -errno;
|
||||
}
|
||||
rc = pipe(out_pipe);
|
||||
if (rc < 0)
|
||||
goto epipe;
|
||||
if (rc < 0) {
|
||||
LOGP(DROUTER, LOGL_ERROR, "STDOUT pipe() failed: errno=%d\n", errno);
|
||||
error_out_pipe:
|
||||
close(in_pipe[0]);
|
||||
close(in_pipe[1]);
|
||||
goto error_in_pipe;
|
||||
}
|
||||
rc = pipe(err_pipe);
|
||||
if (rc < 0)
|
||||
goto epipe;
|
||||
if (rc < 0) {
|
||||
LOGP(DROUTER, LOGL_ERROR, "STDERR pipe() failed: errno=%d\n", errno);
|
||||
error_err_pipe:
|
||||
close(out_pipe[0]);
|
||||
close(out_pipe[1]);
|
||||
goto error_out_pipe;
|
||||
}
|
||||
|
||||
pid = fork();
|
||||
if (pid < 0) {
|
||||
LOGP(DROUTER, LOGL_ERROR, "fork() failed: errno=%d\n", errno);
|
||||
abort();
|
||||
close(err_pipe[0]);
|
||||
close(err_pipe[1]);
|
||||
goto error_err_pipe;
|
||||
}
|
||||
if (pid == 0) {
|
||||
const char *argv[] = { shell, "-c", script, NULL };
|
||||
|
@ -414,6 +426,8 @@ void routing_start(routing_t *routing, const char *script, const char *shell)
|
|||
routing->routing = 1;
|
||||
|
||||
LOGP(DROUTER, LOGL_DEBUG, "Routing script started.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ void env_help(void);
|
|||
void routing_env_msg(routing_t *routing, osmo_cc_msg_t *msg);
|
||||
void routing_env_dialing(routing_t *routing, char *number, char *keypad, int complete);
|
||||
void routing_env_free(routing_t *routing);
|
||||
void routing_start(routing_t *routing, const char *script, const char *shell);
|
||||
int routing_start(routing_t *routing, const char *script, const char *shell);
|
||||
void routing_stop(routing_t *routing);
|
||||
void routing_send(routing_t *routing, const char *string);
|
||||
int routing_handle(routing_t *routing);
|
||||
|
|
Loading…
Reference in New Issue