diff --git a/Makefile b/Makefile index 0bf804a..986cf1c 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,8 @@ -# Configuration VERSION=$(shell ./genver.sh -r) + +# Configuration -- you probably need to `make clean` if you +# change any of these ENABLE_REGEX=1 # Enable regex probes USELIBCONFIG=1 # Use libconfig? (necessary to use configuration files) USELIBPCRE=1 # Use libpcre? (needed for regex on musl) diff --git a/doc/INSTALL.md b/doc/INSTALL.md index 79e2e66..5ae411b 100644 --- a/doc/INSTALL.md +++ b/doc/INSTALL.md @@ -42,7 +42,7 @@ For Fedora, you'll need packages `libconfig` and If you want to rebuild `sslh-conf.c` (after a `make distclean` for example), you will also need to add [conf2struct](https://www.rutschle.net/tech/conf2struct/README.html) -(v1.3) to your path. +(v1.4) to your path. Compilation ----------- diff --git a/sslh-conf.c b/sslh-conf.c index e0af4a6..3a46661 100644 --- a/sslh-conf.c +++ b/sslh-conf.c @@ -1,5 +1,5 @@ /* Generated by conf2struct (https://www.rutschle.net/tech/conf2struct/README) - * on Sun Jul 19 16:59:51 2020. + * on Fri Jul 24 16:29:39 2020. # conf2struct: generate libconf parsers that read to structs # Copyright (C) 2018-2019 Yves Rutschle @@ -30,9 +30,12 @@ #define _GNU_SOURCE #include -#include +#ifdef LIBCONFIG +# include +#endif #include #include +#include #include "sslh-conf.h" #include "argtable3.h" #ifdef LIBPCRE @@ -56,18 +59,7 @@ typedef enum { CFG_ARRAY, CFG_LIST, } config_type; - -typedef int (*lookup_fn)(const config_setting_t*, const char*, void*); -lookup_fn lookup_fns[] = { - (lookup_fn)config_setting_lookup_bool, - (lookup_fn)config_setting_lookup_int, - (lookup_fn)config_setting_lookup_int64, - (lookup_fn)config_setting_lookup_float, - (lookup_fn)config_setting_lookup_string, - NULL, /* CFG_GROUP */ - NULL, /* CFG_ARRAY */ - NULL, /* CFG_LIST */ -}; +/* /config_type */ const char* type2str[] = { "boolean", @@ -80,8 +72,6 @@ const char* type2str[] = { "list", }; -/* /config_type */ - typedef union { int def_bool; int def_int; @@ -90,6 +80,97 @@ typedef union { char* def_string; } any_val; +struct config_desc { + const char* name; + int type; + struct config_desc * sub_group; /* Table for compound types (list and group) */ + void* arg_cl; /* command-line argument for this setting */ + void* base_addr; /* Base of the structure (filled at runtime). Probably not useable for list elements */ + size_t offset; /* Offset of setting in the structure */ + size_t offset_len; /* Offset of *_len field, for arrays and lists */ + size_t offset_present; /* offset of *_is_present field, for optional settings */ + size_t size; /* Size of element, or size of group for groups and lists */ + int array_type; /* type of array elements, when type == CFG_ARRAY */ + int mandatory; + int optional; + any_val default_val; +}; + +#ifndef LIBCONFIG +/* Stubs in case you don't want libconfig */ + +typedef void config_setting_t; +typedef int config_t; +#define CONFIG_TRUE 1 +#define CONFIG_FALSE 0 + +#define make_config_setting_lookup(type) \ + int config_setting_lookup_##type(const config_setting_t* a, const char* b, void* c) { \ + return 0; \ + } + +#define make_config_setting_get(type, ret_type) \ + ret_type config_setting_get_##type(const config_setting_t* a) { \ + return 0; \ + } + +make_config_setting_lookup(bool); +make_config_setting_lookup(int); +make_config_setting_lookup(int64); +make_config_setting_lookup(float); +make_config_setting_lookup(string); + +make_config_setting_get(bool, int); +make_config_setting_get(int, int); +make_config_setting_get(int64, int); +make_config_setting_get(float, double); +make_config_setting_get(string, char*); + +config_setting_t* config_lookup(config_t* c, const char* b) { + return NULL; +} + +void config_init(config_t* c) { + return; +} + +config_setting_t* config_setting_lookup(config_setting_t* a, char* b) { + return NULL; +} + +int config_setting_length(config_setting_t* a) { + return 0; +} + +config_setting_t* config_setting_get_elem(config_setting_t* a, int i) { + return NULL; +} + +int config_read_file(config_t* a, const char* b) { + return CONFIG_TRUE; +} + +int config_error_line(config_t* c) { + return 0; +} + +char* config_error_text(config_t* c) { + return NULL; +} +#endif + +typedef int (*lookup_fn)(const config_setting_t*, const char*, void*); +lookup_fn lookup_fns[] = { + (lookup_fn)config_setting_lookup_bool, + (lookup_fn)config_setting_lookup_int, + (lookup_fn)config_setting_lookup_int64, + (lookup_fn)config_setting_lookup_float, + (lookup_fn)config_setting_lookup_string, + NULL, /* CFG_GROUP */ + NULL, /* CFG_ARRAY */ + NULL, /* CFG_LIST */ +}; + /* Copy an any_val to arbitrary memory location */ /* 0: success * <0: error */ @@ -253,22 +334,6 @@ static int stringcpy(config_type type, void* target, char* from) } -struct config_desc { - const char* name; - int type; - struct config_desc * sub_group; /* Table for compound types (list and group) */ - void* arg_cl; /* command-line argument for this setting */ - void* base_addr; /* Base of the structure (filled at runtime). Probably not useable for list elements */ - size_t offset; /* Offset of setting in the structure */ - size_t offset_len; /* Offset of *_len field, for arrays and lists */ - size_t offset_present; /* offset of *_is_present field, for optional settings */ - size_t size; /* Size of element, or size of group for groups and lists */ - int array_type; /* type of array elements, when type == CFG_ARRAY */ - int mandatory; - int optional; - any_val default_val; -}; - /* Element to describe the target of a compound element * element: which config entry is being changed * match: if >0, index in pmatch to set @@ -1488,7 +1553,9 @@ int sslhcfg_cl_parse(int argc, char* argv[], struct sslhcfg_item* cfg) char* errmsg; config_setting_t* s; void* argtable[] = { - sslhcfg_conffile = arg_filen("F", "config", "", 0, 1, "Specify configuration file"), + #ifdef LIBCONFIG + sslhcfg_conffile = arg_filen("F", "config", "", 0, 1, "Specify configuration file"), + #endif sslhcfg_verbose = arg_intn("v", "verbose", "", 0, 1, ""), sslhcfg_foreground = arg_litn("f", "foreground", 0, 1, "Run in foreground instead of as a daemon"), sslhcfg_inetd = arg_litn("i", "inetd", 0, 1, "Run in inetd mode: use stdin/stdout instead of network listen"), diff --git a/sslh-conf.h b/sslh-conf.h index 927158b..1bed238 100644 --- a/sslh-conf.h +++ b/sslh-conf.h @@ -1,5 +1,5 @@ /* Generated by conf2struct (https://www.rutschle.net/tech/conf2struct/README) - * on Sun Jul 19 16:59:51 2020. + * on Fri Jul 24 16:29:39 2020. # conf2struct: generate libconf parsers that read to structs # Copyright (C) 2018-2019 Yves Rutschle @@ -30,7 +30,9 @@ #ifndef C2S_SSLHCFG_H #define C2S_SSLHCFG_H -#include +#ifdef LIBCONFIG +# include +#endif #include "probe.h" diff --git a/sslh-main.c b/sslh-main.c index d7c5ff2..1d02348 100644 --- a/sslh-main.c +++ b/sslh-main.c @@ -144,7 +144,6 @@ void cmd_ssl_to_tls(int argc, char* argv[]) /* Extract configuration on addresses and ports on which to listen. * out: newly allocated list of addrinfo to listen to */ -#ifdef LIBCONFIG static int config_resolve_listen(struct addrinfo **listen) { int i, res; @@ -164,12 +163,11 @@ static int config_resolve_listen(struct addrinfo **listen) } return 0; } -#endif -#ifdef LIBCONFIG static void setup_regex_probe(struct sslhcfg_protocols_item *p) +#ifdef LIBCONFIG { int num_patterns, i, res; regex_t** pattern_list; @@ -196,6 +194,10 @@ static void setup_regex_probe(struct sslhcfg_protocols_item *p) } } } +#else +{ + return; +} #endif /* For each protocol in the configuration, resolve address and set up protocol