Recreate base64 project
This commit is contained in:
		
							
								
								
									
										102
									
								
								wapp/core/os/shell/commander/commander.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								wapp/core/os/shell/commander/commander.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,102 @@
 | 
			
		||||
// vim:fileencoding=utf-8:foldmethod=marker
 | 
			
		||||
 | 
			
		||||
#include "commander.h"
 | 
			
		||||
#include "commander_output.h"
 | 
			
		||||
#include "../utils/shell_utils.h"
 | 
			
		||||
#include "../../../mem/arena/mem_arena_allocator.h"
 | 
			
		||||
#include "../../../../common/aliases/aliases.h"
 | 
			
		||||
#include "../../../../common/misc/misc_utils.h"
 | 
			
		||||
#include "../../../../primitives/dbl_list/dbl_list.h"
 | 
			
		||||
#include "../../../../primitives/mem_allocator/mem_allocator.h"
 | 
			
		||||
#include "../../../../primitives/strings/str8/str8.h"
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#define CMD_BUF_LEN 8192
 | 
			
		||||
#define OUT_BUF_LEN 4096
 | 
			
		||||
 | 
			
		||||
internal inline CMDResult execute_command(Str8RO *cmd, CMDOutHandling out_handling, Str8 *out_buf);
 | 
			
		||||
internal inline CMDError get_command_output(FILE *fp, CMDOutHandling out_handling, Str8 *out_buf);
 | 
			
		||||
 | 
			
		||||
CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_buf, const Str8List *cmd) {
 | 
			
		||||
  if (!cmd) {
 | 
			
		||||
    return CMD_NO_EXIT(SHELL_ERR_INVALID_ARGS);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Allocator arena = wapp_mem_arena_allocator_init(KB(500));
 | 
			
		||||
 | 
			
		||||
  Str8 *cmd_str = wapp_str8_join(&arena, cmd, &wapp_str8_lit_ro(" "));
 | 
			
		||||
  if (!cmd_str) {
 | 
			
		||||
    wapp_mem_arena_allocator_destroy(&arena);
 | 
			
		||||
    return CMD_NO_EXIT(SHELL_ERR_ALLOCATION_FAIL);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Redirect output
 | 
			
		||||
  cmd_str = wapp_str8_alloc_concat(&arena, cmd_str, &wapp_str8_lit_ro(" 2>&1"));
 | 
			
		||||
 | 
			
		||||
  CMDResult output = execute_command(cmd_str, out_handling, out_buf);
 | 
			
		||||
 | 
			
		||||
  wapp_mem_arena_allocator_destroy(&arena);
 | 
			
		||||
 | 
			
		||||
  return output;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
internal inline CMDResult execute_command(Str8RO *cmd, CMDOutHandling out_handling, Str8 *out_buf) {
 | 
			
		||||
  char cmd_buf[CMD_BUF_LEN] = {0};
 | 
			
		||||
  wapp_str8_copy_to_cstr(cmd_buf, cmd, CMD_BUF_LEN);
 | 
			
		||||
 | 
			
		||||
  FILE *fp = wapp_shell_utils_popen(cmd_buf, "r");
 | 
			
		||||
  if (!fp) {
 | 
			
		||||
    return CMD_NO_EXIT(SHELL_ERR_PROC_START_FAIL);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  CMDResult output;
 | 
			
		||||
 | 
			
		||||
  CMDError err = get_command_output(fp, out_handling, out_buf);
 | 
			
		||||
  if (err > SHELL_ERR_NO_ERROR) {
 | 
			
		||||
    output = CMD_NO_EXIT(err);
 | 
			
		||||
    goto EXECUTE_COMMAND_CLOSE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  i32 st = EXIT_SUCCESS;
 | 
			
		||||
  err = get_output_status(fp, &st);
 | 
			
		||||
  if (err > SHELL_ERR_NO_ERROR) {
 | 
			
		||||
    output = CMD_NO_EXIT(err);
 | 
			
		||||
    goto EXECUTE_COMMAND_CLOSE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Process is already closed in get_output_status
 | 
			
		||||
  fp = NULL;
 | 
			
		||||
 | 
			
		||||
  output = (CMDResult){
 | 
			
		||||
      .exited = true,
 | 
			
		||||
      .exit_code = st,
 | 
			
		||||
      .error = SHELL_ERR_NO_ERROR,
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
EXECUTE_COMMAND_CLOSE:
 | 
			
		||||
  if (fp) {
 | 
			
		||||
    wapp_shell_utils_pclose(fp);
 | 
			
		||||
  }
 | 
			
		||||
  return output;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
internal inline CMDError get_command_output(FILE *fp, CMDOutHandling out_handling, Str8 *out_buf) {
 | 
			
		||||
  Str8 out = wapp_str8_buf(OUT_BUF_LEN);
 | 
			
		||||
 | 
			
		||||
  out.size = fread((void *)out.buf, sizeof(u8), out.capacity, fp);
 | 
			
		||||
  if (out_handling == SHELL_OUTPUT_CAPTURE && out_buf != NULL) {
 | 
			
		||||
    if (out.size >= out_buf->capacity) {
 | 
			
		||||
      return SHELL_ERR_OUT_BUF_FULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    wapp_str8_concat_capped(out_buf, &out);
 | 
			
		||||
  } else if (out_handling == SHELL_OUTPUT_PRINT) {
 | 
			
		||||
    printf(WAPP_STR8_SPEC, wapp_str8_varg(out));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return SHELL_ERR_NO_ERROR;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								wapp/core/os/shell/commander/commander.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								wapp/core/os/shell/commander/commander.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
// vim:fileencoding=utf-8:foldmethod=marker
 | 
			
		||||
 | 
			
		||||
#ifndef COMMANDER_H
 | 
			
		||||
#define COMMANDER_H
 | 
			
		||||
 | 
			
		||||
#include "commander_output.h"
 | 
			
		||||
#include "../../../../common/aliases/aliases.h"
 | 
			
		||||
#include "../../../../common/platform/platform.h"
 | 
			
		||||
#include "../../../../primitives/strings/str8/str8.h"
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#ifdef WAPP_PLATFORM_CPP
 | 
			
		||||
BEGIN_C_LINKAGE
 | 
			
		||||
#endif // !WAPP_PLATFORM_CPP
 | 
			
		||||
 | 
			
		||||
#define CMD_NO_EXIT(ERR) ((CMDResult){.exited = false, .exit_code = EXIT_FAILURE, .error = ERR})
 | 
			
		||||
 | 
			
		||||
CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_buf, const Str8List *cmd);
 | 
			
		||||
 | 
			
		||||
external CMDError get_output_status(FILE *fp, i32 *status_out);
 | 
			
		||||
 | 
			
		||||
#ifdef WAPP_PLATFORM_CPP
 | 
			
		||||
END_C_LINKAGE
 | 
			
		||||
#endif // !WAPP_PLATFORM_CPP
 | 
			
		||||
 | 
			
		||||
#endif // !COMMANDER_H
 | 
			
		||||
							
								
								
									
										45
									
								
								wapp/core/os/shell/commander/commander_output.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								wapp/core/os/shell/commander/commander_output.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
// vim:fileencoding=utf-8:foldmethod=marker
 | 
			
		||||
 | 
			
		||||
#ifndef COMMANDER_OUTPUT_H
 | 
			
		||||
#define COMMANDER_OUTPUT_H
 | 
			
		||||
 | 
			
		||||
#include "../../../../common/aliases/aliases.h"
 | 
			
		||||
#include "../../../../common/platform/platform.h"
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
#ifdef WAPP_PLATFORM_CPP
 | 
			
		||||
BEGIN_C_LINKAGE
 | 
			
		||||
#endif // !WAPP_PLATFORM_CPP
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
  SHELL_OUTPUT_DISCARD,
 | 
			
		||||
  SHELL_OUTPUT_PRINT,
 | 
			
		||||
  SHELL_OUTPUT_CAPTURE,
 | 
			
		||||
} CMDOutHandling;
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
  SHELL_ERR_NO_ERROR,
 | 
			
		||||
  SHELL_ERR_INVALID_ARGS,
 | 
			
		||||
  SHELL_ERR_ALLOCATION_FAIL,
 | 
			
		||||
  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 "../../../../common/misc/misc_utils.h"
 | 
			
		||||
  wapp_misc_utils_padding_size(sizeof(bool) + sizeof(i32) + sizeof(CMDError));
 | 
			
		||||
#endif // !WAPP_PLATFORM_WINDOWS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifdef WAPP_PLATFORM_CPP
 | 
			
		||||
END_C_LINKAGE
 | 
			
		||||
#endif // !WAPP_PLATFORM_CPP
 | 
			
		||||
 | 
			
		||||
#endif // !COMMANDER_OUTPUT_H
 | 
			
		||||
							
								
								
									
										25
									
								
								wapp/core/os/shell/commander/posix/commander_posix.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								wapp/core/os/shell/commander/posix/commander_posix.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
// vim:fileencoding=utf-8:foldmethod=marker
 | 
			
		||||
 | 
			
		||||
#include "../../../../../common/aliases/aliases.h"
 | 
			
		||||
#include "../../../../../common/platform/platform.h"
 | 
			
		||||
 | 
			
		||||
#ifdef WAPP_PLATFORM_POSIX
 | 
			
		||||
 | 
			
		||||
#include "../commander_output.h"
 | 
			
		||||
#include "../../utils/shell_utils.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
							
								
								
									
										24
									
								
								wapp/core/os/shell/commander/win/commander_win.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								wapp/core/os/shell/commander/win/commander_win.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
// vim:fileencoding=utf-8:foldmethod=marker
 | 
			
		||||
 | 
			
		||||
#include "../../../../../common/aliases/aliases.h"
 | 
			
		||||
#include "../../../../../common/platform/platform.h"
 | 
			
		||||
 | 
			
		||||
#ifdef WAPP_PLATFORM_WINDOWS
 | 
			
		||||
 | 
			
		||||
#include "../commander_output.h"
 | 
			
		||||
#include "../../utils/shell_utils.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
		Reference in New Issue
	
	Block a user