# HG changeset patch # User Konstantin Tokarev # Date 1448904658 -10800 # Node ID 2907c658fa765d0455972ee837789c4b94b084ac # Parent 978887222d29c34107ff87016e19a4d7bafbed21 Implemented ExitOnForwardFailure option for local and remote forwarding. diff -r 978887222d29 -r 2907c658fa76 cli-runopts.c --- a/cli-runopts.c Mon Nov 30 20:36:15 2015 +0300 +++ b/cli-runopts.c Mon Nov 30 20:30:58 2015 +0300 @@ -148,6 +148,9 @@ #ifdef ENABLE_CLI_PUBKEY_AUTH cli_opts.privkeys = list_new(); #endif +#ifdef ENABLE_CLI_ANYTCPFWD + cli_opts.exit_on_fwd_failure = 0; +#endif #ifdef ENABLE_CLI_LOCALTCPFWD cli_opts.localfwds = list_new(); opts.listen_fwd_all = 0; @@ -854,9 +857,20 @@ const char *optstr = origstr; if (strcmp(origstr, "help") == 0) { - dropbear_log(LOG_INFO, "No options available\n"); + dropbear_log(LOG_INFO, "Available options:\n" +#ifdef ENABLE_CLI_ANYTCPFWD + "\tExitOnForwardFailure\n" +#endif + ); exit(EXIT_SUCCESS); } +#ifdef ENABLE_CLI_ANYTCPFWD + if (match_extendedopt(&optstr, "ExitOnForwardFailure") == DROPBEAR_SUCCESS) { + cli_opts.exit_on_fwd_failure = parse_flag_value(optstr); + return; + } +#endif + dropbear_exit("Bad configuration option '%s'", origstr); } diff -r 978887222d29 -r 2907c658fa76 cli-tcpfwd.c --- a/cli-tcpfwd.c Mon Nov 30 20:36:15 2015 +0300 +++ b/cli-tcpfwd.c Mon Nov 30 20:30:58 2015 +0300 @@ -60,6 +60,22 @@ }; #endif +#ifdef ENABLE_CLI_ANYTCPFWD +static void fwd_failed(const char* format, ...) ATTRIB_PRINTF(1,2); +void fwd_failed(const char* format, ...) +{ + va_list param; + va_start(param, format); + + if (cli_opts.exit_on_fwd_failure) + _dropbear_exit(EXIT_FAILURE, format, param); + else + _dropbear_log(LOG_WARNING, format, param); + + va_end(param); +} +#endif + #ifdef ENABLE_CLI_LOCALTCPFWD void setup_localtcp() { m_list_elem *iter; @@ -75,7 +91,7 @@ fwd->connectaddr, fwd->connectport); if (ret == DROPBEAR_FAILURE) { - dropbear_log(LOG_WARNING, "Failed local port forward %s:%d:%s:%d", + fwd_failed("Failed local port forward %s:%d:%s:%d", fwd->listenaddr, fwd->listenport, fwd->connectaddr, @@ -181,7 +197,10 @@ struct TCPFwdEntry *fwd = (struct TCPFwdEntry*)iter->item; if (!fwd->have_reply) { fwd->have_reply = 1; - dropbear_log(LOG_WARNING, "Remote TCP forward request failed (port %d -> %s:%d)", fwd->listenport, fwd->connectaddr, fwd->connectport); + fwd_failed("Remote TCP forward request failed (port %d -> %s:%d)", + fwd->listenport, + fwd->connectaddr, + fwd->connectport); return; } } diff -r 978887222d29 -r 2907c658fa76 dbclient.1 --- a/dbclient.1 Mon Nov 30 20:36:15 2015 +0300 +++ b/dbclient.1 Mon Nov 30 20:30:58 2015 +0300 @@ -127,6 +127,20 @@ .B \-m \fIMAClist Specify a comma separated list of authentication MACs to enable. Use \fI-m help\fR to list possibilities. .TP +.B \-o \fIoption +Can be used to give options in the format used by OpenSSH config file. This is +useful for specifying options for which there is no separate command-line flag. +For full details of the options listed below, and their possible values, see +ssh_config(5). + +For now only following options have been implemented: +.RS +.RS +.TP +ExitOnForwardFailure +.RE +.RE +.TP .B \-s The specified command will be requested as a subsystem, used for sftp. Dropbear doesn't implement sftp itself but the OpenSSH sftp client can be used eg \fIsftp -S dbclient user@host\fR .TP diff -r 978887222d29 -r 2907c658fa76 runopts.h --- a/runopts.h Mon Nov 30 20:36:15 2015 +0300 +++ b/runopts.h Mon Nov 30 20:30:58 2015 +0300 @@ -139,6 +139,9 @@ #ifdef ENABLE_CLI_PUBKEY_AUTH m_list *privkeys; /* Keys to use for public-key auth */ #endif +#ifdef ENABLE_CLI_ANYTCPFWD + int exit_on_fwd_failure; +#endif #ifdef ENABLE_CLI_REMOTETCPFWD m_list * remotefwds; #endif