# HG changeset patch # User Matt Johnston # Date 1221483110 0 # Node ID e3db1f7a2e43401cef8121410f7b2f40c0b4e867 # Parent 657c045054abd3b011eddc315c310f1aa99dd24a - Split main socket var into ses.sock_in/ses.sock_out in preparation for -J proxy_cmd option (and some prelim options for that) diff -r 657c045054ab -r e3db1f7a2e43 cli-main.c --- a/cli-main.c Fri Sep 12 17:48:33 2008 +0000 +++ b/cli-main.c Mon Sep 15 12:51:50 2008 +0000 @@ -39,7 +39,7 @@ int main(int argc, char ** argv) { #endif - int sock; + int sock_in, sock_out; char* error = NULL; char* hostandport; int len; @@ -58,10 +58,18 @@ dropbear_exit("signal() error"); } - sock = connect_remote(cli_opts.remotehost, cli_opts.remoteport, - 0, &error); +#ifdef CLI_ENABLE_PROXYCMD + if (cli_runopts.proxycmd) { - if (sock < 0) { + } else +#endif + { + int sock = connect_remote(cli_opts.remotehost, cli_opts.remoteport, + 0, &error); + sock_in = sock_out = sock; + } + + if (sock_in < 0) { dropbear_exit("%s", error); } @@ -72,7 +80,7 @@ snprintf(hostandport, len, "%s:%s", cli_opts.remotehost, cli_opts.remoteport); - cli_session(sock, hostandport); + cli_session(sock_in, sock_out, hostandport); /* not reached */ return -1; diff -r 657c045054ab -r e3db1f7a2e43 cli-runopts.c --- a/cli-runopts.c Fri Sep 12 17:48:33 2008 +0000 +++ b/cli-runopts.c Mon Sep 15 12:51:50 2008 +0000 @@ -65,6 +65,9 @@ #endif "-W (default %d, larger may be faster, max 1MB)\n" "-K (0 is never, default %d)\n" +#ifdef ENABLE_CLI_PROXYCMD + "-J Use program rather than tcp connection" +#endif #ifdef DEBUG_TRACE "-v verbose\n" #endif @@ -87,6 +90,9 @@ #ifdef ENABLE_CLI_REMOTETCPFWD int nextisremote = 0; #endif +#ifdef ENABLE_CLI_PROXYCMD + int nextisproxycmd = 0; +#endif char* dummy = NULL; /* Not used for anything real */ char* recv_window_arg = NULL; @@ -199,6 +205,11 @@ nextisremote = 1; break; #endif +#ifdef ENABLE_CLI_PROXYCMD + case 'J': + next = &cli_opts.proxycmd; + break; +#endif case 'l': next = &cli_opts.username; break; diff -r 657c045054ab -r e3db1f7a2e43 cli-session.c --- a/cli-session.c Fri Sep 12 17:48:33 2008 +0000 +++ b/cli-session.c Mon Sep 15 12:51:50 2008 +0000 @@ -74,13 +74,13 @@ NULL /* Null termination */ }; -void cli_session(int sock, char* remotehost) { +void cli_session(int sock_in, int sock_out, char* remotehost) { seedrandom(); crypto_init(); - common_session_init(sock, remotehost); + common_session_init(sock_in, sock_out, remotehost); chaninitialise(cli_chantypes); @@ -294,8 +294,10 @@ /* XXX TODO perhaps print a friendlier message if we get this but have * already sent/received disconnect message(s) ??? */ - close(ses.sock); - ses.sock = -1; + m_close(ses.sock_in); + m_close(ses.sock_out); + ses.sock_in = -1; + ses.sock_out = -1; dropbear_exit("remote closed the connection"); } diff -r 657c045054ab -r e3db1f7a2e43 common-session.c --- a/common-session.c Fri Sep 12 17:48:33 2008 +0000 +++ b/common-session.c Mon Sep 15 12:51:50 2008 +0000 @@ -52,14 +52,15 @@ /* called only at the start of a session, set up initial state */ -void common_session_init(int sock, char* remotehost) { +void common_session_init(int sock_in, int sock_out, char* remotehost) { TRACE(("enter session_init")) ses.remotehost = remotehost; - ses.sock = sock; - ses.maxfd = sock; + ses.sock_in = sock_in; + ses.sock_out = sock_out; + ses.maxfd = MAX(sock_in, sock_out); ses.connect_time = 0; ses.last_packet_time = 0; @@ -137,11 +138,11 @@ FD_ZERO(&writefd); FD_ZERO(&readfd); dropbear_assert(ses.payload == NULL); - if (ses.sock != -1) { - FD_SET(ses.sock, &readfd); - if (!isempty(&ses.writequeue)) { - FD_SET(ses.sock, &writefd); - } + if (ses.sock_in != -1) { + FD_SET(ses.sock_in, &readfd); + } + if (ses.sock_out != -1 && !isempty(&ses.writequeue)) { + FD_SET(ses.sock_out, &writefd); } /* We get woken up when signal handlers write to this pipe. @@ -183,12 +184,14 @@ checktimeouts(); /* process session socket's incoming/outgoing data */ - if (ses.sock != -1) { - if (FD_ISSET(ses.sock, &writefd) && !isempty(&ses.writequeue)) { + if (ses.sock_out != -1) { + if (FD_ISSET(ses.sock_out, &writefd) && !isempty(&ses.writequeue)) { write_packet(); } + } - if (FD_ISSET(ses.sock, &readfd)) { + if (ses.sock_in != -1) { + if (FD_ISSET(ses.sock_in, &readfd)) { read_packet(); } @@ -248,14 +251,14 @@ int i; /* write our version string, this blocks */ - if (atomicio(write, ses.sock, LOCAL_IDENT "\r\n", + if (atomicio(write, ses.sock_out, LOCAL_IDENT "\r\n", strlen(LOCAL_IDENT "\r\n")) == DROPBEAR_FAILURE) { ses.remoteclosed(); } /* If they send more than 50 lines, something is wrong */ for (i = 0; i < 50; i++) { - len = ident_readln(ses.sock, linebuf, sizeof(linebuf)); + len = ident_readln(ses.sock_in, linebuf, sizeof(linebuf)); if (len < 0 && errno != EINTR) { /* It failed */ diff -r 657c045054ab -r e3db1f7a2e43 options.h --- a/options.h Fri Sep 12 17:48:33 2008 +0000 +++ b/options.h Mon Sep 15 12:51:50 2008 +0000 @@ -60,6 +60,10 @@ #define ENABLE_CLI_LOCALTCPFWD #define ENABLE_CLI_REMOTETCPFWD +/* Allow using -J to run the connection through a + pipe to a program, rather the normal TCP connection */ +/*#define ENABLE_CLI_PROXYCMD*/ + #define ENABLE_SVR_LOCALTCPFWD #define ENABLE_SVR_REMOTETCPFWD diff -r 657c045054ab -r e3db1f7a2e43 packet.c --- a/packet.c Fri Sep 12 17:48:33 2008 +0000 +++ b/packet.c Mon Sep 15 12:51:50 2008 +0000 @@ -61,7 +61,7 @@ len = writebuf->len - writebuf->pos; dropbear_assert(len > 0); /* Try to write as much as possible */ - written = write(ses.sock, buf_getptr(writebuf, len), len); + written = write(ses.sock_out, buf_getptr(writebuf, len), len); if (written < 0) { if (errno == EINTR) { @@ -122,7 +122,7 @@ * mightn't be any available (EAGAIN) */ dropbear_assert(ses.readbuf != NULL); maxlen = ses.readbuf->len - ses.readbuf->pos; - len = read(ses.sock, buf_getptr(ses.readbuf, maxlen), maxlen); + len = read(ses.sock_in, buf_getptr(ses.readbuf, maxlen), maxlen); if (len == 0) { ses.remoteclosed(); @@ -171,7 +171,7 @@ maxlen = blocksize - ses.readbuf->pos; /* read the rest of the packet if possible */ - len = read(ses.sock, buf_getwriteptr(ses.readbuf, maxlen), + len = read(ses.sock_in, buf_getwriteptr(ses.readbuf, maxlen), maxlen); if (len == 0) { ses.remoteclosed(); diff -r 657c045054ab -r e3db1f7a2e43 runopts.h --- a/runopts.h Fri Sep 12 17:48:33 2008 +0000 +++ b/runopts.h Mon Sep 15 12:51:50 2008 +0000 @@ -117,6 +117,9 @@ #ifdef ENABLE_CLI_LOCALTCPFWD struct TCPFwdList * localfwds; #endif +#ifdef ENABLE_CLI_PROXYCMD + char *proxycmd; +#endif } cli_runopts; diff -r 657c045054ab -r e3db1f7a2e43 session.h --- a/session.h Fri Sep 12 17:48:33 2008 +0000 +++ b/session.h Mon Sep 15 12:51:50 2008 +0000 @@ -41,7 +41,7 @@ extern int sessinitdone; /* Is set to 0 somewhere */ extern int exitflag; -void common_session_init(int sock, char* remotehost); +void common_session_init(int sock_in, int sock_out, char* remotehost); void session_loop(void(*loophandler)()); void common_session_cleanup(); void session_identification(); @@ -54,7 +54,7 @@ void svr_dropbear_log(int priority, const char* format, va_list param); /* Client */ -void cli_session(int sock, char *remotehost); +void cli_session(int sock_in, int sock_out, char *remotehost); void cli_session_cleanup(); void cleantext(unsigned char* dirtytext); @@ -97,7 +97,8 @@ (cleared after auth once we're not respecting AUTH_TIMEOUT any more) */ - int sock; + int sock_in; + int sock_out; unsigned char *remotehost; /* the peer hostname */ diff -r 657c045054ab -r e3db1f7a2e43 svr-session.c --- a/svr-session.c Fri Sep 12 17:48:33 2008 +0000 +++ b/svr-session.c Mon Sep 15 12:51:50 2008 +0000 @@ -80,7 +80,7 @@ reseedrandom(); crypto_init(); - common_session_init(sock, remotehost); + common_session_init(sock, sock, remotehost); /* Initialise server specific parts of the session */ svr_ses.childpipe = childpipe; @@ -183,7 +183,7 @@ localtime(×ec)) == 0) { /* upon failure, just print the epoch-seconds time. */ - snprintf(datestr, sizeof(datestr), "%d", timesec); + snprintf(datestr, sizeof(datestr), "%d", (int)timesec); } fprintf(stderr, "[%d] %s %s\n", getpid(), datestr, printbuf); } @@ -192,8 +192,10 @@ /* called when the remote side closes the connection */ static void svr_remoteclosed() { - close(ses.sock); - ses.sock = -1; + m_close(ses.sock_in); + m_close(ses.sock_out); + ses.sock_in = -1; + ses.sock_out = -1; dropbear_close("Exited normally"); }