Do not abort, if forking/pipes fail while starting routing script

This commit is contained in:
Andreas Eversberg 2024-01-27 09:56:38 +01:00
parent d8ebec0d6f
commit 8fd49584e6
2 changed files with 24 additions and 10 deletions

View File

@ -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;
}

View File

@ -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);