C-API: Add error socket to clixon_proc_socket()

This commit is contained in:
Olof hagsand 2024-01-31 14:36:40 +01:00
parent 9ecc7e0791
commit 3149d53564
3 changed files with 22 additions and 6 deletions

View file

@ -69,7 +69,7 @@ Developers may need to change their code
* `clicon_suberrno` -> `clixon_err_subnr()` * `clicon_suberrno` -> `clixon_err_subnr()`
* `clicon_err_reason` -> `clixon_err_reason()` * `clicon_err_reason` -> `clixon_err_reason()`
* Changed process API: * Changed process API:
* `clixon_proc_socket(...)` --> `clixon_proc_socket(h, ...)` * `clixon_proc_socket(...)` --> `clixon_proc_socket(h, ..., sockerr)`
### Corrected Bugs ### Corrected Bugs

View file

@ -65,7 +65,7 @@ typedef int (proc_cb_t)(clixon_handle h,
/* /*
* Prototypes * Prototypes
*/ */
int clixon_proc_socket(clixon_handle h, char **argv, int sock_flags, pid_t *pid, int *sock); int clixon_proc_socket(clixon_handle h, char **argv, int sock_flags, pid_t *pid, int *sock, int *sockerr);
int clixon_proc_socket_close(pid_t pid, int sock); int clixon_proc_socket_close(pid_t pid, int sock);
int clixon_process_pid(clixon_handle h, const char *name, pid_t *pid); int clixon_process_pid(clixon_handle h, const char *name, pid_t *pid);
proc_operation clixon_process_op_str2int(char *opstr); proc_operation clixon_process_op_str2int(char *opstr);

View file

@ -187,7 +187,8 @@ clixon_proc_sigint(int sig)
* @param[in] argv NULL-terminated Argument vector * @param[in] argv NULL-terminated Argument vector
* @param[in] sock_flags Socket type/flags, typically SOCK_DGRAM or SOCK_STREAM, see * @param[in] sock_flags Socket type/flags, typically SOCK_DGRAM or SOCK_STREAM, see
* @param[out] pid Process-id of child * @param[out] pid Process-id of child
* @param[out] sock Socket * @param[out] sock Socket for stdin+stdout
* @param[out] sockerr Optional socket for stderr
* @retval O OK * @retval O OK
* @retval -1 Error. * @retval -1 Error.
* @see clixon_proc_socket_close close sockets, kill child and wait for child termination * @see clixon_proc_socket_close close sockets, kill child and wait for child termination
@ -198,10 +199,12 @@ clixon_proc_socket(clixon_handle h,
char **argv, char **argv,
int sock_flags, int sock_flags,
pid_t *pid, pid_t *pid,
int *sock) int *sock,
int *sockerr)
{ {
int retval = -1; int retval = -1;
int sp[2] = {-1, -1}; int sp[2] = {-1, -1};
int sperr[2] = {-1, -1};
pid_t child; pid_t child;
sigfn_t oldhandler = NULL; sigfn_t oldhandler = NULL;
sigset_t oset; sigset_t oset;
@ -233,7 +236,11 @@ clixon_proc_socket(clixon_handle h,
clixon_err(OE_UNIX, errno, "socketpair"); clixon_err(OE_UNIX, errno, "socketpair");
goto done; goto done;
} }
if (sockerr &&
socketpair(AF_UNIX, sock_flags, 0, sperr) < 0){
clixon_err(OE_UNIX, errno, "socketpair");
goto done;
}
sigprocmask(0, NULL, &oset); sigprocmask(0, NULL, &oset);
set_signal(SIGINT, clixon_proc_sigint, &oldhandler); set_signal(SIGINT, clixon_proc_sigint, &oldhandler);
sig++; sig++;
@ -258,18 +265,27 @@ clixon_proc_socket(clixon_handle h,
return -1; return -1;
} }
close(sp[1]); close(sp[1]);
if (sockerr){
close(2);
if (dup2(sperr[1], STDERR_FILENO) < 0){
clixon_err(OE_UNIX, errno, "dup2(STDERR)");
return -1;
}
close(sperr[1]);
}
if (execvp(argv[0], argv) < 0){ if (execvp(argv[0], argv) < 0){
clixon_err(OE_UNIX, errno, "execvp(%s)", argv[0]); clixon_err(OE_UNIX, errno, "execvp(%s)", argv[0]);
return -1; return -1;
} }
exit(-1); /* Shouldnt reach here */ exit(-1); /* Shouldnt reach here */
} }
clixon_debug(CLIXON_DBG_PROC | CLIXON_DBG_DETAIL, "child %u sock %d", child, sp[0]); clixon_debug(CLIXON_DBG_PROC | CLIXON_DBG_DETAIL, "child %u sock %d", child, sp[0]);
/* Parent */ /* Parent */
close(sp[1]); close(sp[1]);
*pid = child; *pid = child;
*sock = sp[0]; *sock = sp[0];
if (sockerr)
*sockerr = sperr[0];
retval = 0; retval = 0;
done: done:
if (sig){ /* Restore sigmask and fn */ if (sig){ /* Restore sigmask and fn */