From bdafb30b0a68edd0ddf308d793193d781c2de303 Mon Sep 17 00:00:00 2001 From: Michael Thomson Date: Sat, 10 Feb 2024 10:13:37 -0500 Subject: [PATCH] better file reading and cleanup --- server | Bin 78304 -> 78184 bytes server.c | 60 ++++++++++++++++++++++++++++++------------------------- server.h | 8 -------- 3 files changed, 33 insertions(+), 35 deletions(-) diff --git a/server b/server index 3fe46c02f5d60d0c1dc40248b4397588b70122a4..1d595ce1323237853bdc1849dfbabd5aa03339a4 100755 GIT binary patch literal 78184 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 literal 78304 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 LZ;`kI>+k;s?<_90 diff --git a/server.c b/server.c index e478da1..805c02e 100644 --- a/server.c +++ b/server.c @@ -90,24 +90,40 @@ static void start(const char *PORT) { } } -size_t read_file(char *buf, char *filename) { - FILE *fptr = fopen(filename, "r"); +char *read_file(char *filename, size_t *file_size) { + // read in file + FILE *fp = fopen(filename, "r"); + if (fp == NULL) { + fprintf(stderr, "read_file: error opening file: %s\n", filename); + return NULL; + } // Calculate the content length - fseek(fptr, 0, SEEK_END); - size_t body_length = ftell(fptr); - rewind(fptr); + fseek(fp, 0, SEEK_END); + *file_size = ftell(fp); + rewind(fp); - // Read in file - if (fread(buf, 1, body_length, fptr) == 0) { - fprintf(stderr, "fread: unable to read file contents"); - exit(1); + // allocate memory for file contents + char *buffer = malloc(*file_size + 1); + if (buffer == NULL) { + fprintf(stderr, "read_file: memory allocation failed.\n"); + fclose(fp); + return NULL; } - buf[body_length] = '\0'; // terminate string - - fclose(fptr); - - return body_length; + + // Read the file contents into buffer + size_t bytes_read = fread(buffer, 1, *file_size, fp); + if (bytes_read != *file_size) { + fprintf(stderr, "read_file: error reading file.\n"); + free(buffer); + fclose(fp); + return NULL; + } + + fclose(fp); + buffer[*file_size] = '\0'; + + return buffer; } void respond(int *client_fd) { @@ -127,10 +143,9 @@ void respond(int *client_fd) { } else { filename = "404.html"; } - - // read in file and get length - char *body = malloc(MAX_BUFFER_SIZE); - size_t body_length = read_file(body, filename); + + size_t body_length; + char *body = read_file(filename, &body_length); // Create the Content-Length header struct Header headers[MAX_HEADER_NUM]; @@ -146,8 +161,6 @@ void respond(int *client_fd) { char response_string[MAX_BUFFER_SIZE]; response_to_string(response_string, &response); - printf("%s", response_string); - if (send(*client_fd, response_string, strlen(response_string), 0) == -1) { perror("send content"); exit(1); @@ -170,13 +183,6 @@ void launch(struct Server *server) { continue; } - char name[INET6_ADDRSTRLEN]; - char port[10]; - getnameinfo((struct sockaddr *)&client_addr, client_addr_len, name, - sizeof(name), port, sizeof(port), - NI_NUMERICHOST | NI_NUMERICSERV); - printf("New connection from: %s:%s\n", name, port); - if (!fork()) { close(sockfd); respond(&client_fd); diff --git a/server.h b/server.h index bf3f77f..c7ff4af 100644 --- a/server.h +++ b/server.h @@ -5,14 +5,6 @@ #define BACKLOG 128 -#define GET "GET"; -#define POST "POST"; - -struct Route { - char *path; - char *method; -}; - struct Server { const char *PORT; };