--- a/clients/upsmon.c 2022-04-23 04:56:06.000000000 -0700 +++ b/clients/upsmon.c 2022-09-04 13:21:28.072170502 -0700 @@ -26,6 +26,7 @@ # include # include # include +# include #else /* WIN32 */ # include "wincompat.h" #endif /* WIN32 */ @@ -1874,6 +1875,22 @@ static void runparent(int fd) __attribute__((noreturn)); +static int runcmd(const char *cmd) +{ + // TODO: Support tokenizing `cmd`. + const char *argv[] = {cmd, NULL}; + const char *env[] = {NULL}; + + pid_t pid = 0; + int sret = posix_spawn(&pid, cmd, NULL, NULL, (char * const *)(argv), (char * const *)(env)); + if (sret != 0) + return -1; + + int status; + waitpid(pid, &status, 0); + return WEXITSTATUS(status); +} + static void runparent(int fd) { ssize_t ret; @@ -1907,7 +1925,7 @@ /* have to do this here - child is unprivileged */ set_pdflag(); - sret = system(shutdowncmd); + sret = runcmd(shutdowncmd); if (sret != 0) upslogx(LOG_ERR, "parent: Unable to call shutdown command: %s",