From b85c64b441e560f27f87fa26381600c2cbfe17b8 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Wed, 23 Sep 2020 14:32:52 -0400 Subject: [PATCH] Generalize logging --- configure | 2 ++ include/log.h | 10 +++++++++ src/log.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/server.c | 33 +++++----------------------- 4 files changed, 78 insertions(+), 28 deletions(-) create mode 100644 include/log.h create mode 100644 src/log.c diff --git a/configure b/configure index fd6c84c..0849445 100755 --- a/configure +++ b/configure @@ -7,8 +7,10 @@ gmnisrv() { src/config.c \ src/escape.c \ src/ini.c \ + src/log.c \ src/main.c \ src/server.c \ + src/tls.c \ src/url.c } diff --git a/include/log.h b/include/log.h new file mode 100644 index 0000000..3f3f964 --- /dev/null +++ b/include/log.h @@ -0,0 +1,10 @@ +#ifndef GMNISRV_LOG +#define GMNISRV_LOG +#include + +void server_log(const char *fmt, ...); +void client_log(struct sockaddr *addr, const char *fmt, ...); +void server_error(const char *fmt, ...); +void client_error(struct sockaddr *addr, const char *fmt, ...); + +#endif diff --git a/src/log.c b/src/log.c new file mode 100644 index 0000000..d4d4e2a --- /dev/null +++ b/src/log.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include "log.h" + +static void +server_logf(FILE *f, const char *fmt, va_list ap) +{ + fprintf(f, "\t"); + vfprintf(f, fmt, ap); +} + +static void +client_logf(FILE *f, struct sockaddr *addr, const char *fmt, va_list ap) +{ + char abuf[INET6_ADDRSTRLEN]; + const char *addrs = inet_ntop(addr->sa_family, + addr->sa_data, abuf, sizeof(abuf)); + assert(addrs); + + fprintf(f, "%s\t", addrs); + vfprintf(f, fmt, ap); +} + +void +server_log(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + server_logf(stdout, fmt, ap); + va_end(ap); +} + +void +client_log(struct sockaddr *addr, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + client_logf(stdout, addr, fmt, ap); + va_end(ap); +} + +void +server_error(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + server_logf(stderr, fmt, ap); + va_end(ap); +} + +void +client_error(struct sockaddr *addr, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + client_logf(stderr, addr, fmt, ap); + va_end(ap); +} diff --git a/src/server.c b/src/server.c index 833cc08..4a54867 100644 --- a/src/server.c +++ b/src/server.c @@ -2,7 +2,6 @@ #include #include #include -#include #include #include #include @@ -11,6 +10,7 @@ #include #include "config.h" #include "server.h" +#include "log.h" int server_init(struct gmnisrv_server *server, struct gmnisrv_config *conf) @@ -82,27 +82,6 @@ server_init(struct gmnisrv_server *server, struct gmnisrv_config *conf) return 0; } -// XXX: May be worth moving log stuff into a common module somewhere -static void -client_log(struct sockaddr *addr, const char *fmt, ...) -{ - char abuf[INET6_ADDRSTRLEN]; - static char buf[INET6_ADDRSTRLEN + 1 + 4096]; - - const char *addrs = inet_ntop(addr->sa_family, - addr->sa_data, abuf, sizeof(abuf)); - assert(addrs); - - va_list ap; - - va_start(ap, fmt); - size_t n = vsnprintf(buf, sizeof(buf), fmt, ap); - assert(n > 0); - va_end(ap); - - fprintf(stderr, "%s\t%s\n", addrs, buf); -} - static struct pollfd * alloc_pollfd(struct gmnisrv_server *server) { @@ -137,7 +116,7 @@ accept_client(struct gmnisrv_server *server, int fd) struct gmnisrv_client *new = realloc(server->clients, clientsz * sizeof(struct gmnisrv_client)); if (!new) { - client_log(&addr, "disconnecting due to OOM condition"); + client_error(&addr, "disconnecting due to OOM condition"); close(sockfd); return; } @@ -147,7 +126,7 @@ accept_client(struct gmnisrv_server *server, int fd) struct pollfd *pollfd = alloc_pollfd(server); if (pollfd == NULL) { - client_log(&addr, "disconnecting due to OOM condition"); + client_error(&addr, "disconnecting due to OOM condition"); close(sockfd); return; } @@ -158,13 +137,11 @@ accept_client(struct gmnisrv_server *server, int fd) memcpy(&client->addr, &addr, addrlen); pollfd->fd = sockfd; pollfd->events = POLLIN; - client_log(&client->addr, "connected"); } static void disconnect_client(struct gmnisrv_server *server, struct gmnisrv_client *client) { - client_log(&client->addr, "disconnected"); close(client->sockfd); size_t index = (client - server->clients) / sizeof(struct gmnisrv_client); memmove(client, &client[1], &server->clients[server->clientsz] - client); @@ -232,7 +209,7 @@ server_run(struct gmnisrv_server *server) accept_client(server, server->fds[i].fd); } if ((server->fds[i].revents & POLLERR)) { - fprintf(stderr, "\tError on listener poll\n"); + server_error("Error on listener poll"); server->run = false; } } @@ -252,7 +229,7 @@ server_run(struct gmnisrv_server *server) } } while (server->run); - fprintf(stderr, "\tTerminating.\n"); + server_log("Terminating."); r = sigaction(SIGINT, &oint, NULL); assert(r == 0);