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); static int routing_handle_stderr(struct osmo_fd *ofd, unsigned int what);
/* run script */ /* 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]; int in_pipe[2], out_pipe[2], err_pipe[2];
pid_t pid; pid_t pid;
@ -326,21 +326,33 @@ void routing_start(routing_t *routing, const char *script, const char *shell)
rc = pipe(in_pipe); rc = pipe(in_pipe);
if (rc < 0) { if (rc < 0) {
epipe: LOGP(DROUTER, LOGL_ERROR, "STDIN pipe() failed: errno=%d\n", errno);
LOGP(DROUTER, LOGL_ERROR, "pipe() failed: errno=%d\n", errno); error_in_pipe:
abort(); return -errno;
} }
rc = pipe(out_pipe); rc = pipe(out_pipe);
if (rc < 0) if (rc < 0) {
goto epipe; 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); rc = pipe(err_pipe);
if (rc < 0) if (rc < 0) {
goto epipe; 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(); pid = fork();
if (pid < 0) { if (pid < 0) {
LOGP(DROUTER, LOGL_ERROR, "fork() failed: errno=%d\n", errno); 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) { if (pid == 0) {
const char *argv[] = { shell, "-c", script, NULL }; 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; routing->routing = 1;
LOGP(DROUTER, LOGL_DEBUG, "Routing script started.\n"); 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_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_dialing(routing_t *routing, char *number, char *keypad, int complete);
void routing_env_free(routing_t *routing); 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_stop(routing_t *routing);
void routing_send(routing_t *routing, const char *string); void routing_send(routing_t *routing, const char *string);
int routing_handle(routing_t *routing); int routing_handle(routing_t *routing);