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(×ec); 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(×ec)) == 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