bunkum

an old and silly c99 web server with some fun features
Log | Files | Refs | README

commit f4fa844cfcb9703fbe0c11e4167f192169ddbae7
parent ed1ca93cc304623a7ed8e397ff0062e8f277f453
Author: quantumish <freifeld.david@gmail.com>
Date:   Sun,  9 Apr 2023 02:04:43 -0700

Clean up code, add logging

Diffstat:
Mhttp.c | 33+++++++++------------------------
Mutils/log.c | 32+++++++++++++++-----------------
Mutils/time.c | 55++++---------------------------------------------------
3 files changed, 28 insertions(+), 92 deletions(-)

diff --git a/http.c b/http.c @@ -21,11 +21,6 @@ #include "utils/shitvec.h" #include "http/response.h" -void die(char* p) { - perror(p); - exit(1); -} - void scuffed_htmlescape(char* dst, char* src, size_t sz) { strcpy(dst, "<pre>\n"); int offset = 6; @@ -57,11 +52,13 @@ void* handle_conn(void* ctxt) { char pathbuf[MAX_PATH_SZ]; char msgbuf[512] = {0}; while(true) { - if (recv(ns, msgbuf, 512, 0) == 0) return 0x0; + if (recv(ns, msgbuf, 512, 0) == 0) { + log_info("Closing connection."); + return 0x0; + } if (strlen(msgbuf) > 0) { - printf("%s", msgbuf); sscanf(msgbuf, "GET %s HTTP/1.1", (char*)&pathbuf); - printf("%s\n\n", pathbuf); + log_info("Got request for %s", pathbuf); int fd = open(pathbuf+1, O_RDONLY); if (fd != -1) { @@ -72,7 +69,6 @@ void* handle_conn(void* ctxt) { char* fbuf = malloc(st.st_size); size_t i; for (i = 0; read(fd, fbuf+(i*4096), 4096) > 0; i++); - printf("%ld\n", i); bool escape = false; bool compression = true; @@ -97,10 +93,10 @@ void* handle_conn(void* ctxt) { resp_add_hdr(&r, "Last-Modified", datebuf); if (escape) { - char* efbuf = malloc((size_t)(st.st_size * 2)); // FIXME dubious assumption + char* efbuf = malloc((size_t)(st.st_size * 2)); // FIXME dubious assumption scuffed_htmlescape(efbuf, fbuf, st.st_size); free(fbuf); - resp_add_content(&r, fbuf, strlen(efbuf)); + resp_add_content(&r, efbuf, strlen(efbuf)); free(efbuf); } else if (compression) { resp_add_hdr(&r, "Content-Encoding", "deflate"); @@ -114,7 +110,6 @@ void* handle_conn(void* ctxt) { resp_add_content(&r, fbuf, st.st_size); } send(ns, r.content, r.sz, 0); - printf("%s\n", r.content); free(r.content); } else { response_t r = __resp_new(NotFound, "Fuck off."); @@ -123,19 +118,12 @@ void* handle_conn(void* ctxt) { send(ns, r.content, r.sz, 0); free(r.content); } - printf("Done.\n"); + log_info("Handled request for %s", pathbuf); } } } int main() { - log_trace("am i ever gonna use this"); - log_debug("%d too many errors", 1); - log_info("uhhh hi %s", "world"); - log_warn("listen here %s", "buckaroo"); - log_error("that wasn't good"); - log_fatal("AAAAAA"); - int s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) die("socket"); @@ -151,10 +139,6 @@ int main() { } } - shitvec_t paths = shitvec_new(MAX_PATH_SZ); - shitvec_subpush(&paths, "hi", 4); - shitvec_subpush(&paths, "http.c", 6); - int namelen; char pathbuf[MAX_PATH_SZ]; struct sockaddr_in client; @@ -163,6 +147,7 @@ int main() { listen(s, 1); int ns = accept(s, (struct sockaddr*)&client, (socklen_t*)&namelen); + log_info("Handling connection from %s", inet_ntoa(client.sin_addr)); pthread_t thread; pthread_create(&thread, NULL, handle_conn, &ns); } diff --git a/utils/log.c b/utils/log.c @@ -1,6 +1,9 @@ #include <stdio.h> #include <stdarg.h> #include <time.h> +#include <errno.h> +#include <string.h> +#include <stdlib.h> #include "log.h" @@ -15,22 +18,8 @@ #define ANSI_MAGENTA "\x1b[36m" #define ANSI_RESET "\x1b[0m" -char* lvl_to_color(enum log_level lvl) { - switch (lvl) { - case LOG_TRACE: - return ANSI_MAGENTA; - case LOG_DEBUG: - return ANSI_GREEN; - case LOG_INFO: - return ANSI_CYAN; - case LOG_WARN: - return ANSI_YELLOW; - case LOG_ERROR: - return ANSI_RED; - case LOG_FATAL: - return ANSI_BOLDRED; - } -} +const char* lvl_colors = + {ANSI_MAGENTA, ANSI_GREEN, ANSI_CYAN, ANSI_YELLOW, ANSI_RED, ANSI_BOLDRED}; size_t log_min_level = 0; @@ -46,10 +35,19 @@ void log_msg(enum log_level lvl, char* lvl_name, char* fmt, ...) { time_t now = time(0); struct tm* local = localtime(&now); - char* lvl_color = lvl_to_color(lvl); + char* lvl_color = lvl_colors[lvl]; printf(ANSI_GREY "%02d/%02d/%02d %02d:%02d:%02d %s%s" ANSI_RESET ": %s\n", local->tm_mon, local->tm_mday, local->tm_year, local->tm_hour, local->tm_min, local->tm_sec, lvl_color, lvl_name, msg); } + +void log_set_min_lvl(enum log_level lvl) { + log_min_level = lvl; +} + +void die(char* p) { + log_fatal("(%s) %s", p, strerror(errno)); + exit(1); +} diff --git a/utils/time.c b/utils/time.c @@ -2,60 +2,13 @@ #include "time.h" -char* day_to_str(int day) { - switch (day) { - case 0: - return "Sun"; - case 1: - return "Mon"; - case 2: - return "Tue"; - case 3: - return "Wed"; - case 4: - return "Thu"; - case 5: - return "Fri"; - case 6: - return "Sat"; - } - return "Wat"; -} - -char* mon_to_str(int mon) { - switch (mon) { - case 0: - return "Jan"; - case 1: - return "Feb"; - case 2: - return "Mar"; - case 3: - return "Apr"; - case 4: - return "May"; - case 5: - return "Jun"; - case 6: - return "Jul"; - case 7: - return "Aug"; - case 8: - return "Sep"; - case 9: - return "Oct"; - case 10: - return "Nov"; - case 11: - return "Dec"; - } - return "Wat"; -} - +const char* days[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; +const char* months[] = + {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; void time_to_str(time_t t, char* buf) { struct tm* gmt = gmtime(&t); sprintf(buf, "%s, %02d %s %d %02d:%02d:%02d GMT", - day_to_str(gmt->tm_wday), gmt->tm_mday, mon_to_str(gmt->tm_mon), + days[gmt->tm_wday], gmt->tm_mday, months[gmt->tm_mon], gmt->tm_year + 1900, gmt->tm_hour, gmt->tm_min, gmt->tm_sec); }