mirror of
https://github.com/yrutschle/sslh.git
synced 2025-04-14 16:17:14 +03:00
refactor echosrv to use conf2struct
This commit is contained in:
parent
6c94bf71b8
commit
07719f55b8
4
Makefile
4
Makefile
@ -95,7 +95,7 @@ systemd-sslh-generator: systemd-sslh-generator.o
|
|||||||
$(CC) $(CFLAGS) $(LDFLAGS) -o systemd-sslh-generator systemd-sslh-generator.o -lconfig
|
$(CC) $(CFLAGS) $(LDFLAGS) -o systemd-sslh-generator systemd-sslh-generator.o -lconfig
|
||||||
|
|
||||||
echosrv: version.h $(OBJS) echosrv.o
|
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
|
$(MAN): sslh.pod Makefile
|
||||||
pod2man --section=8 --release=$(VERSION) --center=" " sslh.pod | gzip -9 - > $(MAN)
|
pod2man --section=8 --release=$(VERSION) --center=" " sslh.pod | gzip -9 - > $(MAN)
|
||||||
@ -124,7 +124,7 @@ uninstall:
|
|||||||
update-rc.d sslh remove
|
update-rc.d sslh remove
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
rm -f tags sslh-conf.c sslh-conf.h cscope.*
|
rm -f tags sslh-conf.[ch] echosrv-conf.[ch] cscope.*
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f sslh-fork sslh-select echosrv version.h $(MAN) systemd-sslh-generator *.o *.gcov *.gcno *.gcda *.png *.html *.css *.info
|
rm -f sslh-fork sslh-select echosrv version.h $(MAN) systemd-sslh-generator *.o *.gcov *.gcno *.gcda *.png *.html *.css *.info
|
||||||
|
90
echosrv.c
90
echosrv.c
@ -29,6 +29,7 @@
|
|||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "sslh-conf.h"
|
||||||
|
|
||||||
/* Added to make the code compilable under CYGWIN
|
/* Added to make the code compilable under CYGWIN
|
||||||
* */
|
* */
|
||||||
@ -36,74 +37,18 @@
|
|||||||
#define SA_NOCLDWAIT 0
|
#define SA_NOCLDWAIT 0
|
||||||
#endif
|
#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 */
|
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)
|
void start_echo(int fd)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
char buffer[1 << 20];
|
char buffer[1 << 20];
|
||||||
int ret, prefix_len;
|
int ret, prefix_len;
|
||||||
|
|
||||||
prefix_len = strlen(prefix);
|
prefix_len = strlen(cfg.prefix);
|
||||||
|
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
strcpy(buffer, prefix);
|
strcpy(buffer, cfg.prefix);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
ret = read(fd, buffer + prefix_len, sizeof(buffer) - prefix_len);
|
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)
|
while (1)
|
||||||
{
|
{
|
||||||
in_socket = accept(listen_sockets[i], 0, 0);
|
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())
|
if (!fork())
|
||||||
{
|
{
|
||||||
@ -143,6 +88,26 @@ void main_loop(int listen_sockets[], int num_addr_listen)
|
|||||||
wait(NULL);
|
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[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -152,8 +117,13 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
int *listen_sockets;
|
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);
|
num_addr_listen = start_listen_sockets(&listen_sockets, addr_listen);
|
||||||
|
|
||||||
main_loop(listen_sockets, num_addr_listen);
|
main_loop(listen_sockets, num_addr_listen);
|
||||||
|
45
sslh-conf.c
45
sslh-conf.c
@ -1,5 +1,5 @@
|
|||||||
/* Generated by conf2struct (https://www.rutschle.net/tech/conf2struct/README)
|
/* 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
|
# conf2struct: generate libconf parsers that read to structs
|
||||||
# Copyright (C) 2018-2019 Yves Rutschle
|
# Copyright (C) 2018-2019 Yves Rutschle
|
||||||
@ -409,6 +409,7 @@ struct arg_file* sslhcfg_conffile;
|
|||||||
struct arg_str* sslhcfg_chroot;
|
struct arg_str* sslhcfg_chroot;
|
||||||
struct arg_str* sslhcfg_syslog_facility;
|
struct arg_str* sslhcfg_syslog_facility;
|
||||||
struct arg_str* sslhcfg_on_timeout;
|
struct arg_str* sslhcfg_on_timeout;
|
||||||
|
struct arg_str* sslhcfg_prefix;
|
||||||
struct arg_str* sslhcfg_listen;
|
struct arg_str* sslhcfg_listen;
|
||||||
struct arg_str* sslhcfg_ssh;
|
struct arg_str* sslhcfg_ssh;
|
||||||
struct arg_str* sslhcfg_tls;
|
struct arg_str* sslhcfg_tls;
|
||||||
@ -671,7 +672,7 @@ static struct config_desc table_sslhcfg_listen[] = {
|
|||||||
},
|
},
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct config_desc table_sslhcfg[] = {
|
static struct config_desc table_sslhcfg[] = {
|
||||||
|
|
||||||
|
|
||||||
@ -851,6 +852,22 @@ static struct config_desc table_sslhcfg[] = {
|
|||||||
/* default_val*/ .default_val.def_string = "ssh"
|
/* 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",
|
/* name */ "listen",
|
||||||
/* type */ CFG_LIST,
|
/* type */ CFG_LIST,
|
||||||
@ -971,7 +988,7 @@ static struct compound_cl_arg compound_cl_args[] = {
|
|||||||
{ /* arg: listen */
|
{ /* arg: listen */
|
||||||
.regex = "(.+):(\\w+)",
|
.regex = "(.+):(\\w+)",
|
||||||
.arg_cl = & sslhcfg_listen,
|
.arg_cl = & sslhcfg_listen,
|
||||||
.base_entry = & table_sslhcfg [11],
|
.base_entry = & table_sslhcfg [12],
|
||||||
.targets = sslhcfg_listen_targets,
|
.targets = sslhcfg_listen_targets,
|
||||||
|
|
||||||
|
|
||||||
@ -983,7 +1000,7 @@ static struct compound_cl_arg compound_cl_args[] = {
|
|||||||
{ /* arg: ssh */
|
{ /* arg: ssh */
|
||||||
.regex = "(.+):(\\w+)",
|
.regex = "(.+):(\\w+)",
|
||||||
.arg_cl = & sslhcfg_ssh,
|
.arg_cl = & sslhcfg_ssh,
|
||||||
.base_entry = & table_sslhcfg [12],
|
.base_entry = & table_sslhcfg [13],
|
||||||
.targets = sslhcfg_ssh_targets,
|
.targets = sslhcfg_ssh_targets,
|
||||||
|
|
||||||
|
|
||||||
@ -995,7 +1012,7 @@ static struct compound_cl_arg compound_cl_args[] = {
|
|||||||
{ /* arg: tls */
|
{ /* arg: tls */
|
||||||
.regex = "(.+):(\\w+)",
|
.regex = "(.+):(\\w+)",
|
||||||
.arg_cl = & sslhcfg_tls,
|
.arg_cl = & sslhcfg_tls,
|
||||||
.base_entry = & table_sslhcfg [12],
|
.base_entry = & table_sslhcfg [13],
|
||||||
.targets = sslhcfg_tls_targets,
|
.targets = sslhcfg_tls_targets,
|
||||||
|
|
||||||
|
|
||||||
@ -1007,7 +1024,7 @@ static struct compound_cl_arg compound_cl_args[] = {
|
|||||||
{ /* arg: openvpn */
|
{ /* arg: openvpn */
|
||||||
.regex = "(.+):(\\w+)",
|
.regex = "(.+):(\\w+)",
|
||||||
.arg_cl = & sslhcfg_openvpn,
|
.arg_cl = & sslhcfg_openvpn,
|
||||||
.base_entry = & table_sslhcfg [12],
|
.base_entry = & table_sslhcfg [13],
|
||||||
.targets = sslhcfg_openvpn_targets,
|
.targets = sslhcfg_openvpn_targets,
|
||||||
|
|
||||||
|
|
||||||
@ -1019,7 +1036,7 @@ static struct compound_cl_arg compound_cl_args[] = {
|
|||||||
{ /* arg: tinc */
|
{ /* arg: tinc */
|
||||||
.regex = "(.+):(\\w+)",
|
.regex = "(.+):(\\w+)",
|
||||||
.arg_cl = & sslhcfg_tinc,
|
.arg_cl = & sslhcfg_tinc,
|
||||||
.base_entry = & table_sslhcfg [12],
|
.base_entry = & table_sslhcfg [13],
|
||||||
.targets = sslhcfg_tinc_targets,
|
.targets = sslhcfg_tinc_targets,
|
||||||
|
|
||||||
|
|
||||||
@ -1031,7 +1048,7 @@ static struct compound_cl_arg compound_cl_args[] = {
|
|||||||
{ /* arg: xmpp */
|
{ /* arg: xmpp */
|
||||||
.regex = "(.+):(\\w+)",
|
.regex = "(.+):(\\w+)",
|
||||||
.arg_cl = & sslhcfg_xmpp,
|
.arg_cl = & sslhcfg_xmpp,
|
||||||
.base_entry = & table_sslhcfg [12],
|
.base_entry = & table_sslhcfg [13],
|
||||||
.targets = sslhcfg_xmpp_targets,
|
.targets = sslhcfg_xmpp_targets,
|
||||||
|
|
||||||
|
|
||||||
@ -1043,7 +1060,7 @@ static struct compound_cl_arg compound_cl_args[] = {
|
|||||||
{ /* arg: http */
|
{ /* arg: http */
|
||||||
.regex = "(.+):(\\w+)",
|
.regex = "(.+):(\\w+)",
|
||||||
.arg_cl = & sslhcfg_http,
|
.arg_cl = & sslhcfg_http,
|
||||||
.base_entry = & table_sslhcfg [12],
|
.base_entry = & table_sslhcfg [13],
|
||||||
.targets = sslhcfg_http_targets,
|
.targets = sslhcfg_http_targets,
|
||||||
|
|
||||||
|
|
||||||
@ -1055,7 +1072,7 @@ static struct compound_cl_arg compound_cl_args[] = {
|
|||||||
{ /* arg: adb */
|
{ /* arg: adb */
|
||||||
.regex = "(.+):(\\w+)",
|
.regex = "(.+):(\\w+)",
|
||||||
.arg_cl = & sslhcfg_adb,
|
.arg_cl = & sslhcfg_adb,
|
||||||
.base_entry = & table_sslhcfg [12],
|
.base_entry = & table_sslhcfg [13],
|
||||||
.targets = sslhcfg_adb_targets,
|
.targets = sslhcfg_adb_targets,
|
||||||
|
|
||||||
|
|
||||||
@ -1067,7 +1084,7 @@ static struct compound_cl_arg compound_cl_args[] = {
|
|||||||
{ /* arg: socks5 */
|
{ /* arg: socks5 */
|
||||||
.regex = "(.+):(\\w+)",
|
.regex = "(.+):(\\w+)",
|
||||||
.arg_cl = & sslhcfg_socks5,
|
.arg_cl = & sslhcfg_socks5,
|
||||||
.base_entry = & table_sslhcfg [12],
|
.base_entry = & table_sslhcfg [13],
|
||||||
.targets = sslhcfg_socks5_targets,
|
.targets = sslhcfg_socks5_targets,
|
||||||
|
|
||||||
|
|
||||||
@ -1079,7 +1096,7 @@ static struct compound_cl_arg compound_cl_args[] = {
|
|||||||
{ /* arg: anyprot */
|
{ /* arg: anyprot */
|
||||||
.regex = "(.+):(\\w+)",
|
.regex = "(.+):(\\w+)",
|
||||||
.arg_cl = & sslhcfg_anyprot,
|
.arg_cl = & sslhcfg_anyprot,
|
||||||
.base_entry = & table_sslhcfg [12],
|
.base_entry = & table_sslhcfg [13],
|
||||||
.targets = sslhcfg_anyprot_targets,
|
.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_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_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_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_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_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"),
|
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);
|
indent(out, depth);
|
||||||
fprintf(out, "on_timeout: %s", sslhcfg->on_timeout);
|
fprintf(out, "on_timeout: %s", sslhcfg->on_timeout);
|
||||||
fprintf(out, "\n");
|
fprintf(out, "\n");
|
||||||
|
indent(out, depth);
|
||||||
|
fprintf(out, "prefix: %s", sslhcfg->prefix);
|
||||||
|
fprintf(out, "\n");
|
||||||
|
|
||||||
indent(out, depth);
|
indent(out, depth);
|
||||||
fprintf(out, "listen [%zu]:\n", sslhcfg->listen_len);
|
fprintf(out, "listen [%zu]:\n", sslhcfg->listen_len);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Generated by conf2struct (https://www.rutschle.net/tech/conf2struct/README)
|
/* 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
|
# conf2struct: generate libconf parsers that read to structs
|
||||||
# Copyright (C) 2018-2019 Yves Rutschle
|
# Copyright (C) 2018-2019 Yves Rutschle
|
||||||
@ -84,6 +84,7 @@ struct sslhcfg_item {
|
|||||||
char* chroot;
|
char* chroot;
|
||||||
char* syslog_facility;
|
char* syslog_facility;
|
||||||
char* on_timeout;
|
char* on_timeout;
|
||||||
|
char* prefix;
|
||||||
size_t listen_len;
|
size_t listen_len;
|
||||||
struct sslhcfg_listen_item* listen;
|
struct sslhcfg_listen_item* listen;
|
||||||
size_t protocols_len;
|
size_t protocols_len;
|
||||||
|
@ -55,6 +55,8 @@ config: {
|
|||||||
{ name: "on-timeout"; type: "string"; default: "ssh";
|
{ name: "on-timeout"; type: "string"; default: "ssh";
|
||||||
description: "Target to connect to when timing out"; },
|
description: "Target to connect to when timing out"; },
|
||||||
|
|
||||||
|
{ name: "prefix"; type: "string"; description: "Reserved for testing" }, # For echosrv only, not sslh
|
||||||
|
|
||||||
{ name: "listen",
|
{ name: "listen",
|
||||||
no_cl_accessors: true; # disable generation of individual cl options for each group element (we create a specific --listen option further below)
|
no_cl_accessors: true; # disable generation of individual cl options for each group element (we create a specific --listen option further below)
|
||||||
type: "list",
|
type: "list",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user