119 lines
2.5 KiB
C
119 lines
2.5 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <stdarg.h>
|
|
|
|
#include "c_cross_pack/libs/threads.h"
|
|
|
|
#define CL_RED "\033[1;31m"
|
|
#define CL_YELLOW "\033[1;33m"
|
|
#define CL_GREEN "\033[1;32m"
|
|
#define CL_NORMAL "\033[1;0m"
|
|
|
|
char comment[1000] = "";
|
|
char command[10000] = "";
|
|
|
|
// Output of command execution
|
|
char out[1000][100];
|
|
int out_i = 0;
|
|
|
|
bool runCommand(char* command) {
|
|
FILE *fp;
|
|
char path[1024];
|
|
int status;
|
|
|
|
// Catch stdout and stderr
|
|
char fullCommand[1024];
|
|
snprintf(fullCommand, sizeof(fullCommand), "%s 2>&1", command);
|
|
|
|
// Open the command for reading
|
|
fp = popen(fullCommand, "r");
|
|
if (fp == NULL) {
|
|
printf("Failed to run command\n");
|
|
return false;
|
|
}
|
|
|
|
// Read the output a line at a time and store it in the out array
|
|
while (fgets(path, sizeof(path), fp) != NULL) {
|
|
strncpy(out[out_i], path, 100);
|
|
out[out_i][99] = '\0'; // Ensure null termination
|
|
out_i++;
|
|
if (out_i >= 1000) {
|
|
break; // Prevent overflow
|
|
}
|
|
}
|
|
|
|
/* Close */
|
|
status = pclose(fp);
|
|
|
|
/* Check the return status of the command */
|
|
if (WIFEXITED(status)) {
|
|
int exit_status = WEXITSTATUS(status);
|
|
if (exit_status != 0) {
|
|
return false; // Command failed
|
|
}
|
|
} else {
|
|
return false; // Command did not exit normally
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void* loadAnim() {
|
|
char anim[] = {'-', '\\', '|', '/'};
|
|
while (true) {
|
|
for (size_t i = 0; i < sizeof(anim)/sizeof(anim[0]); i++) {
|
|
printf("\r[%s%c%s] %s", CL_YELLOW, anim[i], CL_NORMAL, comment);
|
|
fflush(stdout);
|
|
usleep(100 * 1000); // 100 ms
|
|
}
|
|
}
|
|
}
|
|
|
|
void getOut() {
|
|
for (int i = 0; i <= out_i; i++) {
|
|
printf("%s", out[i]);
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
bool isCommand = false; // Flag for detect command section
|
|
bool forceOut = false;
|
|
for(int i = 1; i < argc; i++) {
|
|
if (isCommand == false) {
|
|
if (strcmp(argv[i], "%o") == 0) {
|
|
isCommand = true;
|
|
forceOut = true;
|
|
} else if (strcmp(argv[i], "%%") == 0) {
|
|
isCommand = true;
|
|
} else {
|
|
strcat(comment, argv[i]);
|
|
strcat(comment, " ");
|
|
}
|
|
} else {
|
|
strcat(command, argv[i]);
|
|
strcat(command, " ");
|
|
}
|
|
}
|
|
|
|
void* thread_handle;
|
|
start_thread(&thread_handle, loadAnim);
|
|
if (runCommand(command)) {
|
|
kill_thread(thread_handle);
|
|
printf("\r[%s🗸%s] %s\n", CL_GREEN, CL_NORMAL, comment);
|
|
if (forceOut == true) {
|
|
getOut();
|
|
}
|
|
} else {
|
|
kill_thread(thread_handle);
|
|
printf("\r[%s𐄂%s] %s\n", CL_RED, CL_NORMAL, comment);
|
|
// Get out of failed command
|
|
getOut();
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|