re-integrate command line support

This commit is contained in:
yrutschle 2018-12-07 08:32:36 +01:00
parent 33ab9d535d
commit ad0adfb0e1
6 changed files with 52 additions and 96 deletions

View File

@ -355,7 +355,7 @@ void init_cnx(struct connection *cnx)
memset(cnx, 0, sizeof(*cnx));
cnx->q[0].fd = -1;
cnx->q[1].fd = -1;
cnx->proto = get_first_protocol();
cnx->proto = NULL;
}
void dump_connection(struct connection *cnx)

27
probe.c
View File

@ -43,11 +43,6 @@ static int is_adb_protocol(const char *p, int len, struct sslhcfg_protocols_item
static int is_socks5_protocol(const char *p, int len, struct sslhcfg_protocols_item*);
static int is_true(const char *p, int len, struct sslhcfg_protocols_item* proto) { return 1; }
struct protocol_probe_desc {
const char* name;
T_PROBE* probe;
};
/* Table of protocols that have a built-in probe
*/
static struct protocol_probe_desc builtins[] = {
@ -64,12 +59,11 @@ static struct protocol_probe_desc builtins[] = {
{ "anyprot", is_true }
};
static struct sslhcfg_protocols_item *protocols;
static char* on_timeout = "ssh";
/* TODO I think this has to go */
struct sslhcfg_protocols_item* get_builtins(void) {
return NULL;
struct protocol_probe_desc* get_builtins(void) {
return builtins;
}
int get_num_builtins(void) {
@ -90,24 +84,11 @@ struct sslhcfg_protocols_item* timeout_protocol(void)
{
int i;
for (i = 0; i < cfg.protocols_len; i++) {
printf("prot %d:%s vs %s\n",i, cfg.protocols[i].name, on_timeout);
if (!strcmp(cfg.protocols[i].name, on_timeout)) return &cfg.protocols[i];
}
return get_first_protocol();
return &cfg.protocols[0];
}
/* returns the first protocol (caller can then follow the *next pointers) */
struct sslhcfg_protocols_item* get_first_protocol(void)
{
return protocols;
}
void set_protocol_list(struct sslhcfg_protocols_item* prots)
{
#if 0
protocols = prots;
#endif
}
/* From http://grapsus.net/blog/post/Hexadecimal-dump-in-C */
#define HEXDUMP_COLS 16
@ -355,7 +336,7 @@ static int regex_probe(const char *p, int len, struct sslhcfg_protocols_item* pr
int probe_client_protocol(struct connection *cnx)
{
char buffer[BUFSIZ];
struct sslhcfg_protocols_item* p, *last_p = cnx->proto;
struct sslhcfg_protocols_item* p;
int i, n, res, again = 0;
n = read(cnx->q[0].fd, buffer, sizeof(buffer));

29
probe.h
View File

@ -15,31 +15,16 @@ typedef enum {
struct sslhcfg_protocols_item;
typedef int T_PROBE(const char*, int, struct sslhcfg_protocols_item*);
struct protocol_probe_desc {
const char* name;
T_PROBE* probe;
};
#include "sslh-conf.h"
/* For each protocol we need: */
#if 0
struct proto {
const char* description; /* a string that says what it is (for logging and command-line parsing) */
const char* service; /* service name to do libwrap checks */
struct addrinfo *saddr; /* list of addresses to try and switch that protocol */
int log_level; /* 0: No logging of connection
* 1: Log incoming connection
*/
int keepalive; /* 0: No keepalive ; 1: Set Keepalive for this connection */
int fork; /* 0: Connection can run within shared process ; 1: Separate process required for this connection */
/* function to probe that protocol; parameters are buffer and length
* containing the data to probe, and a pointer to the protocol structure */
T_PROBE* probe;
/* opaque pointer ; used to pass list of regex to regex probe, or TLSProtocol struct to sni/alpn probe */
void* data;
struct proto *next; /* pointer to next protocol in list, NULL if last */
};
#endif
/* Returns a pointer to the array of builtin protocols */
struct sslhcfg_protocols_item* get_builtins(void);
struct protocol_probe_desc* get_builtins(void);
/* Returns the number of builtin protocols */
int get_num_builtins(void);

View File

@ -1,5 +1,5 @@
/* Generated by conf2struct (https://www.rutschle.net/tech/conf2struct)
* on Tue Dec 4 21:49:45 2018. */
* on Fri Dec 7 08:27:14 2018. */

View File

@ -1,5 +1,5 @@
/* Generated by conf2struct (https://www.rutschle.net/tech/conf2struct)
* on Tue Dec 4 21:49:45 2018. */
* on Fri Dec 7 08:27:14 2018. */
#ifndef C2S_SSLHCFG_H

View File

@ -62,14 +62,12 @@ const char* USAGE_STRING =
/* Constants for options that have no one-character shorthand */
#define OPT_ONTIMEOUT 257
/*
static struct option const_options[] = {
{ "inetd", no_argument, &inetd, 1 },
{ "foreground", no_argument, &foreground, 1 },
{ "background", no_argument, &background, 1 },
{ "transparent", no_argument, &transparent, 1 },
{ "numeric", no_argument, &numeric, 1 },
{ "verbose", no_argument, &verbose, 1 },
{ "inetd", no_argument, &cfg.inetd, 1 },
{ "foreground", no_argument, &cfg.foreground, 1 },
{ "transparent", no_argument, &cfg.transparent, 1 },
{ "numeric", no_argument, &cfg.numeric, 1 },
{ "verbose", no_argument, &cfg.verbose, 1 },
{ "user", required_argument, 0, 'u' },
{ "config", optional_argument, 0, 'F' },
{ "pidfile", required_argument, 0, 'P' },
@ -79,16 +77,16 @@ static struct option const_options[] = {
{ "listen", required_argument, 0, 'p' },
{}
};
*/
static struct option* all_options;
static struct sslhcfg_protocols_item* builtins;
static struct protocol_probe_desc* builtins;
static const char *optstr = "vt:T:p:VP:C:F::";
static void print_usage(void)
{
struct sslhcfg_protocols_item *p;
struct protocol_probe_desc *p;
int i;
int res;
char *prots = "";
@ -302,7 +300,7 @@ static int config_parse(char *filename, struct addrinfo **listen)
* prot: array of protocols
* n_prots: number of protocols in *prot
* */
static void append_protocols(struct option *options, int n_opts, struct sslhcfg_protocols_item *prot , int n_prots)
static void append_protocols(struct option *options, int n_opts, struct protocol_probe_desc* prot , int n_prots)
{
int o, p;
@ -316,7 +314,6 @@ static void append_protocols(struct option *options, int n_opts, struct sslhcfg_
static void make_alloptions(void)
{
#if 0
builtins = get_builtins();
/* Create all_options, composed of const_options followed by one option per
@ -325,7 +322,6 @@ static void make_alloptions(void)
CHECK_ALLOC(all_options, "calloc");
memcpy(all_options, const_options, sizeof(const_options));
append_protocols(all_options, ARRAY_SIZE(const_options) - 1, builtins, get_num_builtins());
#endif
}
/* Performs a first scan of command line options to see if a configuration file
@ -378,11 +374,9 @@ static void cmdline_config(int argc, char* argv[], struct sslhcfg_protocols_item
* potentially non-allocated */
static void parse_cmdline(int argc, char* argv[], struct sslhcfg_protocols_item* prots)
{
#if 0
int c;
struct addrinfo **a;
struct sslhcfg_protocols_item *p;
int background;
int background, i;
optind = 1;
opterr = 1;
@ -391,29 +385,25 @@ next_arg:
if (c == 0) continue;
if (c >= PROT_SHIFT) {
if (prots)
for (p = prots; p && p->next; p = p->next) {
/* override if protocol was already defined by config file
* (note it only overrides address and use builtin probe) */
if (!strcmp(p->name, builtins[c-PROT_SHIFT].name)) {
resolve_name(&(p->saddr), optarg);
p->probe = builtins[c-PROT_SHIFT].probe;
goto next_arg;
}
int prot_num = c - PROT_SHIFT;
for (i = 0; i < cfg.protocols_len; i++) {
/* override if protocol was already defined by config file */
if (!strcmp(cfg.protocols[i].name, builtins[prot_num].name)) {
resolve_name(&(cfg.protocols[i].saddr), optarg);
goto next_arg;
}
}
/* At this stage, it's a new protocol: add it to the end of the
* list */
if (!prots) {
/* No protocols yet -- create the list */
p = prots = calloc(1, sizeof(*p));
CHECK_ALLOC(p, "calloc");
} else {
p->next = calloc(1, sizeof(*p));
CHECK_ALLOC(p->next, "calloc");
p = p->next;
}
memcpy(p, &builtins[c-PROT_SHIFT], sizeof(*p));
resolve_name(&(p->saddr), optarg);
cfg.protocols_len++;
cfg.protocols = realloc(cfg.protocols, cfg.protocols_len * sizeof(*cfg.protocols));
CHECK_ALLOC(cfg.protocols, "realloc");
/* set up name, target and probe. everything else defaults to 0 */
memset(&cfg.protocols[cfg.protocols_len-1], 0, sizeof(cfg.protocols[0]));
cfg.protocols[cfg.protocols_len-1].probe = get_probe(builtins[prot_num].name);
cfg.protocols[cfg.protocols_len-1].name = builtins[prot_num].name;
resolve_name(&cfg.protocols[cfg.protocols_len-1].saddr, optarg);
continue;
}
@ -422,12 +412,14 @@ next_arg:
case 'F':
/* Legal option, but do nothing, it was already processed in
* cmdline_config() */
#ifndef LIBCONFIG
fprintf(stderr, "Built without libconfig support: configuration file not available.\n");
exit(1);
#endif
break;
case 't':
probing_timeout = atoi(optarg);
cfg.timeout = atoi(optarg);
break;
case OPT_ONTIMEOUT:
@ -447,19 +439,19 @@ next_arg:
exit(0);
case 'u':
user_name = optarg;
cfg.user = optarg;
break;
case 'P':
pid_file = optarg;
cfg.pidfile = optarg;
break;
case 'C':
chroot_path = optarg;
cfg.chroot = optarg;
break;
case 'v':
verbose++;
cfg.verbose++;
break;
default:
@ -470,15 +462,11 @@ next_arg:
return;
if (!prots) {
if (!cfg.protocols_len) {
fprintf(stderr, "At least one target protocol must be specified.\n");
exit(2);
}
/*
set_protocol_list(prots);
*/
/* If compiling with systemd socket support no need to require listen address */
#ifndef SYSTEMD
if (!addr_listen && !cfg.inetd) {
@ -491,7 +479,6 @@ next_arg:
if (background)
cfg.foreground = 0;
#endif
}
int main(int argc, char *argv[])
@ -504,10 +491,13 @@ int main(int argc, char *argv[])
int *listen_sockets;
/* Init defaults */
/* Init defaults -- conf2struct sets them when parsing a config file
* but we may configure entirely from the command line */
cfg.pidfile = NULL;
cfg.user = NULL;
cfg.chroot = NULL;
cfg.syslog_facility = "auth";
cfg.timeout = 2;
cmdline_config(argc, argv, &protocols);
parse_cmdline(argc, argv, protocols);