refactor echosrv to use conf2struct

This commit is contained in:
yrutschle 2020-11-07 09:29:26 +01:00
parent 6c94bf71b8
commit 07719f55b8
5 changed files with 69 additions and 75 deletions

View File

@ -95,7 +95,7 @@ systemd-sslh-generator: systemd-sslh-generator.o
$(CC) $(CFLAGS) $(LDFLAGS) -o systemd-sslh-generator systemd-sslh-generator.o -lconfig
echosrv: version.h $(OBJS) echosrv.o
$(CC) $(CFLAGS) $(LDFLAGS) -o echosrv echosrv.o probe.o common.o tls.o $(LIBS)
$(CC) $(CFLAGS) $(LDFLAGS) -o echosrv echosrv.o sslh-conf.o probe.o common.o tls.o argtable3.o $(LIBS)
$(MAN): sslh.pod Makefile
pod2man --section=8 --release=$(VERSION) --center=" " sslh.pod | gzip -9 - > $(MAN)
@ -124,7 +124,7 @@ uninstall:
update-rc.d sslh remove
distclean: clean
rm -f tags sslh-conf.c sslh-conf.h cscope.*
rm -f tags sslh-conf.[ch] echosrv-conf.[ch] cscope.*
clean:
rm -f sslh-fork sslh-select echosrv version.h $(MAN) systemd-sslh-generator *.o *.gcov *.gcno *.gcda *.png *.html *.css *.info

View File

