clientloop.c revision 226046
1/* $OpenBSD: clientloop.c,v 1.236 2011/06/22 22:08:42 djm Exp $ */
2/* $FreeBSD: head/crypto/openssh/clientloop.c 226046 2011-10-05 22:08:17Z des $ */
3/*
4 * Author: Tatu Ylonen <ylo@cs.hut.fi>
5 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
6 *                    All rights reserved
7 * The main loop for the interactive session (client side).
8 *
9 * As far as I am concerned, the code I have written for this software
10 * can be used freely for any purpose.  Any derived versions of this
11 * software must be clearly marked as such, and if the derived work is
12 * incompatible with the protocol description in the RFC file, it must be
13 * called by a name other than "ssh" or "Secure Shell".
14 *
15 *
16 * Copyright (c) 1999 Theo de Raadt.  All rights reserved.
17 *
18 * Redistribution and use in source and binary forms, with or without
19 * modification, are permitted provided that the following conditions
20 * are met:
21 * 1. Redistributions of source code must retain the above copyright
22 *    notice, this list of conditions and the following disclaimer.
23 * 2. Redistributions in binary form must reproduce the above copyright
24 *    notice, this list of conditions and the following disclaimer in the
25 *    documentation and/or other materials provided with the distribution.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
28 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
29 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
30 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
31 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
32 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
36 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 *
38 *
39 * SSH2 support added by Markus Friedl.
40 * Copyright (c) 1999, 2000, 2001 Markus Friedl.  All rights reserved.
41 *
42 * Redistribution and use in source and binary forms, with or without
43 * modification, are permitted provided that the following conditions
44 * are met:
45 * 1. Redistributions of source code must retain the above copyright
46 *    notice, this list of conditions and the following disclaimer.
47 * 2. Redistributions in binary form must reproduce the above copyright
48 *    notice, this list of conditions and the following disclaimer in the
49 *    documentation and/or other materials provided with the distribution.
50 *
51 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
52 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
53 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
54 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
55 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
56 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
57 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
58 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
59 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
60 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61 */
62
63#include "includes.h"
64
65#include <sys/types.h>
66#include <sys/ioctl.h>
67#include <sys/param.h>
68#ifdef HAVE_SYS_STAT_H
69# include <sys/stat.h>
70#endif
71#ifdef HAVE_SYS_TIME_H
72# include <sys/time.h>
73#endif
74#include <sys/socket.h>
75
76#include <ctype.h>
77#include <errno.h>
78#ifdef HAVE_PATHS_H
79#include <paths.h>
80#endif
81#include <signal.h>
82#include <stdarg.h>
83#include <stdio.h>
84#include <stdlib.h>
85#include <string.h>
86#include <termios.h>
87#include <pwd.h>
88#include <unistd.h>
89
90#include "openbsd-compat/sys-queue.h"
91#include "xmalloc.h"
92#include "ssh.h"
93#include "ssh1.h"
94#include "ssh2.h"
95#include "packet.h"
96#include "buffer.h"
97#include "compat.h"
98#include "channels.h"
99#include "dispatch.h"
100#include "key.h"
101#include "cipher.h"
102#include "kex.h"
103#include "log.h"
104#include "readconf.h"
105#include "clientloop.h"
106#include "sshconnect.h"
107#include "authfd.h"
108#include "atomicio.h"
109#include "sshpty.h"
110#include "misc.h"
111#include "match.h"
112#include "msg.h"
113#include "roaming.h"
114
115/* import options */
116extern Options options;
117
118/* Flag indicating that stdin should be redirected from /dev/null. */
119extern int stdin_null_flag;
120
121/* Flag indicating that no shell has been requested */
122extern int no_shell_flag;
123
124/* Control socket */
125extern int muxserver_sock; /* XXX use mux_client_cleanup() instead */
126
127/*
128 * Name of the host we are connecting to.  This is the name given on the
129 * command line, or the HostName specified for the user-supplied name in a
130 * configuration file.
131 */
132extern char *host;
133
134/*
135 * Flag to indicate that we have received a window change signal which has
136 * not yet been processed.  This will cause a message indicating the new
137 * window size to be sent to the server a little later.  This is volatile
138 * because this is updated in a signal handler.
139 */
140static volatile sig_atomic_t received_window_change_signal = 0;
141static volatile sig_atomic_t received_signal = 0;
142
143/* Flag indicating whether the user's terminal is in non-blocking mode. */
144static int in_non_blocking_mode = 0;
145
146/* Time when backgrounded control master using ControlPersist should exit */
147static time_t control_persist_exit_time = 0;
148
149/* Common data for the client loop code. */
150volatile sig_atomic_t quit_pending; /* Set non-zero to quit the loop. */
151static int escape_char1;	/* Escape character. (proto1 only) */
152static int escape_pending1;	/* Last character was an escape (proto1 only) */
153static int last_was_cr;		/* Last character was a newline. */
154static int exit_status;		/* Used to store the command exit status. */
155static int stdin_eof;		/* EOF has been encountered on stderr. */
156static Buffer stdin_buffer;	/* Buffer for stdin data. */
157static Buffer stdout_buffer;	/* Buffer for stdout data. */
158static Buffer stderr_buffer;	/* Buffer for stderr data. */
159static u_int buffer_high;	/* Soft max buffer size. */
160static int connection_in;	/* Connection to server (input). */
161static int connection_out;	/* Connection to server (output). */
162static int need_rekeying;	/* Set to non-zero if rekeying is requested. */
163static int session_closed;	/* In SSH2: login session closed. */
164static int x11_refuse_time;	/* If >0, refuse x11 opens after this time. */
165
166static void client_init_dispatch(void);
167int	session_ident = -1;
168
169int	session_resumed = 0;
170
171/* Track escape per proto2 channel */
172struct escape_filter_ctx {
173	int escape_pending;
174	int escape_char;
175};
176
177/* Context for channel confirmation replies */
178struct channel_reply_ctx {
179	const char *request_type;
180	int id;
181	enum confirm_action action;
182};
183
184/* Global request success/failure callbacks */
185struct global_confirm {
186	TAILQ_ENTRY(global_confirm) entry;
187	global_confirm_cb *cb;
188	void *ctx;
189	int ref_count;
190};
191TAILQ_HEAD(global_confirms, global_confirm);
192static struct global_confirms global_confirms =
193    TAILQ_HEAD_INITIALIZER(global_confirms);
194
195/*XXX*/
196extern Kex *xxx_kex;
197
198void ssh_process_session2_setup(int, int, int, Buffer *);
199
200/* Restores stdin to blocking mode. */
201
202static void
203leave_non_blocking(void)
204{
205	if (in_non_blocking_mode) {
206		unset_nonblock(fileno(stdin));
207		in_non_blocking_mode = 0;
208	}
209}
210
211/* Puts stdin terminal in non-blocking mode. */
212
213static void
214enter_non_blocking(void)
215{
216	in_non_blocking_mode = 1;
217	set_nonblock(fileno(stdin));
218}
219
220/*
221 * Signal handler for the window change signal (SIGWINCH).  This just sets a
222 * flag indicating that the window has changed.
223 */
224/*ARGSUSED */
225static void
226window_change_handler(int sig)
227{
228	received_window_change_signal = 1;
229	signal(SIGWINCH, window_change_handler);
230}
231
232/*
233 * Signal handler for signals that cause the program to terminate.  These
234 * signals must be trapped to restore terminal modes.
235 */
236/*ARGSUSED */
237static void
238signal_handler(int sig)
239{
240	received_signal = sig;
241	quit_pending = 1;
242}
243
244/*
245 * Returns current time in seconds from Jan 1, 1970 with the maximum
246 * available resolution.
247 */
248
249static double
250get_current_time(void)
251{
252	struct timeval tv;
253	gettimeofday(&tv, NULL);
254	return (double) tv.tv_sec + (double) tv.tv_usec / 1000000.0;
255}
256
257/*
258 * Sets control_persist_exit_time to the absolute time when the
259 * backgrounded control master should exit due to expiry of the
260 * ControlPersist timeout.  Sets it to 0 if we are not a backgrounded
261 * control master process, or if there is no ControlPersist timeout.
262 */
263static void
264set_control_persist_exit_time(void)
265{
266	if (muxserver_sock == -1 || !options.control_persist
267	    || options.control_persist_timeout == 0) {
268		/* not using a ControlPersist timeout */
269		control_persist_exit_time = 0;
270	} else if (channel_still_open()) {
271		/* some client connections are still open */
272		if (control_persist_exit_time > 0)
273			debug2("%s: cancel scheduled exit", __func__);
274		control_persist_exit_time = 0;
275	} else if (control_persist_exit_time <= 0) {
276		/* a client connection has recently closed */
277		control_persist_exit_time = time(NULL) +
278			(time_t)options.control_persist_timeout;
279		debug2("%s: schedule exit in %d seconds", __func__,
280		    options.control_persist_timeout);
281	}
282	/* else we are already counting down to the timeout */
283}
284
285#define SSH_X11_PROTO "MIT-MAGIC-COOKIE-1"
286void
287client_x11_get_proto(const char *display, const char *xauth_path,
288    u_int trusted, u_int timeout, char **_proto, char **_data)
289{
290	char cmd[1024];
291	char line[512];
292	char xdisplay[512];
293	static char proto[512], data[512];
294	FILE *f;
295	int got_data = 0, generated = 0, do_unlink = 0, i;
296	char *xauthdir, *xauthfile;
297	struct stat st;
298	u_int now;
299
300	xauthdir = xauthfile = NULL;
301	*_proto = proto;
302	*_data = data;
303	proto[0] = data[0] = '\0';
304
305	if (xauth_path == NULL ||(stat(xauth_path, &st) == -1)) {
306		debug("No xauth program.");
307	} else {
308		if (display == NULL) {
309			debug("x11_get_proto: DISPLAY not set");
310			return;
311		}
312		/*
313		 * Handle FamilyLocal case where $DISPLAY does
314		 * not match an authorization entry.  For this we
315		 * just try "xauth list unix:displaynum.screennum".
316		 * XXX: "localhost" match to determine FamilyLocal
317		 *      is not perfect.
318		 */
319		if (strncmp(display, "localhost:", 10) == 0) {
320			snprintf(xdisplay, sizeof(xdisplay), "unix:%s",
321			    display + 10);
322			display = xdisplay;
323		}
324		if (trusted == 0) {
325			xauthdir = xmalloc(MAXPATHLEN);
326			xauthfile = xmalloc(MAXPATHLEN);
327			mktemp_proto(xauthdir, MAXPATHLEN);
328			if (mkdtemp(xauthdir) != NULL) {
329				do_unlink = 1;
330				snprintf(xauthfile, MAXPATHLEN, "%s/xauthfile",
331				    xauthdir);
332				snprintf(cmd, sizeof(cmd),
333				    "%s -f %s generate %s " SSH_X11_PROTO
334				    " untrusted timeout %u 2>" _PATH_DEVNULL,
335				    xauth_path, xauthfile, display, timeout);
336				debug2("x11_get_proto: %s", cmd);
337				if (system(cmd) == 0)
338					generated = 1;
339				if (x11_refuse_time == 0) {
340					now = time(NULL) + 1;
341					if (UINT_MAX - timeout < now)
342						x11_refuse_time = UINT_MAX;
343					else
344						x11_refuse_time = now + timeout;
345				}
346			}
347		}
348
349		/*
350		 * When in untrusted mode, we read the cookie only if it was
351		 * successfully generated as an untrusted one in the step
352		 * above.
353		 */
354		if (trusted || generated) {
355			snprintf(cmd, sizeof(cmd),
356			    "%s %s%s list %s 2>" _PATH_DEVNULL,
357			    xauth_path,
358			    generated ? "-f " : "" ,
359			    generated ? xauthfile : "",
360			    display);
361			debug2("x11_get_proto: %s", cmd);
362			f = popen(cmd, "r");
363			if (f && fgets(line, sizeof(line), f) &&
364			    sscanf(line, "%*s %511s %511s", proto, data) == 2)
365				got_data = 1;
366			if (f)
367				pclose(f);
368		} else
369			error("Warning: untrusted X11 forwarding setup failed: "
370			    "xauth key data not generated");
371	}
372
373	if (do_unlink) {
374		unlink(xauthfile);
375		rmdir(xauthdir);
376	}
377	if (xauthdir)
378		xfree(xauthdir);
379	if (xauthfile)
380		xfree(xauthfile);
381
382	/*
383	 * If we didn't get authentication data, just make up some
384	 * data.  The forwarding code will check the validity of the
385	 * response anyway, and substitute this data.  The X11
386	 * server, however, will ignore this fake data and use
387	 * whatever authentication mechanisms it was using otherwise
388	 * for the local connection.
389	 */
390	if (!got_data) {
391		u_int32_t rnd = 0;
392
393		logit("Warning: No xauth data; "
394		    "using fake authentication data for X11 forwarding.");
395		strlcpy(proto, SSH_X11_PROTO, sizeof proto);
396		for (i = 0; i < 16; i++) {
397			if (i % 4 == 0)
398				rnd = arc4random();
399			snprintf(data + 2 * i, sizeof data - 2 * i, "%02x",
400			    rnd & 0xff);
401			rnd >>= 8;
402		}
403	}
404}
405
406/*
407 * This is called when the interactive is entered.  This checks if there is
408 * an EOF coming on stdin.  We must check this explicitly, as select() does
409 * not appear to wake up when redirecting from /dev/null.
410 */
411
412static void
413client_check_initial_eof_on_stdin(void)
414{
415	int len;
416	char buf[1];
417
418	/*
419	 * If standard input is to be "redirected from /dev/null", we simply
420	 * mark that we have seen an EOF and send an EOF message to the
421	 * server. Otherwise, we try to read a single character; it appears
422	 * that for some files, such /dev/null, select() never wakes up for
423	 * read for this descriptor, which means that we never get EOF.  This
424	 * way we will get the EOF if stdin comes from /dev/null or similar.
425	 */
426	if (stdin_null_flag) {
427		/* Fake EOF on stdin. */
428		debug("Sending eof.");
429		stdin_eof = 1;
430		packet_start(SSH_CMSG_EOF);
431		packet_send();
432	} else {
433		enter_non_blocking();
434
435		/* Check for immediate EOF on stdin. */
436		len = read(fileno(stdin), buf, 1);
437		if (len == 0) {
438			/*
439			 * EOF.  Record that we have seen it and send
440			 * EOF to server.
441			 */
442			debug("Sending eof.");
443			stdin_eof = 1;
444			packet_start(SSH_CMSG_EOF);
445			packet_send();
446		} else if (len > 0) {
447			/*
448			 * Got data.  We must store the data in the buffer,
449			 * and also process it as an escape character if
450			 * appropriate.
451			 */
452			if ((u_char) buf[0] == escape_char1)
453				escape_pending1 = 1;
454			else
455				buffer_append(&stdin_buffer, buf, 1);
456		}
457		leave_non_blocking();
458	}
459}
460
461
462/*
463 * Make packets from buffered stdin data, and buffer them for sending to the
464 * connection.
465 */
466
467static void
468client_make_packets_from_stdin_data(void)
469{
470	u_int len;
471
472	/* Send buffered stdin data to the server. */
473	while (buffer_len(&stdin_buffer) > 0 &&
474	    packet_not_very_much_data_to_write()) {
475		len = buffer_len(&stdin_buffer);
476		/* Keep the packets at reasonable size. */
477		if (len > packet_get_maxsize())
478			len = packet_get_maxsize();
479		packet_start(SSH_CMSG_STDIN_DATA);
480		packet_put_string(buffer_ptr(&stdin_buffer), len);
481		packet_send();
482		buffer_consume(&stdin_buffer, len);
483		/* If we have a pending EOF, send it now. */
484		if (stdin_eof && buffer_len(&stdin_buffer) == 0) {
485			packet_start(SSH_CMSG_EOF);
486			packet_send();
487		}
488	}
489}
490
491/*
492 * Checks if the client window has changed, and sends a packet about it to
493 * the server if so.  The actual change is detected elsewhere (by a software
494 * interrupt on Unix); this just checks the flag and sends a message if
495 * appropriate.
496 */
497
498static void
499client_check_window_change(void)
500{
501	struct winsize ws;
502
503	if (! received_window_change_signal)
504		return;
505	/** XXX race */
506	received_window_change_signal = 0;
507
508	debug2("client_check_window_change: changed");
509
510	if (compat20) {
511		channel_send_window_changes();
512	} else {
513		if (ioctl(fileno(stdin), TIOCGWINSZ, &ws) < 0)
514			return;
515		packet_start(SSH_CMSG_WINDOW_SIZE);
516		packet_put_int((u_int)ws.ws_row);
517		packet_put_int((u_int)ws.ws_col);
518		packet_put_int((u_int)ws.ws_xpixel);
519		packet_put_int((u_int)ws.ws_ypixel);
520		packet_send();
521	}
522}
523
524static void
525client_global_request_reply(int type, u_int32_t seq, void *ctxt)
526{
527	struct global_confirm *gc;
528
529	if ((gc = TAILQ_FIRST(&global_confirms)) == NULL)
530		return;
531	if (gc->cb != NULL)
532		gc->cb(type, seq, gc->ctx);
533	if (--gc->ref_count <= 0) {
534		TAILQ_REMOVE(&global_confirms, gc, entry);
535		bzero(gc, sizeof(*gc));
536		xfree(gc);
537	}
538
539	packet_set_alive_timeouts(0);
540}
541
542static void
543server_alive_check(void)
544{
545	if (packet_inc_alive_timeouts() > options.server_alive_count_max) {
546		logit("Timeout, server %s not responding.", host);
547		cleanup_exit(255);
548	}
549	packet_start(SSH2_MSG_GLOBAL_REQUEST);
550	packet_put_cstring("keepalive@openssh.com");
551	packet_put_char(1);     /* boolean: want reply */
552	packet_send();
553	/* Insert an empty placeholder to maintain ordering */
554	client_register_global_confirm(NULL, NULL);
555}
556
557/*
558 * Waits until the client can do something (some data becomes available on
559 * one of the file descriptors).
560 */
561static void
562client_wait_until_can_do_something(fd_set **readsetp, fd_set **writesetp,
563    int *maxfdp, u_int *nallocp, int rekeying)
564{
565	struct timeval tv, *tvp;
566	int timeout_secs;
567	int ret;
568
569	/* Add any selections by the channel mechanism. */
570	channel_prepare_select(readsetp, writesetp, maxfdp, nallocp, rekeying);
571
572	if (!compat20) {
573		/* Read from the connection, unless our buffers are full. */
574		if (buffer_len(&stdout_buffer) < buffer_high &&
575		    buffer_len(&stderr_buffer) < buffer_high &&
576		    channel_not_very_much_buffered_data())
577			FD_SET(connection_in, *readsetp);
578		/*
579		 * Read from stdin, unless we have seen EOF or have very much
580		 * buffered data to send to the server.
581		 */
582		if (!stdin_eof && packet_not_very_much_data_to_write())
583			FD_SET(fileno(stdin), *readsetp);
584
585		/* Select stdout/stderr if have data in buffer. */
586		if (buffer_len(&stdout_buffer) > 0)
587			FD_SET(fileno(stdout), *writesetp);
588		if (buffer_len(&stderr_buffer) > 0)
589			FD_SET(fileno(stderr), *writesetp);
590	} else {
591		/* channel_prepare_select could have closed the last channel */
592		if (session_closed && !channel_still_open() &&
593		    !packet_have_data_to_write()) {
594			/* clear mask since we did not call select() */
595			memset(*readsetp, 0, *nallocp);
596			memset(*writesetp, 0, *nallocp);
597			return;
598		} else {
599			FD_SET(connection_in, *readsetp);
600		}
601	}
602
603	/* Select server connection if have data to write to the server. */
604	if (packet_have_data_to_write())
605		FD_SET(connection_out, *writesetp);
606
607	/*
608	 * Wait for something to happen.  This will suspend the process until
609	 * some selected descriptor can be read, written, or has some other
610	 * event pending, or a timeout expires.
611	 */
612
613	timeout_secs = INT_MAX; /* we use INT_MAX to mean no timeout */
614	if (options.server_alive_interval > 0 && compat20)
615		timeout_secs = options.server_alive_interval;
616	set_control_persist_exit_time();
617	if (control_persist_exit_time > 0) {
618		timeout_secs = MIN(timeout_secs,
619			control_persist_exit_time - time(NULL));
620		if (timeout_secs < 0)
621			timeout_secs = 0;
622	}
623	if (timeout_secs == INT_MAX)
624		tvp = NULL;
625	else {
626		tv.tv_sec = timeout_secs;
627		tv.tv_usec = 0;
628		tvp = &tv;
629	}
630
631	ret = select((*maxfdp)+1, *readsetp, *writesetp, NULL, tvp);
632	if (ret < 0) {
633		char buf[100];
634
635		/*
636		 * We have to clear the select masks, because we return.
637		 * We have to return, because the mainloop checks for the flags
638		 * set by the signal handlers.
639		 */
640		memset(*readsetp, 0, *nallocp);
641		memset(*writesetp, 0, *nallocp);
642
643		if (errno == EINTR)
644			return;
645		/* Note: we might still have data in the buffers. */
646		snprintf(buf, sizeof buf, "select: %s\r\n", strerror(errno));
647		buffer_append(&stderr_buffer, buf, strlen(buf));
648		quit_pending = 1;
649	} else if (ret == 0)
650		server_alive_check();
651}
652
653static void
654client_suspend_self(Buffer *bin, Buffer *bout, Buffer *berr)
655{
656	/* Flush stdout and stderr buffers. */
657	if (buffer_len(bout) > 0)
658		atomicio(vwrite, fileno(stdout), buffer_ptr(bout),
659		    buffer_len(bout));
660	if (buffer_len(berr) > 0)
661		atomicio(vwrite, fileno(stderr), buffer_ptr(berr),
662		    buffer_len(berr));
663
664	leave_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
665
666	/*
667	 * Free (and clear) the buffer to reduce the amount of data that gets
668	 * written to swap.
669	 */
670	buffer_free(bin);
671	buffer_free(bout);
672	buffer_free(berr);
673
674	/* Send the suspend signal to the program itself. */
675	kill(getpid(), SIGTSTP);
676
677	/* Reset window sizes in case they have changed */
678	received_window_change_signal = 1;
679
680	/* OK, we have been continued by the user. Reinitialize buffers. */
681	buffer_init(bin);
682	buffer_init(bout);
683	buffer_init(berr);
684
685	enter_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
686}
687
688static void
689client_process_net_input(fd_set *readset)
690{
691	int len, cont = 0;
692	char buf[SSH_IOBUFSZ];
693
694	/*
695	 * Read input from the server, and add any such data to the buffer of
696	 * the packet subsystem.
697	 */
698	if (FD_ISSET(connection_in, readset)) {
699		/* Read as much as possible. */
700		len = roaming_read(connection_in, buf, sizeof(buf), &cont);
701		if (len == 0 && cont == 0) {
702			/*
703			 * Received EOF.  The remote host has closed the
704			 * connection.
705			 */
706			snprintf(buf, sizeof buf,
707			    "Connection to %.300s closed by remote host.\r\n",
708			    host);
709			buffer_append(&stderr_buffer, buf, strlen(buf));
710			quit_pending = 1;
711			return;
712		}
713		/*
714		 * There is a kernel bug on Solaris that causes select to
715		 * sometimes wake up even though there is no data available.
716		 */
717		if (len < 0 &&
718		    (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK))
719			len = 0;
720
721		if (len < 0) {
722			/*
723			 * An error has encountered.  Perhaps there is a
724			 * network problem.
725			 */
726			snprintf(buf, sizeof buf,
727			    "Read from remote host %.300s: %.100s\r\n",
728			    host, strerror(errno));
729			buffer_append(&stderr_buffer, buf, strlen(buf));
730			quit_pending = 1;
731			return;
732		}
733		packet_process_incoming(buf, len);
734	}
735}
736
737static void
738client_status_confirm(int type, Channel *c, void *ctx)
739{
740	struct channel_reply_ctx *cr = (struct channel_reply_ctx *)ctx;
741	char errmsg[256];
742	int tochan;
743
744	/*
745	 * If a TTY was explicitly requested, then a failure to allocate
746	 * one is fatal.
747	 */
748	if (cr->action == CONFIRM_TTY &&
749	    (options.request_tty == REQUEST_TTY_FORCE ||
750	    options.request_tty == REQUEST_TTY_YES))
751		cr->action = CONFIRM_CLOSE;
752
753	/* XXX supress on mux _client_ quietmode */
754	tochan = options.log_level >= SYSLOG_LEVEL_ERROR &&
755	    c->ctl_chan != -1 && c->extended_usage == CHAN_EXTENDED_WRITE;
756
757	if (type == SSH2_MSG_CHANNEL_SUCCESS) {
758		debug2("%s request accepted on channel %d",
759		    cr->request_type, c->self);
760	} else if (type == SSH2_MSG_CHANNEL_FAILURE) {
761		if (tochan) {
762			snprintf(errmsg, sizeof(errmsg),
763			    "%s request failed\r\n", cr->request_type);
764		} else {
765			snprintf(errmsg, sizeof(errmsg),
766			    "%s request failed on channel %d",
767			    cr->request_type, c->self);
768		}
769		/* If error occurred on primary session channel, then exit */
770		if (cr->action == CONFIRM_CLOSE && c->self == session_ident)
771			fatal("%s", errmsg);
772		/*
773		 * If error occurred on mux client, append to
774		 * their stderr.
775		 */
776		if (tochan) {
777			buffer_append(&c->extended, errmsg,
778			    strlen(errmsg));
779		} else
780			error("%s", errmsg);
781		if (cr->action == CONFIRM_TTY) {
782			/*
783			 * If a TTY allocation error occurred, then arrange
784			 * for the correct TTY to leave raw mode.
785			 */
786			if (c->self == session_ident)
787				leave_raw_mode(0);
788			else
789				mux_tty_alloc_failed(c);
790		} else if (cr->action == CONFIRM_CLOSE) {
791			chan_read_failed(c);
792			chan_write_failed(c);
793		}
794	}
795	xfree(cr);
796}
797
798static void
799client_abandon_status_confirm(Channel *c, void *ctx)
800{
801	xfree(ctx);
802}
803
804void
805client_expect_confirm(int id, const char *request,
806    enum confirm_action action)
807{
808	struct channel_reply_ctx *cr = xmalloc(sizeof(*cr));
809
810	cr->request_type = request;
811	cr->action = action;
812
813	channel_register_status_confirm(id, client_status_confirm,
814	    client_abandon_status_confirm, cr);
815}
816
817void
818client_register_global_confirm(global_confirm_cb *cb, void *ctx)
819{
820	struct global_confirm *gc, *last_gc;
821
822	/* Coalesce identical callbacks */
823	last_gc = TAILQ_LAST(&global_confirms, global_confirms);
824	if (last_gc && last_gc->cb == cb && last_gc->ctx == ctx) {
825		if (++last_gc->ref_count >= INT_MAX)
826			fatal("%s: last_gc->ref_count = %d",
827			    __func__, last_gc->ref_count);
828		return;
829	}
830
831	gc = xmalloc(sizeof(*gc));
832	gc->cb = cb;
833	gc->ctx = ctx;
834	gc->ref_count = 1;
835	TAILQ_INSERT_TAIL(&global_confirms, gc, entry);
836}
837
838static void
839process_cmdline(void)
840{
841	void (*handler)(int);
842	char *s, *cmd, *cancel_host;
843	int delete = 0;
844	int local = 0, remote = 0, dynamic = 0;
845	int cancel_port;
846	Forward fwd;
847
848	bzero(&fwd, sizeof(fwd));
849	fwd.listen_host = fwd.connect_host = NULL;
850
851	leave_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
852	handler = signal(SIGINT, SIG_IGN);
853	cmd = s = read_passphrase("\r\nssh> ", RP_ECHO);
854	if (s == NULL)
855		goto out;
856	while (isspace(*s))
857		s++;
858	if (*s == '-')
859		s++;	/* Skip cmdline '-', if any */
860	if (*s == '\0')
861		goto out;
862
863	if (*s == 'h' || *s == 'H' || *s == '?') {
864		logit("Commands:");
865		logit("      -L[bind_address:]port:host:hostport    "
866		    "Request local forward");
867		logit("      -R[bind_address:]port:host:hostport    "
868		    "Request remote forward");
869		logit("      -D[bind_address:]port                  "
870		    "Request dynamic forward");
871		logit("      -KR[bind_address:]port                 "
872		    "Cancel remote forward");
873		if (!options.permit_local_command)
874			goto out;
875		logit("      !args                                  "
876		    "Execute local command");
877		goto out;
878	}
879
880	if (*s == '!' && options.permit_local_command) {
881		s++;
882		ssh_local_cmd(s);
883		goto out;
884	}
885
886	if (*s == 'K') {
887		delete = 1;
888		s++;
889	}
890	if (*s == 'L')
891		local = 1;
892	else if (*s == 'R')
893		remote = 1;
894	else if (*s == 'D')
895		dynamic = 1;
896	else {
897		logit("Invalid command.");
898		goto out;
899	}
900
901	if ((local || dynamic) && delete) {
902		logit("Not supported.");
903		goto out;
904	}
905	if (remote && delete && !compat20) {
906		logit("Not supported for SSH protocol version 1.");
907		goto out;
908	}
909
910	while (isspace(*++s))
911		;
912
913	/* XXX update list of forwards in options */
914	if (delete) {
915		cancel_port = 0;
916		cancel_host = hpdelim(&s);	/* may be NULL */
917		if (s != NULL) {
918			cancel_port = a2port(s);
919			cancel_host = cleanhostname(cancel_host);
920		} else {
921			cancel_port = a2port(cancel_host);
922			cancel_host = NULL;
923		}
924		if (cancel_port <= 0) {
925			logit("Bad forwarding close port");
926			goto out;
927		}
928		channel_request_rforward_cancel(cancel_host, cancel_port);
929	} else {
930		if (!parse_forward(&fwd, s, dynamic, remote)) {
931			logit("Bad forwarding specification.");
932			goto out;
933		}
934		if (local || dynamic) {
935			if (channel_setup_local_fwd_listener(fwd.listen_host,
936			    fwd.listen_port, fwd.connect_host,
937			    fwd.connect_port, options.gateway_ports) < 0) {
938				logit("Port forwarding failed.");
939				goto out;
940			}
941		} else {
942			if (channel_request_remote_forwarding(fwd.listen_host,
943			    fwd.listen_port, fwd.connect_host,
944			    fwd.connect_port) < 0) {
945				logit("Port forwarding failed.");
946				goto out;
947			}
948		}
949
950		logit("Forwarding port.");
951	}
952
953out:
954	signal(SIGINT, handler);
955	enter_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
956	if (cmd)
957		xfree(cmd);
958	if (fwd.listen_host != NULL)
959		xfree(fwd.listen_host);
960	if (fwd.connect_host != NULL)
961		xfree(fwd.connect_host);
962}
963
964/*
965 * Process the characters one by one, call with c==NULL for proto1 case.
966 */
967static int
968process_escapes(Channel *c, Buffer *bin, Buffer *bout, Buffer *berr,
969    char *buf, int len)
970{
971	char string[1024];
972	pid_t pid;
973	int bytes = 0;
974	u_int i;
975	u_char ch;
976	char *s;
977	int *escape_pendingp, escape_char;
978	struct escape_filter_ctx *efc;
979
980	if (c == NULL) {
981		escape_pendingp = &escape_pending1;
982		escape_char = escape_char1;
983	} else {
984		if (c->filter_ctx == NULL)
985			return 0;
986		efc = (struct escape_filter_ctx *)c->filter_ctx;
987		escape_pendingp = &efc->escape_pending;
988		escape_char = efc->escape_char;
989	}
990
991	if (len <= 0)
992		return (0);
993
994	for (i = 0; i < (u_int)len; i++) {
995		/* Get one character at a time. */
996		ch = buf[i];
997
998		if (*escape_pendingp) {
999			/* We have previously seen an escape character. */
1000			/* Clear the flag now. */
1001			*escape_pendingp = 0;
1002
1003			/* Process the escaped character. */
1004			switch (ch) {
1005			case '.':
1006				/* Terminate the connection. */
1007				snprintf(string, sizeof string, "%c.\r\n",
1008				    escape_char);
1009				buffer_append(berr, string, strlen(string));
1010
1011				if (c && c->ctl_chan != -1) {
1012					chan_read_failed(c);
1013					chan_write_failed(c);
1014					return 0;
1015				} else
1016					quit_pending = 1;
1017				return -1;
1018
1019			case 'Z' - 64:
1020				/* XXX support this for mux clients */
1021				if (c && c->ctl_chan != -1) {
1022 noescape:
1023					snprintf(string, sizeof string,
1024					    "%c%c escape not available to "
1025					    "multiplexed sessions\r\n",
1026					    escape_char, ch);
1027					buffer_append(berr, string,
1028					    strlen(string));
1029					continue;
1030				}
1031				/* Suspend the program. Inform the user */
1032				snprintf(string, sizeof string,
1033				    "%c^Z [suspend ssh]\r\n", escape_char);
1034				buffer_append(berr, string, strlen(string));
1035
1036				/* Restore terminal modes and suspend. */
1037				client_suspend_self(bin, bout, berr);
1038
1039				/* We have been continued. */
1040				continue;
1041
1042			case 'B':
1043				if (compat20) {
1044					snprintf(string, sizeof string,
1045					    "%cB\r\n", escape_char);
1046					buffer_append(berr, string,
1047					    strlen(string));
1048					channel_request_start(session_ident,
1049					    "break", 0);
1050					packet_put_int(1000);
1051					packet_send();
1052				}
1053				continue;
1054
1055			case 'R':
1056				if (compat20) {
1057					if (datafellows & SSH_BUG_NOREKEY)
1058						logit("Server does not "
1059						    "support re-keying");
1060					else
1061						need_rekeying = 1;
1062				}
1063				continue;
1064
1065			case '&':
1066				if (c && c->ctl_chan != -1)
1067					goto noescape;
1068				/*
1069				 * Detach the program (continue to serve
1070				 * connections, but put in background and no
1071				 * more new connections).
1072				 */
1073				/* Restore tty modes. */
1074				leave_raw_mode(
1075				    options.request_tty == REQUEST_TTY_FORCE);
1076
1077				/* Stop listening for new connections. */
1078				channel_stop_listening();
1079
1080				snprintf(string, sizeof string,
1081				    "%c& [backgrounded]\n", escape_char);
1082				buffer_append(berr, string, strlen(string));
1083
1084				/* Fork into background. */
1085				pid = fork();
1086				if (pid < 0) {
1087					error("fork: %.100s", strerror(errno));
1088					continue;
1089				}
1090				if (pid != 0) {	/* This is the parent. */
1091					/* The parent just exits. */
1092					exit(0);
1093				}
1094				/* The child continues serving connections. */
1095				if (compat20) {
1096					buffer_append(bin, "\004", 1);
1097					/* fake EOF on stdin */
1098					return -1;
1099				} else if (!stdin_eof) {
1100					/*
1101					 * Sending SSH_CMSG_EOF alone does not
1102					 * always appear to be enough.  So we
1103					 * try to send an EOF character first.
1104					 */
1105					packet_start(SSH_CMSG_STDIN_DATA);
1106					packet_put_string("\004", 1);
1107					packet_send();
1108					/* Close stdin. */
1109					stdin_eof = 1;
1110					if (buffer_len(bin) == 0) {
1111						packet_start(SSH_CMSG_EOF);
1112						packet_send();
1113					}
1114				}
1115				continue;
1116
1117			case '?':
1118				if (c && c->ctl_chan != -1) {
1119					snprintf(string, sizeof string,
1120"%c?\r\n\
1121Supported escape sequences:\r\n\
1122  %c.  - terminate session\r\n\
1123  %cB  - send a BREAK to the remote system\r\n\
1124  %cR  - Request rekey (SSH protocol 2 only)\r\n\
1125  %c#  - list forwarded connections\r\n\
1126  %c?  - this message\r\n\
1127  %c%c  - send the escape character by typing it twice\r\n\
1128(Note that escapes are only recognized immediately after newline.)\r\n",
1129					    escape_char, escape_char,
1130					    escape_char, escape_char,
1131					    escape_char, escape_char,
1132					    escape_char, escape_char);
1133				} else {
1134					snprintf(string, sizeof string,
1135"%c?\r\n\
1136Supported escape sequences:\r\n\
1137  %c.  - terminate connection (and any multiplexed sessions)\r\n\
1138  %cB  - send a BREAK to the remote system\r\n\
1139  %cC  - open a command line\r\n\
1140  %cR  - Request rekey (SSH protocol 2 only)\r\n\
1141  %c^Z - suspend ssh\r\n\
1142  %c#  - list forwarded connections\r\n\
1143  %c&  - background ssh (when waiting for connections to terminate)\r\n\
1144  %c?  - this message\r\n\
1145  %c%c  - send the escape character by typing it twice\r\n\
1146(Note that escapes are only recognized immediately after newline.)\r\n",
1147					    escape_char, escape_char,
1148					    escape_char, escape_char,
1149					    escape_char, escape_char,
1150					    escape_char, escape_char,
1151					    escape_char, escape_char,
1152					    escape_char);
1153				}
1154				buffer_append(berr, string, strlen(string));
1155				continue;
1156
1157			case '#':
1158				snprintf(string, sizeof string, "%c#\r\n",
1159				    escape_char);
1160				buffer_append(berr, string, strlen(string));
1161				s = channel_open_message();
1162				buffer_append(berr, s, strlen(s));
1163				xfree(s);
1164				continue;
1165
1166			case 'C':
1167				if (c && c->ctl_chan != -1)
1168					goto noescape;
1169				process_cmdline();
1170				continue;
1171
1172			default:
1173				if (ch != escape_char) {
1174					buffer_put_char(bin, escape_char);
1175					bytes++;
1176				}
1177				/* Escaped characters fall through here */
1178				break;
1179			}
1180		} else {
1181			/*
1182			 * The previous character was not an escape char.
1183			 * Check if this is an escape.
1184			 */
1185			if (last_was_cr && ch == escape_char) {
1186				/*
1187				 * It is. Set the flag and continue to
1188				 * next character.
1189				 */
1190				*escape_pendingp = 1;
1191				continue;
1192			}
1193		}
1194
1195		/*
1196		 * Normal character.  Record whether it was a newline,
1197		 * and append it to the buffer.
1198		 */
1199		last_was_cr = (ch == '\r' || ch == '\n');
1200		buffer_put_char(bin, ch);
1201		bytes++;
1202	}
1203	return bytes;
1204}
1205
1206static void
1207client_process_input(fd_set *readset)
1208{
1209	int len;
1210	char buf[SSH_IOBUFSZ];
1211
1212	/* Read input from stdin. */
1213	if (FD_ISSET(fileno(stdin), readset)) {
1214		/* Read as much as possible. */
1215		len = read(fileno(stdin), buf, sizeof(buf));
1216		if (len < 0 &&
1217		    (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK))
1218			return;		/* we'll try again later */
1219		if (len <= 0) {
1220			/*
1221			 * Received EOF or error.  They are treated
1222			 * similarly, except that an error message is printed
1223			 * if it was an error condition.
1224			 */
1225			if (len < 0) {
1226				snprintf(buf, sizeof buf, "read: %.100s\r\n",
1227				    strerror(errno));
1228				buffer_append(&stderr_buffer, buf, strlen(buf));
1229			}
1230			/* Mark that we have seen EOF. */
1231			stdin_eof = 1;
1232			/*
1233			 * Send an EOF message to the server unless there is
1234			 * data in the buffer.  If there is data in the
1235			 * buffer, no message will be sent now.  Code
1236			 * elsewhere will send the EOF when the buffer
1237			 * becomes empty if stdin_eof is set.
1238			 */
1239			if (buffer_len(&stdin_buffer) == 0) {
1240				packet_start(SSH_CMSG_EOF);
1241				packet_send();
1242			}
1243		} else if (escape_char1 == SSH_ESCAPECHAR_NONE) {
1244			/*
1245			 * Normal successful read, and no escape character.
1246			 * Just append the data to buffer.
1247			 */
1248			buffer_append(&stdin_buffer, buf, len);
1249		} else {
1250			/*
1251			 * Normal, successful read.  But we have an escape
1252			 * character and have to process the characters one
1253			 * by one.
1254			 */
1255			if (process_escapes(NULL, &stdin_buffer,
1256			    &stdout_buffer, &stderr_buffer, buf, len) == -1)
1257				return;
1258		}
1259	}
1260}
1261
1262static void
1263client_process_output(fd_set *writeset)
1264{
1265	int len;
1266	char buf[100];
1267
1268	/* Write buffered output to stdout. */
1269	if (FD_ISSET(fileno(stdout), writeset)) {
1270		/* Write as much data as possible. */
1271		len = write(fileno(stdout), buffer_ptr(&stdout_buffer),
1272		    buffer_len(&stdout_buffer));
1273		if (len <= 0) {
1274			if (errno == EINTR || errno == EAGAIN ||
1275			    errno == EWOULDBLOCK)
1276				len = 0;
1277			else {
1278				/*
1279				 * An error or EOF was encountered.  Put an
1280				 * error message to stderr buffer.
1281				 */
1282				snprintf(buf, sizeof buf,
1283				    "write stdout: %.50s\r\n", strerror(errno));
1284				buffer_append(&stderr_buffer, buf, strlen(buf));
1285				quit_pending = 1;
1286				return;
1287			}
1288		}
1289		/* Consume printed data from the buffer. */
1290		buffer_consume(&stdout_buffer, len);
1291	}
1292	/* Write buffered output to stderr. */
1293	if (FD_ISSET(fileno(stderr), writeset)) {
1294		/* Write as much data as possible. */
1295		len = write(fileno(stderr), buffer_ptr(&stderr_buffer),
1296		    buffer_len(&stderr_buffer));
1297		if (len <= 0) {
1298			if (errno == EINTR || errno == EAGAIN ||
1299			    errno == EWOULDBLOCK)
1300				len = 0;
1301			else {
1302				/*
1303				 * EOF or error, but can't even print
1304				 * error message.
1305				 */
1306				quit_pending = 1;
1307				return;
1308			}
1309		}
1310		/* Consume printed characters from the buffer. */
1311		buffer_consume(&stderr_buffer, len);
1312	}
1313}
1314
1315/*
1316 * Get packets from the connection input buffer, and process them as long as
1317 * there are packets available.
1318 *
1319 * Any unknown packets received during the actual
1320 * session cause the session to terminate.  This is
1321 * intended to make debugging easier since no
1322 * confirmations are sent.  Any compatible protocol
1323 * extensions must be negotiated during the
1324 * preparatory phase.
1325 */
1326
1327static void
1328client_process_buffered_input_packets(void)
1329{
1330	dispatch_run(DISPATCH_NONBLOCK, &quit_pending,
1331	    compat20 ? xxx_kex : NULL);
1332}
1333
1334/* scan buf[] for '~' before sending data to the peer */
1335
1336/* Helper: allocate a new escape_filter_ctx and fill in its escape char */
1337void *
1338client_new_escape_filter_ctx(int escape_char)
1339{
1340	struct escape_filter_ctx *ret;
1341
1342	ret = xmalloc(sizeof(*ret));
1343	ret->escape_pending = 0;
1344	ret->escape_char = escape_char;
1345	return (void *)ret;
1346}
1347
1348/* Free the escape filter context on channel free */
1349void
1350client_filter_cleanup(int cid, void *ctx)
1351{
1352	xfree(ctx);
1353}
1354
1355int
1356client_simple_escape_filter(Channel *c, char *buf, int len)
1357{
1358	if (c->extended_usage != CHAN_EXTENDED_WRITE)
1359		return 0;
1360
1361	return process_escapes(c, &c->input, &c->output, &c->extended,
1362	    buf, len);
1363}
1364
1365static void
1366client_channel_closed(int id, void *arg)
1367{
1368	channel_cancel_cleanup(id);
1369	session_closed = 1;
1370	leave_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
1371}
1372
1373/*
1374 * Implements the interactive session with the server.  This is called after
1375 * the user has been authenticated, and a command has been started on the
1376 * remote host.  If escape_char != SSH_ESCAPECHAR_NONE, it is the character
1377 * used as an escape character for terminating or suspending the session.
1378 */
1379
1380int
1381client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
1382{
1383	fd_set *readset = NULL, *writeset = NULL;
1384	double start_time, total_time;
1385	int max_fd = 0, max_fd2 = 0, len, rekeying = 0;
1386	u_int64_t ibytes, obytes;
1387	u_int nalloc = 0;
1388	char buf[100];
1389
1390	debug("Entering interactive session.");
1391
1392	start_time = get_current_time();
1393
1394	/* Initialize variables. */
1395	escape_pending1 = 0;
1396	last_was_cr = 1;
1397	exit_status = -1;
1398	stdin_eof = 0;
1399	buffer_high = 64 * 1024;
1400	connection_in = packet_get_connection_in();
1401	connection_out = packet_get_connection_out();
1402	max_fd = MAX(connection_in, connection_out);
1403
1404	if (!compat20) {
1405		/* enable nonblocking unless tty */
1406		if (!isatty(fileno(stdin)))
1407			set_nonblock(fileno(stdin));
1408		if (!isatty(fileno(stdout)))
1409			set_nonblock(fileno(stdout));
1410		if (!isatty(fileno(stderr)))
1411			set_nonblock(fileno(stderr));
1412		max_fd = MAX(max_fd, fileno(stdin));
1413		max_fd = MAX(max_fd, fileno(stdout));
1414		max_fd = MAX(max_fd, fileno(stderr));
1415	}
1416	quit_pending = 0;
1417	escape_char1 = escape_char_arg;
1418
1419	/* Initialize buffers. */
1420	buffer_init(&stdin_buffer);
1421	buffer_init(&stdout_buffer);
1422	buffer_init(&stderr_buffer);
1423
1424	client_init_dispatch();
1425
1426	/*
1427	 * Set signal handlers, (e.g. to restore non-blocking mode)
1428	 * but don't overwrite SIG_IGN, matches behaviour from rsh(1)
1429	 */
1430	if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
1431		signal(SIGHUP, signal_handler);
1432	if (signal(SIGINT, SIG_IGN) != SIG_IGN)
1433		signal(SIGINT, signal_handler);
1434	if (signal(SIGQUIT, SIG_IGN) != SIG_IGN)
1435		signal(SIGQUIT, signal_handler);
1436	if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
1437		signal(SIGTERM, signal_handler);
1438	signal(SIGWINCH, window_change_handler);
1439
1440	if (have_pty)
1441		enter_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
1442
1443	if (compat20) {
1444		session_ident = ssh2_chan_id;
1445		if (session_ident != -1) {
1446			if (escape_char_arg != SSH_ESCAPECHAR_NONE) {
1447				channel_register_filter(session_ident,
1448				    client_simple_escape_filter, NULL,
1449				    client_filter_cleanup,
1450				    client_new_escape_filter_ctx(
1451				    escape_char_arg));
1452			}
1453			channel_register_cleanup(session_ident,
1454			    client_channel_closed, 0);
1455		}
1456	} else {
1457		/* Check if we should immediately send eof on stdin. */
1458		client_check_initial_eof_on_stdin();
1459	}
1460
1461	/* Main loop of the client for the interactive session mode. */
1462	while (!quit_pending) {
1463
1464		/* Process buffered packets sent by the server. */
1465		client_process_buffered_input_packets();
1466
1467		if (compat20 && session_closed && !channel_still_open())
1468			break;
1469
1470		rekeying = (xxx_kex != NULL && !xxx_kex->done);
1471
1472		if (rekeying) {
1473			debug("rekeying in progress");
1474		} else {
1475			/*
1476			 * Make packets of buffered stdin data, and buffer
1477			 * them for sending to the server.
1478			 */
1479			if (!compat20)
1480				client_make_packets_from_stdin_data();
1481
1482			/*
1483			 * Make packets from buffered channel data, and
1484			 * enqueue them for sending to the server.
1485			 */
1486			if (packet_not_very_much_data_to_write())
1487				channel_output_poll();
1488
1489			/*
1490			 * Check if the window size has changed, and buffer a
1491			 * message about it to the server if so.
1492			 */
1493			client_check_window_change();
1494
1495			if (quit_pending)
1496				break;
1497		}
1498		/*
1499		 * Wait until we have something to do (something becomes
1500		 * available on one of the descriptors).
1501		 */
1502		max_fd2 = max_fd;
1503		client_wait_until_can_do_something(&readset, &writeset,
1504		    &max_fd2, &nalloc, rekeying);
1505
1506		if (quit_pending)
1507			break;
1508
1509		/* Do channel operations unless rekeying in progress. */
1510		if (!rekeying) {
1511			channel_after_select(readset, writeset);
1512			if (need_rekeying || packet_need_rekeying()) {
1513				debug("need rekeying");
1514				xxx_kex->done = 0;
1515				kex_send_kexinit(xxx_kex);
1516				need_rekeying = 0;
1517			}
1518		}
1519
1520		/* Buffer input from the connection.  */
1521		client_process_net_input(readset);
1522
1523		if (quit_pending)
1524			break;
1525
1526		if (!compat20) {
1527			/* Buffer data from stdin */
1528			client_process_input(readset);
1529			/*
1530			 * Process output to stdout and stderr.  Output to
1531			 * the connection is processed elsewhere (above).
1532			 */
1533			client_process_output(writeset);
1534		}
1535
1536		if (session_resumed) {
1537			connection_in = packet_get_connection_in();
1538			connection_out = packet_get_connection_out();
1539			max_fd = MAX(max_fd, connection_out);
1540			max_fd = MAX(max_fd, connection_in);
1541			session_resumed = 0;
1542		}
1543
1544		/*
1545		 * Send as much buffered packet data as possible to the
1546		 * sender.
1547		 */
1548		if (FD_ISSET(connection_out, writeset))
1549			packet_write_poll();
1550
1551		/*
1552		 * If we are a backgrounded control master, and the
1553		 * timeout has expired without any active client
1554		 * connections, then quit.
1555		 */
1556		if (control_persist_exit_time > 0) {
1557			if (time(NULL) >= control_persist_exit_time) {
1558				debug("ControlPersist timeout expired");
1559				break;
1560			}
1561		}
1562	}
1563	if (readset)
1564		xfree(readset);
1565	if (writeset)
1566		xfree(writeset);
1567
1568	/* Terminate the session. */
1569
1570	/* Stop watching for window change. */
1571	signal(SIGWINCH, SIG_DFL);
1572
1573	if (compat20) {
1574		packet_start(SSH2_MSG_DISCONNECT);
1575		packet_put_int(SSH2_DISCONNECT_BY_APPLICATION);
1576		packet_put_cstring("disconnected by user");
1577		packet_put_cstring(""); /* language tag */
1578		packet_send();
1579		packet_write_wait();
1580	}
1581
1582	channel_free_all();
1583
1584	if (have_pty)
1585		leave_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
1586
1587	/* restore blocking io */
1588	if (!isatty(fileno(stdin)))
1589		unset_nonblock(fileno(stdin));
1590	if (!isatty(fileno(stdout)))
1591		unset_nonblock(fileno(stdout));
1592	if (!isatty(fileno(stderr)))
1593		unset_nonblock(fileno(stderr));
1594
1595	/*
1596	 * If there was no shell or command requested, there will be no remote
1597	 * exit status to be returned.  In that case, clear error code if the
1598	 * connection was deliberately terminated at this end.
1599	 */
1600	if (no_shell_flag && received_signal == SIGTERM) {
1601		received_signal = 0;
1602		exit_status = 0;
1603	}
1604
1605	if (received_signal)
1606		fatal("Killed by signal %d.", (int) received_signal);
1607
1608	/*
1609	 * In interactive mode (with pseudo tty) display a message indicating
1610	 * that the connection has been closed.
1611	 */
1612	if (have_pty && options.log_level != SYSLOG_LEVEL_QUIET) {
1613		snprintf(buf, sizeof buf,
1614		    "Connection to %.64s closed.\r\n", host);
1615		buffer_append(&stderr_buffer, buf, strlen(buf));
1616	}
1617
1618	/* Output any buffered data for stdout. */
1619	if (buffer_len(&stdout_buffer) > 0) {
1620		len = atomicio(vwrite, fileno(stdout),
1621		    buffer_ptr(&stdout_buffer), buffer_len(&stdout_buffer));
1622		if (len < 0 || (u_int)len != buffer_len(&stdout_buffer))
1623			error("Write failed flushing stdout buffer.");
1624		else
1625			buffer_consume(&stdout_buffer, len);
1626	}
1627
1628	/* Output any buffered data for stderr. */
1629	if (buffer_len(&stderr_buffer) > 0) {
1630		len = atomicio(vwrite, fileno(stderr),
1631		    buffer_ptr(&stderr_buffer), buffer_len(&stderr_buffer));
1632		if (len < 0 || (u_int)len != buffer_len(&stderr_buffer))
1633			error("Write failed flushing stderr buffer.");
1634		else
1635			buffer_consume(&stderr_buffer, len);
1636	}
1637
1638	/* Clear and free any buffers. */
1639	memset(buf, 0, sizeof(buf));
1640	buffer_free(&stdin_buffer);
1641	buffer_free(&stdout_buffer);
1642	buffer_free(&stderr_buffer);
1643
1644	/* Report bytes transferred, and transfer rates. */
1645	total_time = get_current_time() - start_time;
1646	packet_get_state(MODE_IN, NULL, NULL, NULL, &ibytes);
1647	packet_get_state(MODE_OUT, NULL, NULL, NULL, &obytes);
1648	verbose("Transferred: sent %llu, received %llu bytes, in %.1f seconds",
1649	    (unsigned long long)obytes, (unsigned long long)ibytes, total_time);
1650	if (total_time > 0)
1651		verbose("Bytes per second: sent %.1f, received %.1f",
1652		    obytes / total_time, ibytes / total_time);
1653	/* Return the exit status of the program. */
1654	debug("Exit status %d", exit_status);
1655	return exit_status;
1656}
1657
1658/*********/
1659
1660static void
1661client_input_stdout_data(int type, u_int32_t seq, void *ctxt)
1662{
1663	u_int data_len;
1664	char *data = packet_get_string(&data_len);
1665	packet_check_eom();
1666	buffer_append(&stdout_buffer, data, data_len);
1667	memset(data, 0, data_len);
1668	xfree(data);
1669}
1670static void
1671client_input_stderr_data(int type, u_int32_t seq, void *ctxt)
1672{
1673	u_int data_len;
1674	char *data = packet_get_string(&data_len);
1675	packet_check_eom();
1676	buffer_append(&stderr_buffer, data, data_len);
1677	memset(data, 0, data_len);
1678	xfree(data);
1679}
1680static void
1681client_input_exit_status(int type, u_int32_t seq, void *ctxt)
1682{
1683	exit_status = packet_get_int();
1684	packet_check_eom();
1685	/* Acknowledge the exit. */
1686	packet_start(SSH_CMSG_EXIT_CONFIRMATION);
1687	packet_send();
1688	/*
1689	 * Must wait for packet to be sent since we are
1690	 * exiting the loop.
1691	 */
1692	packet_write_wait();
1693	/* Flag that we want to exit. */
1694	quit_pending = 1;
1695}
1696static void
1697client_input_agent_open(int type, u_int32_t seq, void *ctxt)
1698{
1699	Channel *c = NULL;
1700	int remote_id, sock;
1701
1702	/* Read the remote channel number from the message. */
1703	remote_id = packet_get_int();
1704	packet_check_eom();
1705
1706	/*
1707	 * Get a connection to the local authentication agent (this may again
1708	 * get forwarded).
1709	 */
1710	sock = ssh_get_authentication_socket();
1711
1712	/*
1713	 * If we could not connect the agent, send an error message back to
1714	 * the server. This should never happen unless the agent dies,
1715	 * because authentication forwarding is only enabled if we have an
1716	 * agent.
1717	 */
1718	if (sock >= 0) {
1719		c = channel_new("", SSH_CHANNEL_OPEN, sock, sock,
1720		    -1, 0, 0, 0, "authentication agent connection", 1);
1721		c->remote_id = remote_id;
1722		c->force_drain = 1;
1723	}
1724	if (c == NULL) {
1725		packet_start(SSH_MSG_CHANNEL_OPEN_FAILURE);
1726		packet_put_int(remote_id);
1727	} else {
1728		/* Send a confirmation to the remote host. */
1729		debug("Forwarding authentication connection.");
1730		packet_start(SSH_MSG_CHANNEL_OPEN_CONFIRMATION);
1731		packet_put_int(remote_id);
1732		packet_put_int(c->self);
1733	}
1734	packet_send();
1735}
1736
1737static Channel *
1738client_request_forwarded_tcpip(const char *request_type, int rchan)
1739{
1740	Channel *c = NULL;
1741	char *listen_address, *originator_address;
1742	u_short listen_port, originator_port;
1743
1744	/* Get rest of the packet */
1745	listen_address = packet_get_string(NULL);
1746	listen_port = packet_get_int();
1747	originator_address = packet_get_string(NULL);
1748	originator_port = packet_get_int();
1749	packet_check_eom();
1750
1751	debug("client_request_forwarded_tcpip: listen %s port %d, "
1752	    "originator %s port %d", listen_address, listen_port,
1753	    originator_address, originator_port);
1754
1755	c = channel_connect_by_listen_address(listen_port,
1756	    "forwarded-tcpip", originator_address);
1757
1758	xfree(originator_address);
1759	xfree(listen_address);
1760	return c;
1761}
1762
1763static Channel *
1764client_request_x11(const char *request_type, int rchan)
1765{
1766	Channel *c = NULL;
1767	char *originator;
1768	u_short originator_port;
1769	int sock;
1770
1771	if (!options.forward_x11) {
1772		error("Warning: ssh server tried X11 forwarding.");
1773		error("Warning: this is probably a break-in attempt by a "
1774		    "malicious server.");
1775		return NULL;
1776	}
1777	if (x11_refuse_time != 0 && time(NULL) >= x11_refuse_time) {
1778		verbose("Rejected X11 connection after ForwardX11Timeout "
1779		    "expired");
1780		return NULL;
1781	}
1782	originator = packet_get_string(NULL);
1783	if (datafellows & SSH_BUG_X11FWD) {
1784		debug2("buggy server: x11 request w/o originator_port");
1785		originator_port = 0;
1786	} else {
1787		originator_port = packet_get_int();
1788	}
1789	packet_check_eom();
1790	/* XXX check permission */
1791	debug("client_request_x11: request from %s %d", originator,
1792	    originator_port);
1793	xfree(originator);
1794	sock = x11_connect_display();
1795	if (sock < 0)
1796		return NULL;
1797	if (options.hpn_disabled)
1798		c = channel_new("x11", SSH_CHANNEL_X11_OPEN, sock, sock, -1,
1799		    CHAN_TCP_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
1800		    0, "x11", 1);
1801	else
1802		c = channel_new("x11", SSH_CHANNEL_X11_OPEN, sock, sock, -1,
1803		    options.hpn_buffer_size, CHAN_X11_PACKET_DEFAULT,
1804		    0, "x11", 1);
1805	c->force_drain = 1;
1806	return c;
1807}
1808
1809static Channel *
1810client_request_agent(const char *request_type, int rchan)
1811{
1812	Channel *c = NULL;
1813	int sock;
1814
1815	if (!options.forward_agent) {
1816		error("Warning: ssh server tried agent forwarding.");
1817		error("Warning: this is probably a break-in attempt by a "
1818		    "malicious server.");
1819		return NULL;
1820	}
1821	sock = ssh_get_authentication_socket();
1822	if (sock < 0)
1823		return NULL;
1824	if (options.hpn_disabled)
1825		c = channel_new("authentication agent connection",
1826		    SSH_CHANNEL_OPEN, sock, sock, -1,
1827		    CHAN_X11_WINDOW_DEFAULT, CHAN_TCP_WINDOW_DEFAULT, 0,
1828		    "authentication agent connection", 1);
1829	else
1830		c = channel_new("authentication agent connection",
1831		    SSH_CHANNEL_OPEN, sock, sock, -1,
1832		    options.hpn_buffer_size, options.hpn_buffer_size, 0,
1833		    "authentication agent connection", 1);
1834	c->force_drain = 1;
1835	return c;
1836}
1837
1838int
1839client_request_tun_fwd(int tun_mode, int local_tun, int remote_tun)
1840{
1841	Channel *c;
1842	int fd;
1843
1844	if (tun_mode == SSH_TUNMODE_NO)
1845		return 0;
1846
1847	if (!compat20) {
1848		error("Tunnel forwarding is not supported for protocol 1");
1849		return -1;
1850	}
1851
1852	debug("Requesting tun unit %d in mode %d", local_tun, tun_mode);
1853
1854	/* Open local tunnel device */
1855	if ((fd = tun_open(local_tun, tun_mode)) == -1) {
1856		error("Tunnel device open failed.");
1857		return -1;
1858	}
1859
1860	if (options.hpn_disabled)
1861		c = channel_new("tun", SSH_CHANNEL_OPENING, fd, fd, -1,
1862		    CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT,
1863		    0, "tun", 1);
1864	else
1865		c = channel_new("tun", SSH_CHANNEL_OPENING, fd, fd, -1,
1866		    options.hpn_buffer_size, CHAN_TCP_PACKET_DEFAULT,
1867		    0, "tun", 1);
1868	c->datagram = 1;
1869
1870#if defined(SSH_TUN_FILTER)
1871	if (options.tun_open == SSH_TUNMODE_POINTOPOINT)
1872		channel_register_filter(c->self, sys_tun_infilter,
1873		    sys_tun_outfilter, NULL, NULL);
1874#endif
1875
1876	packet_start(SSH2_MSG_CHANNEL_OPEN);
1877	packet_put_cstring("tun@openssh.com");
1878	packet_put_int(c->self);
1879	packet_put_int(c->local_window_max);
1880	packet_put_int(c->local_maxpacket);
1881	packet_put_int(tun_mode);
1882	packet_put_int(remote_tun);
1883	packet_send();
1884
1885	return 0;
1886}
1887
1888/* XXXX move to generic input handler */
1889static void
1890client_input_channel_open(int type, u_int32_t seq, void *ctxt)
1891{
1892	Channel *c = NULL;
1893	char *ctype;
1894	int rchan;
1895	u_int rmaxpack, rwindow, len;
1896
1897	ctype = packet_get_string(&len);
1898	rchan = packet_get_int();
1899	rwindow = packet_get_int();
1900	rmaxpack = packet_get_int();
1901
1902	debug("client_input_channel_open: ctype %s rchan %d win %d max %d",
1903	    ctype, rchan, rwindow, rmaxpack);
1904
1905	if (strcmp(ctype, "forwarded-tcpip") == 0) {
1906		c = client_request_forwarded_tcpip(ctype, rchan);
1907	} else if (strcmp(ctype, "x11") == 0) {
1908		c = client_request_x11(ctype, rchan);
1909	} else if (strcmp(ctype, "auth-agent@openssh.com") == 0) {
1910		c = client_request_agent(ctype, rchan);
1911	}
1912/* XXX duplicate : */
1913	if (c != NULL) {
1914		debug("confirm %s", ctype);
1915		c->remote_id = rchan;
1916		c->remote_window = rwindow;
1917		c->remote_maxpacket = rmaxpack;
1918		if (c->type != SSH_CHANNEL_CONNECTING) {
1919			packet_start(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
1920			packet_put_int(c->remote_id);
1921			packet_put_int(c->self);
1922			packet_put_int(c->local_window);
1923			packet_put_int(c->local_maxpacket);
1924			packet_send();
1925		}
1926	} else {
1927		debug("failure %s", ctype);
1928		packet_start(SSH2_MSG_CHANNEL_OPEN_FAILURE);
1929		packet_put_int(rchan);
1930		packet_put_int(SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED);
1931		if (!(datafellows & SSH_BUG_OPENFAILURE)) {
1932			packet_put_cstring("open failed");
1933			packet_put_cstring("");
1934		}
1935		packet_send();
1936	}
1937	xfree(ctype);
1938}
1939static void
1940client_input_channel_req(int type, u_int32_t seq, void *ctxt)
1941{
1942	Channel *c = NULL;
1943	int exitval, id, reply, success = 0;
1944	char *rtype;
1945
1946	id = packet_get_int();
1947	rtype = packet_get_string(NULL);
1948	reply = packet_get_char();
1949
1950	debug("client_input_channel_req: channel %d rtype %s reply %d",
1951	    id, rtype, reply);
1952
1953	if (id == -1) {
1954		error("client_input_channel_req: request for channel -1");
1955	} else if ((c = channel_lookup(id)) == NULL) {
1956		error("client_input_channel_req: channel %d: "
1957		    "unknown channel", id);
1958	} else if (strcmp(rtype, "eow@openssh.com") == 0) {
1959		packet_check_eom();
1960		chan_rcvd_eow(c);
1961	} else if (strcmp(rtype, "exit-status") == 0) {
1962		exitval = packet_get_int();
1963		if (c->ctl_chan != -1) {
1964			mux_exit_message(c, exitval);
1965			success = 1;
1966		} else if (id == session_ident) {
1967			/* Record exit value of local session */
1968			success = 1;
1969			exit_status = exitval;
1970		} else {
1971			/* Probably for a mux channel that has already closed */
1972			debug("%s: no sink for exit-status on channel %d",
1973			    __func__, id);
1974		}
1975		packet_check_eom();
1976	}
1977	if (reply && c != NULL) {
1978		packet_start(success ?
1979		    SSH2_MSG_CHANNEL_SUCCESS : SSH2_MSG_CHANNEL_FAILURE);
1980		packet_put_int(c->remote_id);
1981		packet_send();
1982	}
1983	xfree(rtype);
1984}
1985static void
1986client_input_global_request(int type, u_int32_t seq, void *ctxt)
1987{
1988	char *rtype;
1989	int want_reply;
1990	int success = 0;
1991
1992	rtype = packet_get_string(NULL);
1993	want_reply = packet_get_char();
1994	debug("client_input_global_request: rtype %s want_reply %d",
1995	    rtype, want_reply);
1996	if (want_reply) {
1997		packet_start(success ?
1998		    SSH2_MSG_REQUEST_SUCCESS : SSH2_MSG_REQUEST_FAILURE);
1999		packet_send();
2000		packet_write_wait();
2001	}
2002	xfree(rtype);
2003}
2004
2005void
2006client_session2_setup(int id, int want_tty, int want_subsystem,
2007    const char *term, struct termios *tiop, int in_fd, Buffer *cmd, char **env)
2008{
2009	int len;
2010	Channel *c = NULL;
2011
2012	debug2("%s: id %d", __func__, id);
2013
2014	if ((c = channel_lookup(id)) == NULL)
2015		fatal("client_session2_setup: channel %d: unknown channel", id);
2016
2017	packet_set_interactive(want_tty,
2018	    options.ip_qos_interactive, options.ip_qos_bulk);
2019
2020	if (want_tty) {
2021		struct winsize ws;
2022
2023		/* Store window size in the packet. */
2024		if (ioctl(in_fd, TIOCGWINSZ, &ws) < 0)
2025			memset(&ws, 0, sizeof(ws));
2026
2027		channel_request_start(id, "pty-req", 1);
2028		client_expect_confirm(id, "PTY allocation", CONFIRM_TTY);
2029		packet_put_cstring(term != NULL ? term : "");
2030		packet_put_int((u_int)ws.ws_col);
2031		packet_put_int((u_int)ws.ws_row);
2032		packet_put_int((u_int)ws.ws_xpixel);
2033		packet_put_int((u_int)ws.ws_ypixel);
2034		if (tiop == NULL)
2035			tiop = get_saved_tio();
2036		tty_make_modes(-1, tiop);
2037		packet_send();
2038		/* XXX wait for reply */
2039		c->client_tty = 1;
2040	}
2041
2042	/* Transfer any environment variables from client to server */
2043	if (options.num_send_env != 0 && env != NULL) {
2044		int i, j, matched;
2045		char *name, *val;
2046
2047		debug("Sending environment.");
2048		for (i = 0; env[i] != NULL; i++) {
2049			/* Split */
2050			name = xstrdup(env[i]);
2051			if ((val = strchr(name, '=')) == NULL) {
2052				xfree(name);
2053				continue;
2054			}
2055			*val++ = '\0';
2056
2057			matched = 0;
2058			for (j = 0; j < options.num_send_env; j++) {
2059				if (match_pattern(name, options.send_env[j])) {
2060					matched = 1;
2061					break;
2062				}
2063			}
2064			if (!matched) {
2065				debug3("Ignored env %s", name);
2066				xfree(name);
2067				continue;
2068			}
2069
2070			debug("Sending env %s = %s", name, val);
2071			channel_request_start(id, "env", 0);
2072			packet_put_cstring(name);
2073			packet_put_cstring(val);
2074			packet_send();
2075			xfree(name);
2076		}
2077	}
2078
2079	len = buffer_len(cmd);
2080	if (len > 0) {
2081		if (len > 900)
2082			len = 900;
2083		if (want_subsystem) {
2084			debug("Sending subsystem: %.*s",
2085			    len, (u_char*)buffer_ptr(cmd));
2086			channel_request_start(id, "subsystem", 1);
2087			client_expect_confirm(id, "subsystem", CONFIRM_CLOSE);
2088		} else {
2089			debug("Sending command: %.*s",
2090			    len, (u_char*)buffer_ptr(cmd));
2091			channel_request_start(id, "exec", 1);
2092			client_expect_confirm(id, "exec", CONFIRM_CLOSE);
2093		}
2094		packet_put_string(buffer_ptr(cmd), buffer_len(cmd));
2095		packet_send();
2096	} else {
2097		channel_request_start(id, "shell", 1);
2098		client_expect_confirm(id, "shell", CONFIRM_CLOSE);
2099		packet_send();
2100	}
2101}
2102
2103static void
2104client_init_dispatch_20(void)
2105{
2106	dispatch_init(&dispatch_protocol_error);
2107
2108	dispatch_set(SSH2_MSG_CHANNEL_CLOSE, &channel_input_oclose);
2109	dispatch_set(SSH2_MSG_CHANNEL_DATA, &channel_input_data);
2110	dispatch_set(SSH2_MSG_CHANNEL_EOF, &channel_input_ieof);
2111	dispatch_set(SSH2_MSG_CHANNEL_EXTENDED_DATA, &channel_input_extended_data);
2112	dispatch_set(SSH2_MSG_CHANNEL_OPEN, &client_input_channel_open);
2113	dispatch_set(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, &channel_input_open_confirmation);
2114	dispatch_set(SSH2_MSG_CHANNEL_OPEN_FAILURE, &channel_input_open_failure);
2115	dispatch_set(SSH2_MSG_CHANNEL_REQUEST, &client_input_channel_req);
2116	dispatch_set(SSH2_MSG_CHANNEL_WINDOW_ADJUST, &channel_input_window_adjust);
2117	dispatch_set(SSH2_MSG_CHANNEL_SUCCESS, &channel_input_status_confirm);
2118	dispatch_set(SSH2_MSG_CHANNEL_FAILURE, &channel_input_status_confirm);
2119	dispatch_set(SSH2_MSG_GLOBAL_REQUEST, &client_input_global_request);
2120
2121	/* rekeying */
2122	dispatch_set(SSH2_MSG_KEXINIT, &kex_input_kexinit);
2123
2124	/* global request reply messages */
2125	dispatch_set(SSH2_MSG_REQUEST_FAILURE, &client_global_request_reply);
2126	dispatch_set(SSH2_MSG_REQUEST_SUCCESS, &client_global_request_reply);
2127}
2128
2129static void
2130client_init_dispatch_13(void)
2131{
2132	dispatch_init(NULL);
2133	dispatch_set(SSH_MSG_CHANNEL_CLOSE, &channel_input_close);
2134	dispatch_set(SSH_MSG_CHANNEL_CLOSE_CONFIRMATION, &channel_input_close_confirmation);
2135	dispatch_set(SSH_MSG_CHANNEL_DATA, &channel_input_data);
2136	dispatch_set(SSH_MSG_CHANNEL_OPEN_CONFIRMATION, &channel_input_open_confirmation);
2137	dispatch_set(SSH_MSG_CHANNEL_OPEN_FAILURE, &channel_input_open_failure);
2138	dispatch_set(SSH_MSG_PORT_OPEN, &channel_input_port_open);
2139	dispatch_set(SSH_SMSG_EXITSTATUS, &client_input_exit_status);
2140	dispatch_set(SSH_SMSG_STDERR_DATA, &client_input_stderr_data);
2141	dispatch_set(SSH_SMSG_STDOUT_DATA, &client_input_stdout_data);
2142
2143	dispatch_set(SSH_SMSG_AGENT_OPEN, options.forward_agent ?
2144	    &client_input_agent_open : &deny_input_open);
2145	dispatch_set(SSH_SMSG_X11_OPEN, options.forward_x11 ?
2146	    &x11_input_open : &deny_input_open);
2147}
2148
2149static void
2150client_init_dispatch_15(void)
2151{
2152	client_init_dispatch_13();
2153	dispatch_set(SSH_MSG_CHANNEL_CLOSE, &channel_input_ieof);
2154	dispatch_set(SSH_MSG_CHANNEL_CLOSE_CONFIRMATION, & channel_input_oclose);
2155}
2156
2157static void
2158client_init_dispatch(void)
2159{
2160	if (compat20)
2161		client_init_dispatch_20();
2162	else if (compat13)
2163		client_init_dispatch_13();
2164	else
2165		client_init_dispatch_15();
2166}
2167
2168void
2169client_stop_mux(void)
2170{
2171	if (options.control_path != NULL && muxserver_sock != -1)
2172		unlink(options.control_path);
2173	/*
2174	 * If we are in persist mode, signal that we should close when all
2175	 * active channels are closed.
2176	 */
2177	if (options.control_persist) {
2178		session_closed = 1;
2179		setproctitle("[stopped mux]");
2180	}
2181}
2182
2183/* client specific fatal cleanup */
2184void
2185cleanup_exit(int i)
2186{
2187	leave_raw_mode(options.request_tty == REQUEST_TTY_FORCE);
2188	leave_non_blocking();
2189	if (options.control_path != NULL && muxserver_sock != -1)
2190		unlink(options.control_path);
2191	ssh_kill_proxy_command();
2192	_exit(i);
2193}
2194