diff --git a/src/common/shell/commander/commander.c b/src/common/shell/commander/commander.c index 64abeb5..5c7a6ed 100644 --- a/src/common/shell/commander/commander.c +++ b/src/common/shell/commander/commander.c @@ -11,11 +11,11 @@ #define OUT_BUF_LEN 4096 internal inline CMDError build_command_from_args(char *cmd, u64 buf_len, va_list args); -internal inline CMDResult execute_command(const char *cmd, CMDOutHandling out_handling, - char *out_buf, u64 buf_size); -internal inline CMDError get_command_output(FILE *fp, CMDOutHandling out_handling, - char *out_buf, u64 buf_size); -internal inline CMDError get_output_status(FILE *fp, i32 *status_out); +internal inline CMDResult execute_command(const char *cmd, CMDOutHandling out_handling, char *out_buf, + u64 buf_size); +internal inline CMDError get_command_output(FILE *fp, CMDOutHandling out_handling, char *out_buf, + u64 buf_size); +extern CMDError get_output_status(FILE *fp, i32 *status_out); CMDResult run_command(CMDOutHandling out_handling, char *out_buf, u64 buf_size, ...) { va_list args; @@ -117,25 +117,3 @@ internal inline CMDError get_command_output(FILE *fp, return SHELL_ERR_NO_ERROR; } - -internal inline CMDError get_output_status(FILE *fp, i32 *status_out) { -#ifdef WAPP_PLATFORM_WINDOWS - if (!feof(fp)) { - // Ensure process is closed on failure - wapp_shell_utils_pclose(fp); - return SHELL_ERR_PROC_EXIT_FAIL; - } -#endif /* ifdef WAPP_PLATFORM_WINDOWS */ - - *status_out = wapp_shell_utils_pclose(fp); - -#ifdef WAPP_PLATFORM_POSIX - if (!WIFEXITED(*status_out)) { - return SHELL_ERR_PROC_EXIT_FAIL; - } - - *status_out = WEXITSTATUS(*status_out); -#endif /* ifdef WAPP_PLATFORM_WINDOWS */ - - return SHELL_ERR_NO_ERROR; -} diff --git a/src/common/shell/commander/commander.h b/src/common/shell/commander/commander.h index 8110834..f301d24 100644 --- a/src/common/shell/commander/commander.h +++ b/src/common/shell/commander/commander.h @@ -2,7 +2,7 @@ #define COMMANDER_H #include "aliases.h" -#include "platform.h" +#include "commander_output.h" #include #include @@ -14,32 +14,6 @@ BEGIN_C_LINKAGE #define wapp_shell_commander_execute(HANDLE_OUTPUT, OUT_BUF, BUF_SIZE, ...) \ run_command(HANDLE_OUTPUT, OUT_BUF, BUF_SIZE, __VA_ARGS__, "2>&1", NULL) -typedef enum { - SHELL_OUTPUT_DISCARD, - SHELL_OUTPUT_PRINT, - SHELL_OUTPUT_CAPTURE, -} CMDOutHandling; - -typedef enum { - SHELL_ERR_NO_ERROR, - SHELL_ERR_CMD_BUF_FULL, - SHELL_ERR_PROC_START_FAIL, - SHELL_ERR_OUT_BUF_FULL, - SHELL_ERR_PROC_EXIT_FAIL, -} CMDError; - -typedef struct commander_result CMDResult; -struct commander_result { - i32 exit_code; - CMDError error; - bool exited; - -#ifdef WAPP_PLATFORM_WINDOWS - #include "misc_utils.h" - wapp_misc_utils_padding_size(sizeof(bool) + sizeof(i32) + sizeof(CMDError)); -#endif // !WAPP_PLATFORM_WINDOWS -}; - CMDResult run_command(CMDOutHandling out_handling, char *out_buf, u64 buf_size, ...); #ifdef __cplusplus diff --git a/src/common/shell/commander/commander_output.h b/src/common/shell/commander/commander_output.h new file mode 100644 index 0000000..91eff5e --- /dev/null +++ b/src/common/shell/commander/commander_output.h @@ -0,0 +1,42 @@ +#ifndef COMMANDER_OUTPUT_H +#define COMMANDER_OUTPUT_H + +#include "aliases.h" +#include "platform.h" +#include + +#ifdef __cplusplus +BEGIN_C_LINKAGE +#endif // __cplusplus + +typedef enum { + SHELL_OUTPUT_DISCARD, + SHELL_OUTPUT_PRINT, + SHELL_OUTPUT_CAPTURE, +} CMDOutHandling; + +typedef enum { + SHELL_ERR_NO_ERROR, + SHELL_ERR_CMD_BUF_FULL, + SHELL_ERR_PROC_START_FAIL, + SHELL_ERR_OUT_BUF_FULL, + SHELL_ERR_PROC_EXIT_FAIL, +} CMDError; + +typedef struct commander_result CMDResult; +struct commander_result { + i32 exit_code; + CMDError error; + bool exited; + +#ifdef WAPP_PLATFORM_WINDOWS + #include "misc_utils.h" + wapp_misc_utils_padding_size(sizeof(bool) + sizeof(i32) + sizeof(CMDError)); +#endif // !WAPP_PLATFORM_WINDOWS +}; + +#ifdef __cplusplus +END_C_LINKAGE +#endif // __cplusplus + +#endif // !COMMANDER_OUTPUT_H diff --git a/src/common/shell/commander/posix/commander_posix.c b/src/common/shell/commander/posix/commander_posix.c new file mode 100644 index 0000000..2f533de --- /dev/null +++ b/src/common/shell/commander/posix/commander_posix.c @@ -0,0 +1,23 @@ +#include "aliases.h" +#include "platform.h" + +#ifdef WAPP_PLATFORM_POSIX + +#include "commander_output.h" +#include "shell_utils.h" +#include +#include + +CMDError get_output_status(FILE *fp, i32 *status_out) { + *status_out = wapp_shell_utils_pclose(fp); + + if (!WIFEXITED(*status_out)) { + return SHELL_ERR_PROC_EXIT_FAIL; + } + + *status_out = WEXITSTATUS(*status_out); + + return SHELL_ERR_NO_ERROR; +} + +#endif // !WAPP_PLATFORM_POSIX diff --git a/src/common/shell/commander/win/commander_win.c b/src/common/shell/commander/win/commander_win.c new file mode 100644 index 0000000..e30f0fa --- /dev/null +++ b/src/common/shell/commander/win/commander_win.c @@ -0,0 +1,22 @@ +#include "aliases.h" +#include "platform.h" + +#ifdef WAPP_PLATFORM_WINDOWS + +#include "commander_output.h" +#include "shell_utils.h" +#include + +CMDError get_output_status(FILE *fp, i32 *status_out) { + if (!feof(fp)) { + // Ensure process is closed on failure + wapp_shell_utils_pclose(fp); + return SHELL_ERR_PROC_EXIT_FAIL; + } + + *status_out = wapp_shell_utils_pclose(fp); + + return SHELL_ERR_NO_ERROR; +} + +#endif // !WAPP_PLATFORM_WINDOWS