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:
| M | http.c | | | 33 | +++++++++------------------------ |
| M | utils/log.c | | | 32 | +++++++++++++++----------------- |
| M | utils/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);
}