@ -29,6 +29,7 @@
#include <getopt.h>
#include "common.h"
#include "sslh-conf.h"
/* Added to make the code compilable under CYGWIN
* */
@ -36,74 +37,18 @@
#define SA_NOCLDWAIT 0
#endif
const char* USAGE_STRING =
"echosrv\n" \
"usage:\n" \
"\techosrv [-v] --listen <address:port> [--prefix <prefix>]\n"
"-v: verbose\n" \
"--listen: address to listen on. Can be specified multiple times.\n" \
"--prefix: add specified prefix before every line echoed.\n"
"";
const char* server_type = "echsrv"; /* keep setup_syslog happy */
/*
* Settings that depend on the command line.
*/
char* prefix = "";
int port;
int verbose, numeric;
void parse_cmdline(int argc, char* argv[])
{
int c;
struct option options[] = {
{ "verbose", no_argument, &verbose, 1 },
{ "numeric", no_argument, &numeric, 1 },
{ "listen", required_argument, 0, 'l' },
{ "prefix", required_argument, 0, 'p' },
};
struct addrinfo **a;
while ((c = getopt_long_only(argc, argv, "l:p:", options, NULL)) != -1) {
if (c == 0) continue;
switch (c) {
case 'l':
/* find the end of the listen list */
for (a = &addr_listen; *a; a = &((*a)->ai_next));
/* append the specified addresses */
resolve_name(a, optarg);
break;
case 'p':
prefix = optarg;
break;
default:
fprintf(stderr, "%s", USAGE_STRING);
exit(2);
}
}
if (!addr_listen) {
fprintf(stderr, "No listening port specified\n");
exit(1);
}
}
void start_echo(int fd)
{
int res;
char buffer[1 << 20];
int ret, prefix_len;
prefix_len = strlen(prefix);
prefix_len = strlen(cfg.prefix);
memset(buffer, 0, sizeof(buffer));
strcpy(buffer, prefix);
strcpy(buffer, cfg.prefix);
while (1) {
ret = read(fd, buffer + prefix_len, sizeof(buffer) - prefix_len);
@ -128,7 +73,7 @@ void main_loop(int listen_sockets[], int num_addr_listen)
while (1)
{
in_socket = accept(listen_sockets[i], 0, 0);
if (verbose) fprintf(stderr, "accepted fd %d\n", in_socket);
if (cfg.verbose) fprintf(stderr, "accepted fd %d\n", in_socket);
if (!fork())
{
@ -143,6 +88,26 @@ void main_loop(int listen_sockets[], int num_addr_listen)
wait(NULL);
}
static int config_resolve_listen(struct addrinfo **listen)
{
int i, res;
for (i = 0; i < cfg.listen_len; i++) {
res = resolve_split_name(listen, cfg.listen[i].host, cfg.listen[i].port);
if (res) return res;
/* getaddrinfo returned a list of addresses corresponding to the
* specification; move the pointer to the end of that list before
* processing the next specification, while setting flags for
* start_listen_sockets() through ai_flags (which is not meant for
* that, but is only used as hint in getaddrinfo, so it's OK) */
for (; *listen; listen = &((*listen)->ai_next)) {
if (cfg.listen[i].keepalive)
(*listen)->ai_flags = SO_KEEPALIVE;
}
}
return 0;
}
int main(int argc, char *argv[])
{
@ -152,8 +117,13 @@ int main(int argc, char *argv[])
int *listen_sockets;
parse_cmdline(argc, argv);
memset(&cfg, 0, sizeof(cfg));
if (sslhcfg_cl_parse(argc, argv, &cfg))
exit(1);
sslhcfg_fprint(stdout, &cfg, 0);
config_resolve_listen(&addr_listen);
num_addr_listen = start_listen_sockets(&listen_sockets, addr_listen);
main_loop(listen_sockets, num_addr_listen);

View File

@ -1,5 +1,5 @@
/* Generated by conf2struct (https://www.rutschle.net/tech/conf2struct/README)
* on Sat Aug 29 18:12:55 2020.
* on Sat Nov 7 09:23:57 2020.
# conf2struct: generate libconf parsers that read to structs
# Copyright (C) 2018-2019 Yves Rutschle
@ -409,6 +409,7 @@ struct arg_file* sslhcfg_conffile;
struct arg_str* sslhcfg_chroot;
struct arg_str* sslhcfg_syslog_facility;
struct arg_str* sslhcfg_on_timeout;
struct arg_str* sslhcfg_prefix;
struct arg_str* sslhcfg_listen;
struct arg_str* sslhcfg_ssh;
struct arg_str* sslhcfg_tls;
@ -671,7 +672,7 @@ static struct config_desc table_sslhcfg_listen[] = {
},
{ 0 }
};
static struct config_desc table_sslhcfg[] = {
@ -851,6 +852,22 @@ static struct config_desc table_sslhcfg[] = {
/* default_val*/ .default_val.def_string = "ssh"
},
{
/* name */ "prefix",
/* type */ CFG_STRING,
/* sub_group*/ NULL,
/* arg_cl */ & sslhcfg_prefix,
/* base_addr */ NULL,
/* offset */ offsetof(struct sslhcfg_item, prefix),
/* offset_len */ 0,
/* offset_present */ 0,
/* size */ sizeof(char*),
/* array_type */ -1,
/* mandatory */ 1,
/* optional */ 0,
/* default_val*/ .default_val.def_string = NULL
},
{
/* name */ "listen",
/* type */ CFG_LIST,
@ -971,7 +988,7 @@ static struct compound_cl_arg compound_cl_args[] = {
{ /* arg: listen */
.regex = "(.+):(\\w+)",
.arg_cl = & sslhcfg_listen,
.base_entry = & table_sslhcfg [11],
.base_entry = & table_sslhcfg [12],
.targets = sslhcfg_listen_targets,
@ -983,7 +1000,7 @@ static struct compound_cl_arg compound_cl_args[] = {
{ /* arg: ssh */
.regex = "(.+):(\\w+)",
.arg_cl = & sslhcfg_ssh,
.base_entry = & table_sslhcfg [12],
.base_entry = & table_sslhcfg [13],
.targets = sslhcfg_ssh_targets,
@ -995,7 +1012,7 @@ static struct compound_cl_arg compound_cl_args[] = {
{ /* arg: tls */
.regex = "(.+):(\\w+)",
.arg_cl = & sslhcfg_tls,
.base_entry = & table_sslhcfg [12],
.base_entry = & table_sslhcfg [13],
.targets = sslhcfg_tls_targets,
@ -1007,7 +1024,7 @@ static struct compound_cl_arg compound_cl_args[] = {
{ /* arg: openvpn */
.regex = "(.+):(\\w+)",
.arg_cl = & sslhcfg_openvpn,
.base_entry = & table_sslhcfg [12],
.base_entry = & table_sslhcfg [13],
.targets = sslhcfg_openvpn_targets,
@ -1019,7 +1036,7 @@ static struct compound_cl_arg compound_cl_args[] = {
{ /* arg: tinc */
.regex = "(.+):(\\w+)",
.arg_cl = & sslhcfg_tinc,
.base_entry = & table_sslhcfg [12],
.base_entry = & table_sslhcfg [13],
.targets = sslhcfg_tinc_targets,
@ -1031,7 +1048,7 @@ static struct compound_cl_arg compound_cl_args[] = {
{ /* arg: xmpp */
.regex = "(.+):(\\w+)",
.arg_cl = & sslhcfg_xmpp,
.base_entry = & table_sslhcfg [12],
.base_entry = & table_sslhcfg [13],
.targets = sslhcfg_xmpp_targets,
@ -1043,7 +1060,7 @@ static struct compound_cl_arg compound_cl_args[] = {
{ /* arg: http */
.regex = "(.+):(\\w+)",
.arg_cl = & sslhcfg_http,
.base_entry = & table_sslhcfg [12],
.base_entry = & table_sslhcfg [13],
.targets = sslhcfg_http_targets,
@ -1055,7 +1072,7 @@ static struct compound_cl_arg compound_cl_args[] = {
{ /* arg: adb */
.regex = "(.+):(\\w+)",
.arg_cl = & sslhcfg_adb,
.base_entry = & table_sslhcfg [12],
.base_entry = & table_sslhcfg [13],
.targets = sslhcfg_adb_targets,
@ -1067,7 +1084,7 @@ static struct compound_cl_arg compound_cl_args[] = {
{ /* arg: socks5 */
.regex = "(.+):(\\w+)",
.arg_cl = & sslhcfg_socks5,
.base_entry = & table_sslhcfg [12],
.base_entry = & table_sslhcfg [13],
.targets = sslhcfg_socks5_targets,
@ -1079,7 +1096,7 @@ static struct compound_cl_arg compound_cl_args[] = {
{ /* arg: anyprot */
.regex = "(.+):(\\w+)",
.arg_cl = & sslhcfg_anyprot,
.base_entry = & table_sslhcfg [12],
.base_entry = & table_sslhcfg [13],
.targets = sslhcfg_anyprot_targets,
@ -1694,6 +1711,7 @@ int sslhcfg_cl_parse(int argc, char* argv[], struct sslhcfg_item* cfg)
sslhcfg_chroot = arg_strn("C", "chroot", "<path>", 0, 1, "Root to change to after set-up"),
sslhcfg_syslog_facility = arg_strn(NULL, "syslog-facility", "<str>", 0, 1, "Facility to syslog to"),
sslhcfg_on_timeout = arg_strn(NULL, "on-timeout", "<str>", 0, 1, "Target to connect to when timing out"),
sslhcfg_prefix = arg_strn(NULL, "prefix", "<str>", 0, 1, "Reserved for testing"),
sslhcfg_listen = arg_strn("p", "listen", "<host:port>", 0, 10, "Listen on host:port"),
sslhcfg_ssh = arg_strn(NULL, "ssh", "<host:port>", 0, 10, "Set up ssh target"),
sslhcfg_tls = arg_strn(NULL, "tls", "<host:port>", 0, 10, "Set up TLS/SSL target"),
@ -1875,6 +1893,9 @@ void sslhcfg_fprint(
indent(out, depth);
fprintf(out, "on_timeout: %s", sslhcfg->on_timeout);
fprintf(out, "\n");
indent(out, depth);
fprintf(out, "prefix: %s", sslhcfg->prefix);
fprintf(out, "\n");
indent(out, depth);
fprintf(out, "listen [%zu]:\n", sslhcfg->listen_len);

View File

@ -1,5 +1,5 @@
/* Generated by conf2struct (https://www.rutschle.net/tech/conf2struct/README)
* on Sat Aug 29 18:12:55 2020.
* on Sat Nov 7 09:23:57 2020.
# conf2struct: generate libconf parsers that read to structs
# Copyright (C) 2018-2019 Yves Rutschle
@ -84,6 +84,7 @@ struct sslhcfg_item {
char* chroot;
char* syslog_facility;
char* on_timeout;
char* prefix;
size_t listen_len;
struct sslhcfg_listen_item* listen;
size_t protocols_len;

View File

@ -55,6 +55,8 @@ config: {
{ name: "on-timeout"; type: "string"; default: "ssh";
description: "Target to connect to when timing out"; },
{ name: "prefix"; type: "string"; description: "Reserved for testing" }, # For echosrv only, not sslh
{ name: "listen",
no_cl_accessors: true; # disable generation of individual cl options for each group element (we create a specific --listen option further below)
type: "list",