1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/*
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Dropbear - a SSH2 server
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 2002,2003 Matt Johnston
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * All rights reserved.
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * in the Software without restriction, including without limitation the rights
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * copies of the Software, and to permit persons to whom the Software is
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * furnished to do so, subject to the following conditions:
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The above copyright notice and this permission notice shall be included in
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * all copies or substantial portions of the Software.
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * SOFTWARE. */
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "includes.h"
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "session.h"
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "dbutil.h"
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "packet.h"
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "algo.h"
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "buffer.h"
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "dss.h"
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "ssh.h"
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "random.h"
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "kex.h"
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "channel.h"
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "chansession.h"
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "atomicio.h"
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "tcpfwd.h"
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "service.h"
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "auth.h"
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "runopts.h"
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic void svr_remoteclosed();
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstruct serversession svr_ses; /* GLOBAL */
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const packettype svr_packettypes[] = {
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_CHANNEL_DATA, recv_msg_channel_data},
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_CHANNEL_WINDOW_ADJUST, recv_msg_channel_window_adjust},
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_USERAUTH_REQUEST, recv_msg_userauth_request}, /* server */
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_SERVICE_REQUEST, recv_msg_service_request}, /* server */
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_KEXINIT, recv_msg_kexinit},
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_KEXDH_INIT, recv_msg_kexdh_init}, /* server */
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_NEWKEYS, recv_msg_newkeys},
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_SVR_REMOTETCPFWD
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_GLOBAL_REQUEST, recv_msg_global_request_remotetcp},
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_CHANNEL_REQUEST, recv_msg_channel_request},
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_CHANNEL_OPEN, recv_msg_channel_open},
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_CHANNEL_EOF, recv_msg_channel_eof},
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_CHANNEL_CLOSE, recv_msg_channel_close},
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef USING_LISTENERS
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_CHANNEL_OPEN_CONFIRMATION, recv_msg_channel_open_confirmation},
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{SSH_MSG_CHANNEL_OPEN_FAILURE, recv_msg_channel_open_failure},
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{0, 0} /* End */
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project};
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const struct ChanType *svr_chantypes[] = {
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	&svrchansess,
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_SVR_LOCALTCPFWD
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	&svr_chan_tcpdirect,
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	NULL /* Null termination is mandatory. */
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project};
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid svr_session(int sock, int childpipe,
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		char* remotehost, char *addrstring) {
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct timeval timeout;
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    reseedrandom();
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	crypto_init();
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	common_session_init(sock, remotehost);
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* Initialise server specific parts of the session */
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	svr_ses.childpipe = childpipe;
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	svr_ses.addrstring = addrstring;
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	svr_authinitialise();
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	chaninitialise(svr_chantypes);
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	svr_chansessinitialise();
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (gettimeofday(&timeout, 0) < 0) {
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_exit("Error getting time");
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ses.connecttimeout = timeout.tv_sec + AUTH_TIMEOUT;
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* set up messages etc */
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ses.remoteclosed = svr_remoteclosed;
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* packet handlers */
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ses.packettypes = svr_packettypes;
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ses.buf_match_algo = svr_buf_match_algo;
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ses.isserver = 1;
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* We're ready to go now */
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	sessinitdone = 1;
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* exchange identification, version etc */
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	session_identification();
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* start off with key exchange */
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	send_msg_kexinit();
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* Run the main for loop. NULL is for the dispatcher - only the client
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 * code makes use of it */
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	session_loop(NULL);
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* Not reached */
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* failure exit - format must be <= 100 chars */
127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid svr_dropbear_exit(int exitcode, const char* format, va_list param) {
128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	char fmtbuf[300];
130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (!sessinitdone) {
132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		/* before session init */
133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		snprintf(fmtbuf, sizeof(fmtbuf),
134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				"premature exit: %s", format);
135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	} else if (ses.authstate.authdone) {
136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		/* user has authenticated */
137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		snprintf(fmtbuf, sizeof(fmtbuf),
138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				"exit after auth (%s): %s",
139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				ses.authstate.printableuser, format);
140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	} else if (ses.authstate.printableuser) {
141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		/* we have a potential user */
142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		snprintf(fmtbuf, sizeof(fmtbuf),
143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				"exit before auth (user '%s', %d fails): %s",
144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				ses.authstate.printableuser, ses.authstate.failcount, format);
145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	} else {
146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		/* before userauth */
147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		snprintf(fmtbuf, sizeof(fmtbuf),
148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				"exit before auth: %s", format);
149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	_dropbear_log(LOG_INFO, fmtbuf, param);
152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* must be after we've done with username etc */
154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	common_session_cleanup();
155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	exit(exitcode);
157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* priority is priority as with syslog() */
161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid svr_dropbear_log(int priority, const char* format, va_list param) {
162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	char printbuf[1024];
164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	char datestr[20];
165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	time_t timesec;
166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	int havetrace = 0;
167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	vsnprintf(printbuf, sizeof(printbuf), format, param);
169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef DISABLE_SYSLOG
171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (svr_opts.usingsyslog) {
172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		syslog(priority, "%s", printbuf);
173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* if we are using DEBUG_TRACE, we want to print to stderr even if
177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 * syslog is used, so it is included in error reports */
178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DEBUG_TRACE
179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	havetrace = debug_trace;
180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (!svr_opts.usingsyslog || havetrace)
183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	{
184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		struct tm * local_tm = NULL;
185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		timesec = time(NULL);
186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		local_tm = localtime(&timesec);
187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (local_tm == NULL
188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			|| strftime(datestr, sizeof(datestr), "%b %d %H:%M:%S",
189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project						localtime(&timesec)) == 0)
190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		{
191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			/* upon failure, just print the epoch-seconds time. */
192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			snprintf(datestr, sizeof(datestr), "%d", timesec);
193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		}
194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		fprintf(stderr, "[%d] %s %s\n", getpid(), datestr, printbuf);
195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* called when the remote side closes the connection */
199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic void svr_remoteclosed() {
200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	close(ses.sock);
202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ses.sock = -1;
203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	dropbear_close("Exited normally");
204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
207