This commit is contained in:
justuser-31 2025-02-14 17:30:45 +03:00
parent 4bf0faca2a
commit 291bbe6287
4 changed files with 123 additions and 0 deletions

11
demo.sh Executable file
View File

@ -0,0 +1,11 @@
#!/bin/bash
shopt -s expand_aliases
alias rt="./rtracker"
rt Testing sleep... \
% sleep 3
rt Hello world? \
%o echo Hello world
rt Producing some error \
% rm not_exist

BIN
rtracker Executable file

Binary file not shown.

112
rtracker.c Normal file
View File

@ -0,0 +1,112 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include "c_cross_pack/libs/threads.h"
char comment[1000] = "";
char command[10000] = "";
// Out of command execution
char out[1000][100];
int out_i = 0;
bool runCommand(char* command) {
FILE *fp;
char path[1024];
int status;
// Combine stdout and stderr using 2>&1
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[\033[1;33m%c\033[1;0m] %s", anim[i], 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;
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[\033[1;32m🗸\033[1;0m] %s\n", comment);
if (forceOut == true) {
getOut();
}
} else {
kill_thread(thread_handle);
printf("\r[\033[1;31m𐄂\033[1;0m] %s\n", comment);
// Get out of failed command
getOut();
return 1;
}
return 0;
}

0
test Normal file
View File