diff --git a/Makefile b/Makefile index 1c465fe..6ddc454 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ CC ?= gcc CFLAGS ?=-Wall -DLIBPCRE -g $(CFLAGS_COV) LIBS=-lm -lpcre2-8 -OBJS=sslh-conf.o common.o sslh-main.o probe.o tls.o argtable3.o udp-listener.o collection.o gap.o +OBJS=sslh-conf.o common.o log.o sslh-main.o probe.o tls.o argtable3.o udp-listener.o collection.o gap.o CONDITIONAL_TARGETS= diff --git a/common.c b/common.c index 453e271..2758c06 100644 --- a/common.c +++ b/common.c @@ -4,7 +4,6 @@ * No code here should assume whether sockets are blocking or not. **/ -#define SYSLOG_NAMES #define _GNU_SOURCE #include #include @@ -42,8 +41,6 @@ struct sslhcfg_item cfg; struct addrinfo *addr_listen = NULL; /* what addresses do we listen to? */ -static int do_syslog = 1; /* Should we syslog? controled by syslog_facility = "none" */ - #ifdef LIBWRAP #include int allow_severity =0, deny_severity = 0; @@ -590,23 +587,6 @@ void resolve_name(struct addrinfo **out, char* fullname) } } -/* Log to syslog or stderr if foreground */ -void log_message(int type, const char* msg, ...) -{ - va_list ap; - - va_start(ap, msg); - if (cfg.foreground) - vfprintf(stderr, msg, ap); - va_end(ap); - - if (do_syslog) { - va_start(ap, msg); - vsyslog(type, msg, ap); - va_end(ap); - } -} - /* Fills a connection description; returns 0 on failure */ int get_connection_desc(struct connection_desc* desc, const struct connection *cnx) @@ -641,30 +621,6 @@ int get_connection_desc(struct connection_desc* desc, const struct connection *c return 1; } -/* syslogs who connected to where - * desc: string description of the connection. if NULL, log_connection will - * manage on its own - * cnx: connection descriptor - * */ -void log_connection(struct connection_desc* desc, const struct connection *cnx) -{ - struct connection_desc d; - - if (cnx->proto->log_level < 1) - return; - - if (!desc) { - desc = &d; - get_connection_desc(desc, cnx); - } - - log_message(LOG_INFO, "%s:connection from %s to %s forwarded from %s to %s\n", - cnx->proto->name, - desc->peer, - desc->service, - desc->local, - desc->target); -} void set_proctitle_shovel(struct connection_desc* desc, const struct connection *cnx) { @@ -760,35 +716,6 @@ void setup_signals(void) } -/* Open syslog connection with appropriate banner; - * banner is made up of basename(bin_name)+"[pid]" */ -void setup_syslog(const char* bin_name) { - char *name1, *name2; - int res, fn; - - if (!strcmp(cfg.syslog_facility, "none")) { - do_syslog = 0; - return; - } - - name1 = strdup(bin_name); - res = asprintf(&name2, "%s[%d]", basename(name1), getpid()); - CHECK_RES_DIE(res, "asprintf"); - - for (fn = 0; facilitynames[fn].c_val != -1; fn++) - if (strcmp(facilitynames[fn].c_name, cfg.syslog_facility) == 0) - break; - if (facilitynames[fn].c_val == -1) { - fprintf(stderr, "Unknown facility %s\n", cfg.syslog_facility); - exit(1); - } - - openlog(name2, LOG_CONS, facilitynames[fn].c_val); - free(name1); - /* Don't free name2, as openlog(3) uses it (at least in glibc) */ - - log_message(LOG_INFO, "%s %s started\n", server_type, VERSION); -} /* Ask OS to keep capabilities over a setuid(nonzero) */ void set_keepcaps(int val) { diff --git a/log.c b/log.c new file mode 100644 index 0000000..fea3d65 --- /dev/null +++ b/log.c @@ -0,0 +1,106 @@ +/* +# log: processing of all outgoing messages +# +# Copyright (C) 2007-2021 Yves Rutschle +# +# This program is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more +# details. +# +# The full text for the General Public License is here: +# http://www.gnu.org/licenses/gpl.html + +*/ + + +#define SYSLOG_NAMES +#define _GNU_SOURCE +#include +#include +#include "sslh-conf.h" +#include "common.h" +#include "log.h" + +static int do_syslog = 1; /* Should we syslog? controled by syslog_facility = "none" */ + +/* Open syslog connection with appropriate banner; + * banner is made up of basename(bin_name)+"[pid]" */ +void setup_syslog(const char* bin_name) { + char *name1, *name2; + int res, fn; + + if (!strcmp(cfg.syslog_facility, "none")) { + do_syslog = 0; + return; + } + + name1 = strdup(bin_name); + res = asprintf(&name2, "%s[%d]", basename(name1), getpid()); + CHECK_RES_DIE(res, "asprintf"); + + for (fn = 0; facilitynames[fn].c_val != -1; fn++) + if (strcmp(facilitynames[fn].c_name, cfg.syslog_facility) == 0) + break; + if (facilitynames[fn].c_val == -1) { + fprintf(stderr, "Unknown facility %s\n", cfg.syslog_facility); + exit(1); + } + + openlog(name2, LOG_CONS, facilitynames[fn].c_val); + free(name1); + /* Don't free name2, as openlog(3) uses it (at least in glibc) */ + + log_message(LOG_INFO, "%s %s started\n", server_type, VERSION); +} + + +/* Log to syslog or stderr if foreground */ +void log_message(int type, const char* msg, ...) +{ + va_list ap; + + va_start(ap, msg); + if (cfg.foreground) + vfprintf(stderr, msg, ap); + va_end(ap); + + if (do_syslog) { + va_start(ap, msg); + vsyslog(type, msg, ap); + va_end(ap); + } +} + + +/* syslogs who connected to where + * desc: string description of the connection. if NULL, log_connection will + * manage on its own + * cnx: connection descriptor + * */ +void log_connection(struct connection_desc* desc, const struct connection *cnx) +{ + struct connection_desc d; + + if (cnx->proto->log_level < 1) + return; + + if (!desc) { + desc = &d; + get_connection_desc(desc, cnx); + } + + log_message(LOG_INFO, "%s:connection from %s to %s forwarded from %s to %s\n", + cnx->proto->name, + desc->peer, + desc->service, + desc->local, + desc->target); +} diff --git a/log.h b/log.h new file mode 100644 index 0000000..4bd85e1 --- /dev/null +++ b/log.h @@ -0,0 +1,10 @@ +#ifndef LOG_H +#define LOG_H + +void setup_syslog(const char* bin_name); + +void log_message(int type, const char* msg, ...); + +void log_connection(struct connection_desc* desc, const struct connection *cnx); + +#endif /* LOG_H */