diff --git a/libobs/util/pipe-posix.c b/libobs/util/pipe-posix.c index 290830a82..195f6e0cd 100644 --- a/libobs/util/pipe-posix.c +++ b/libobs/util/pipe-posix.c @@ -15,6 +15,7 @@ */ #include +#include #include "bmem.h" #include "pipe.h" @@ -46,12 +47,18 @@ os_process_pipe_t *os_process_pipe_create(const char *cmd_line, return out; } -void os_process_pipe_destroy(os_process_pipe_t *pp) +int os_process_pipe_destroy(os_process_pipe_t *pp) { + int ret = 0; + if (pp) { - pclose(pp->file); + int status = pclose(pp->file); + if (WIFEXITED(status)) + ret = (int)(char)WEXITSTATUS(status); bfree(pp); } + + return ret; } size_t os_process_pipe_read(os_process_pipe_t *pp, uint8_t *data, size_t len) diff --git a/libobs/util/pipe-windows.c b/libobs/util/pipe-windows.c index 02a75c82a..eb5ac1cd5 100644 --- a/libobs/util/pipe-windows.c +++ b/libobs/util/pipe-windows.c @@ -24,6 +24,7 @@ struct os_process_pipe { bool read_pipe; HANDLE handle; + HANDLE process; }; static bool create_pipe(HANDLE *input, HANDLE *output) @@ -41,7 +42,7 @@ static bool create_pipe(HANDLE *input, HANDLE *output) } static inline bool create_proccess(const char *cmd_line, HANDLE stdin_handle, - HANDLE stdout_handle) + HANDLE stdout_handle, HANDLE *process) { PROCESS_INFORMATION pi = {0}; wchar_t *cmd_line_w = NULL; @@ -59,7 +60,7 @@ static inline bool create_proccess(const char *cmd_line, HANDLE stdin_handle, CREATE_NO_WINDOW, NULL, NULL, &si, &pi); if (success) { - CloseHandle(pi.hProcess); + *process = pi.hProcess; CloseHandle(pi.hThread); } @@ -74,6 +75,7 @@ os_process_pipe_t *os_process_pipe_create(const char *cmd_line, { os_process_pipe_t *pp = NULL; bool read_pipe; + HANDLE process; HANDLE output; HANDLE input; bool success; @@ -97,7 +99,7 @@ os_process_pipe_t *os_process_pipe_create(const char *cmd_line, } success = create_proccess(cmd_line, read_pipe ? NULL : input, - read_pipe ? output : NULL); + read_pipe ? output : NULL, &process); if (!success) { goto error; } @@ -105,6 +107,7 @@ os_process_pipe_t *os_process_pipe_create(const char *cmd_line, pp = bmalloc(sizeof(*pp)); pp->handle = read_pipe ? input : output; pp->read_pipe = read_pipe; + pp->process = process; CloseHandle(read_pipe ? output : input); return pp; @@ -115,12 +118,24 @@ error: return NULL; } -void os_process_pipe_destroy(os_process_pipe_t *pp) +int os_process_pipe_destroy(os_process_pipe_t *pp) { + int ret = 0; + if (pp) { + DWORD code; + CloseHandle(pp->handle); + + WaitForSingleObject(pp->process, INFINITE); + if (GetExitCodeProcess(pp->process, &code)) + ret = (int)code; + + CloseHandle(pp->process); bfree(pp); } + + return ret; } size_t os_process_pipe_read(os_process_pipe_t *pp, uint8_t *data, size_t len) diff --git a/libobs/util/pipe.h b/libobs/util/pipe.h index 299b6685c..cb595fdb1 100644 --- a/libobs/util/pipe.h +++ b/libobs/util/pipe.h @@ -23,7 +23,7 @@ typedef struct os_process_pipe os_process_pipe_t; EXPORT os_process_pipe_t *os_process_pipe_create(const char *cmd_line, const char *type); -EXPORT void os_process_pipe_destroy(os_process_pipe_t *pp); +EXPORT int os_process_pipe_destroy(os_process_pipe_t *pp); EXPORT size_t os_process_pipe_read(os_process_pipe_t *pp, uint8_t *data, size_t len);