From 597d6ec73ad7f2c0a8e6a6b59b6424f86027b7a9 Mon Sep 17 00:00:00 2001 From: Romain de Laage Date: Mon, 28 Dec 2020 18:53:24 +0100 Subject: [PATCH] Refacto --- Makefile | 10 ++++++++ src/gemcurl.c | 14 +++++++++-- src/gemlib.c | 66 +++++++++++++++++++++++---------------------------- src/gemlib.h | 15 ++++++------ 4 files changed, 59 insertions(+), 46 deletions(-) diff --git a/Makefile b/Makefile index bda4bc0..bf68632 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,8 @@ CC=gcc all: gemcurl +debug: gemcurl_debug + gemlib.o: src/gemlib.c src/gemlib.h mkdir -p build $(CC) -o build/gemlib.o -c src/gemlib.c @@ -10,6 +12,14 @@ gemcurl.o: src/gemlib.h src/gemcurl.c mkdir -p build $(CC) -o build/gemcurl.o -c src/gemcurl.c +gemcurl_debug.o: src/gemlib.h src/gemcurl.c + mkdir -p build + $(CC) -o build/gemcurl_debug.o -c src/gemcurl.c -DDEBUG + gemcurl: gemcurl.o gemlib.o mkdir -p build $(CC) -o build/gemcurl build/gemcurl.o build/gemlib.o -lcrypto -lssl + +gemcurl_debug: gemcurl_debug.o gemlib.o + mkdir -p build + $(CC) -o build/gemcurl_debug build/gemcurl_debug.o build/gemlib.o -lcrypto -lssl diff --git a/src/gemcurl.c b/src/gemcurl.c index 4382bea..0afbe2f 100644 --- a/src/gemcurl.c +++ b/src/gemcurl.c @@ -5,7 +5,7 @@ #include "gemlib.h" #define VERSION_MAJ 0 -#define VERSION_MIN 0 +#define VERSION_MIN 1 #define VERSION_REV 0 #define NAME "gemcurl" @@ -17,6 +17,8 @@ void printHelp(void); int main (int argc, char **argv) { + GEM_Request *request; + if (argc < 2) { printUsage(argv[0]); @@ -55,9 +57,17 @@ int main (int argc, char **argv) return EXIT_FAILURE; } - if (getGem(argv[2], stdout) != 0) + request = GEM_new_request(argv[2]); + +#ifdef DEBUG + GEM_print_request_info(request); +#endif + + if (GEM_send_request(request, stdout) != 0) return EXIT_FAILURE; + GEM_free_request(request); + return EXIT_SUCCESS; } diff --git a/src/gemlib.c b/src/gemlib.c index c8ee7b7..6be25ad 100644 --- a/src/gemlib.c +++ b/src/gemlib.c @@ -9,15 +9,21 @@ #include "gemlib.h" -Request *examineRequest(const char *request_content) +void GEM_init (void) +{ + SSL_load_error_strings(); + SSL_library_init(); +} + +GEM_Request *GEM_new_request(const char *request_content) { int i = 0, len = 0, len_req = strlen(request_content); - Request *request = malloc(sizeof(Request)); + GEM_Request *request = malloc(sizeof(GEM_Request)); if (request == NULL) return NULL; - memset(request, 0, sizeof(Request)); + memset(request, 0, sizeof(GEM_Request)); strcpy(request->request_content, request_content); strcat(request->request_content, "\r\n"); @@ -72,19 +78,25 @@ Request *examineRequest(const char *request_content) return request; } -void requestTheServer(Request *request, FILE *answerFile) +void GEM_print_request_info (GEM_Request *request) +{ + printf("Request content : %s\nRequest scheme : %s\nRequest hostname : %s\nRequest path : %s\n", request->request_content, request->scheme, request->hostname, request->path); +} + +int GEM_send_request (GEM_Request *request, FILE *answerFile) { const SSL_METHOD *method = TLS_client_method(); SSL *ssl = NULL; SSL_CTX *ctx = NULL; BIO *bio = NULL; int n; + char buffer[1024]; if (method == NULL) { perror("Method"); ERR_print_errors_fp(stderr); - exit(1); + return -1; } ctx = SSL_CTX_new(method); @@ -93,7 +105,7 @@ void requestTheServer(Request *request, FILE *answerFile) { perror("ctx"); ERR_print_errors_fp(stderr); - exit(2); + return -1; } bio = BIO_new_ssl_connect(ctx); @@ -103,7 +115,7 @@ void requestTheServer(Request *request, FILE *answerFile) perror("bio"); ERR_print_errors_fp(stderr); SSL_CTX_free(ctx); - exit(3); + return -1; } BIO_get_ssl(bio, &ssl); @@ -116,44 +128,26 @@ void requestTheServer(Request *request, FILE *answerFile) SSL_CTX_free(ctx); perror("bio connect"); ERR_print_errors_fp(stderr); - exit(4); + return -1; } BIO_puts(bio, request->request_content); - while (1) + n = BIO_read(bio, buffer, 1023); + + while (n > 0) { - memset(request->answer_content, 0, sizeof(request->answer_content)); - n = BIO_read(bio, request->answer_content, 1024); - if (n <= 0) break; - fprintf(answerFile, "%s", request->answer_content); + fwrite(buffer, sizeof(char), n, answerFile); + n = BIO_read(bio, buffer, 1024); } BIO_free_all(bio); SSL_CTX_free(ctx); -} - -void initSSL (void) -{ - SSL_load_error_strings(); - SSL_library_init(); -} - -int getGem (const char *URL, FILE *answerFile) -{ - Request *request = examineRequest(URL); - - initSSL(); - - if (request == NULL) - { - printf("error during url parsing\n"); - return 1; - } - - requestTheServer(request, answerFile); - - free(request); return 0; } + +void GEM_free_request (GEM_Request *request) +{ + free(request); +} diff --git a/src/gemlib.h b/src/gemlib.h index e471512..11abe84 100644 --- a/src/gemlib.h +++ b/src/gemlib.h @@ -6,17 +6,16 @@ typedef struct _gemini_request { char hostname[256]; char scheme[64]; char path[1024]; - char answer_code[2]; - char answer_meta[2]; - char answer_content[8192]; -} Request; +} GEM_Request; -Request *examineRequest(const char *request_content); +void GEM_init (void); -void requestTheServer(Request *request, FILE *answerFile); +GEM_Request *GEM_new_request(const char *request_content); -void initSSL (void); +void GEM_print_request_info (GEM_Request *request); -int getGem (const char *URL, FILE *answerFile); +int GEM_send_request (GEM_Request *request, FILE *answerFile); + +void GEM_free_request (GEM_Request *request); #endif