Mercurial > dropbear
annotate cli-session.c @ 391:00fcf5045160
propagate from branch 'au.asn.ucc.matt.ltc.dropbear' (head c1db4398d56c56c6d06ae1e20c1e0d04dbb598ed)
to branch 'au.asn.ucc.matt.dropbear' (head d26d5eb2837f46b56a33fb0e7573aa0201abd4d5)
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 11 Jan 2007 04:29:08 +0000 |
parents | d965110e3f5c |
children | c216212001fc |
rev | line source |
---|---|
74
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
1 /* |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
2 * Dropbear SSH |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
3 * |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
4 * Copyright (c) 2002,2003 Matt Johnston |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
5 * Copyright (c) 2004 by Mihnea Stoenescu |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
6 * All rights reserved. |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
7 * |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
8 * Permission is hereby granted, free of charge, to any person obtaining a copy |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
9 * of this software and associated documentation files (the "Software"), to deal |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
10 * in the Software without restriction, including without limitation the rights |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
12 * copies of the Software, and to permit persons to whom the Software is |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
13 * furnished to do so, subject to the following conditions: |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
14 * |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
15 * The above copyright notice and this permission notice shall be included in |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
16 * all copies or substantial portions of the Software. |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
17 * |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
24 * SOFTWARE. */ |
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
25 |
26 | 26 #include "includes.h" |
27 #include "session.h" | |
28 #include "dbutil.h" | |
29 #include "kex.h" | |
30 #include "ssh.h" | |
31 #include "packet.h" | |
64 | 32 #include "tcpfwd.h" |
26 | 33 #include "channel.h" |
34 #include "random.h" | |
33 | 35 #include "service.h" |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
36 #include "runopts.h" |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
37 #include "chansession.h" |
26 | 38 |
39 static void cli_remoteclosed(); | |
40 static void cli_sessionloop(); | |
33 | 41 static void cli_session_init(); |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
42 static void cli_finished(); |
26 | 43 |
44 struct clientsession cli_ses; /* GLOBAL */ | |
45 | |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
46 /* Sorted in decreasing frequency will be more efficient - data and window |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
47 * should be first */ |
26 | 48 static const packettype cli_packettypes[] = { |
74
e3adf4cf5465
License boilerplate etc, add Mihnea as an author to some of the files
Matt Johnston <matt@ucc.asn.au>
parents:
68
diff
changeset
|
49 /* TYPE, FUNCTION */ |
26 | 50 {SSH_MSG_CHANNEL_DATA, recv_msg_channel_data}, |
107 | 51 {SSH_MSG_CHANNEL_EXTENDED_DATA, recv_msg_channel_extended_data}, |
26 | 52 {SSH_MSG_CHANNEL_WINDOW_ADJUST, recv_msg_channel_window_adjust}, |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
53 {SSH_MSG_USERAUTH_FAILURE, recv_msg_userauth_failure}, /* client */ |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
54 {SSH_MSG_USERAUTH_SUCCESS, recv_msg_userauth_success}, /* client */ |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
55 {SSH_MSG_KEXINIT, recv_msg_kexinit}, |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
56 {SSH_MSG_KEXDH_REPLY, recv_msg_kexdh_reply}, /* client */ |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
57 {SSH_MSG_NEWKEYS, recv_msg_newkeys}, |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
58 {SSH_MSG_SERVICE_ACCEPT, recv_msg_service_accept}, /* client */ |
26 | 59 {SSH_MSG_CHANNEL_REQUEST, recv_msg_channel_request}, |
60 {SSH_MSG_CHANNEL_OPEN, recv_msg_channel_open}, | |
61 {SSH_MSG_CHANNEL_EOF, recv_msg_channel_eof}, | |
62 {SSH_MSG_CHANNEL_CLOSE, recv_msg_channel_close}, | |
63 {SSH_MSG_CHANNEL_OPEN_CONFIRMATION, recv_msg_channel_open_confirmation}, | |
64 {SSH_MSG_CHANNEL_OPEN_FAILURE, recv_msg_channel_open_failure}, | |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
65 {SSH_MSG_USERAUTH_BANNER, recv_msg_userauth_banner}, /* client */ |
249
efbaf6b03837
added keyboard-interactive client support
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
66 {SSH_MSG_USERAUTH_SPECIFIC_60, recv_msg_userauth_specific_60}, /* client */ |
26 | 67 {0, 0} /* End */ |
68 }; | |
69 | |
70 static const struct ChanType *cli_chantypes[] = { | |
64 | 71 #ifdef ENABLE_CLI_REMOTETCPFWD |
72 &cli_chan_tcpremote, | |
73 #endif | |
26 | 74 NULL /* Null termination */ |
75 }; | |
33 | 76 |
26 | 77 void cli_session(int sock, char* remotehost) { |
78 | |
272
3be7ae2e8dfa
Only read /dev/random once when the program starts
Matt Johnston <matt@ucc.asn.au>
parents:
249
diff
changeset
|
79 seedrandom(); |
3be7ae2e8dfa
Only read /dev/random once when the program starts
Matt Johnston <matt@ucc.asn.au>
parents:
249
diff
changeset
|
80 |
26 | 81 crypto_init(); |
272
3be7ae2e8dfa
Only read /dev/random once when the program starts
Matt Johnston <matt@ucc.asn.au>
parents:
249
diff
changeset
|
82 |
26 | 83 common_session_init(sock, remotehost); |
84 | |
85 chaninitialise(cli_chantypes); | |
86 | |
33 | 87 /* Set up cli_ses vars */ |
88 cli_session_init(); | |
26 | 89 |
90 /* Ready to go */ | |
91 sessinitdone = 1; | |
92 | |
93 /* Exchange identification */ | |
94 session_identification(); | |
95 | |
96 send_msg_kexinit(); | |
97 | |
98 session_loop(cli_sessionloop); | |
99 | |
100 /* Not reached */ | |
101 | |
33 | 102 } |
26 | 103 |
33 | 104 static void cli_session_init() { |
105 | |
106 cli_ses.state = STATE_NOTHING; | |
107 cli_ses.kex_state = KEX_NOTHING; | |
108 | |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
37
diff
changeset
|
109 cli_ses.tty_raw_mode = 0; |
41
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
110 cli_ses.winchange = 0; |
39
0883c0906870
tty raw mode support works mostly
Matt Johnston <matt@ucc.asn.au>
parents:
37
diff
changeset
|
111 |
175
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
112 /* We store std{in,out,err}'s flags, so we can set them back on exit |
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
113 * (otherwise busybox's ash isn't happy */ |
99
0247fbd9379d
Move the revert-to-non-blocking-stdin code to cli-session so it
Matt Johnston <matt@ucc.asn.au>
parents:
74
diff
changeset
|
114 cli_ses.stdincopy = dup(STDIN_FILENO); |
0247fbd9379d
Move the revert-to-non-blocking-stdin code to cli-session so it
Matt Johnston <matt@ucc.asn.au>
parents:
74
diff
changeset
|
115 cli_ses.stdinflags = fcntl(STDIN_FILENO, F_GETFL, 0); |
175
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
116 cli_ses.stdoutcopy = dup(STDOUT_FILENO); |
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
117 cli_ses.stdoutflags = fcntl(STDOUT_FILENO, F_GETFL, 0); |
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
118 cli_ses.stderrcopy = dup(STDERR_FILENO); |
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
119 cli_ses.stderrflags = fcntl(STDERR_FILENO, F_GETFL, 0); |
99
0247fbd9379d
Move the revert-to-non-blocking-stdin code to cli-session so it
Matt Johnston <matt@ucc.asn.au>
parents:
74
diff
changeset
|
120 |
108
10f4d3319780
- added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents:
107
diff
changeset
|
121 cli_ses.retval = EXIT_SUCCESS; /* Assume it's clean if we don't get a |
10f4d3319780
- added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents:
107
diff
changeset
|
122 specific exit status */ |
10f4d3319780
- added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents:
107
diff
changeset
|
123 |
47 | 124 /* Auth */ |
215
aad4b3f58556
rename PubkeyList to SignKeyList for clarity
Matt Johnston <matt@ucc.asn.au>
parents:
175
diff
changeset
|
125 cli_ses.lastprivkey = NULL; |
136
fb7147e2fb04
- Fixed a couple of compile warnings
Matt Johnston <matt@ucc.asn.au>
parents:
108
diff
changeset
|
126 cli_ses.lastauthtype = 0; |
47 | 127 |
33 | 128 /* For printing "remote host closed" for the user */ |
129 ses.remoteclosed = cli_remoteclosed; | |
130 ses.buf_match_algo = cli_buf_match_algo; | |
131 | |
132 /* packet handlers */ | |
133 ses.packettypes = cli_packettypes; | |
35
0ad5fb979f42
set the isserver flag (oops)
Matt Johnston <matt@ucc.asn.au>
parents:
34
diff
changeset
|
134 |
0ad5fb979f42
set the isserver flag (oops)
Matt Johnston <matt@ucc.asn.au>
parents:
34
diff
changeset
|
135 ses.isserver = 0; |
26 | 136 } |
137 | |
33 | 138 /* This function drives the progress of the session - it initiates KEX, |
139 * service, userauth and channel requests */ | |
26 | 140 static void cli_sessionloop() { |
141 | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
142 TRACE(("enter cli_sessionloop")) |
33 | 143 |
34
e2a1eaa19f22
Client mostly works up to password auth
Matt Johnston <matt@ucc.asn.au>
parents:
33
diff
changeset
|
144 if (ses.lastpacket == SSH_MSG_KEXINIT && cli_ses.kex_state == KEX_NOTHING) { |
e2a1eaa19f22
Client mostly works up to password auth
Matt Johnston <matt@ucc.asn.au>
parents:
33
diff
changeset
|
145 cli_ses.kex_state = KEXINIT_RCVD; |
33 | 146 } |
147 | |
34
e2a1eaa19f22
Client mostly works up to password auth
Matt Johnston <matt@ucc.asn.au>
parents:
33
diff
changeset
|
148 if (cli_ses.kex_state == KEXINIT_RCVD) { |
33 | 149 |
150 /* We initiate the KEXDH. If DH wasn't the correct type, the KEXINIT | |
151 * negotiation would have failed. */ | |
152 send_msg_kexdh_init(); | |
153 cli_ses.kex_state = KEXDH_INIT_SENT; | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
154 TRACE(("leave cli_sessionloop: done with KEXINIT_RCVD")) |
33 | 155 return; |
156 } | |
157 | |
158 /* A KEX has finished, so we should go back to our KEX_NOTHING state */ | |
159 if (cli_ses.kex_state != KEX_NOTHING && ses.kexstate.recvkexinit == 0 | |
160 && ses.kexstate.sentkexinit == 0) { | |
161 cli_ses.kex_state = KEX_NOTHING; | |
162 } | |
163 | |
164 /* We shouldn't do anything else if a KEX is in progress */ | |
165 if (cli_ses.kex_state != KEX_NOTHING) { | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
166 TRACE(("leave cli_sessionloop: kex_state != KEX_NOTHING")) |
33 | 167 return; |
168 } | |
169 | |
170 /* We should exit if we haven't donefirstkex: we shouldn't reach here | |
171 * in normal operation */ | |
172 if (ses.kexstate.donefirstkex == 0) { | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
173 TRACE(("XXX XXX might be bad! leave cli_sessionloop: haven't donefirstkex")) |
34
e2a1eaa19f22
Client mostly works up to password auth
Matt Johnston <matt@ucc.asn.au>
parents:
33
diff
changeset
|
174 return; |
33 | 175 } |
176 | |
26 | 177 switch (cli_ses.state) { |
178 | |
33 | 179 case STATE_NOTHING: |
180 /* We've got the transport layer sorted, we now need to request | |
181 * userauth */ | |
182 send_msg_service_request(SSH_SERVICE_USERAUTH); | |
183 cli_ses.state = SERVICE_AUTH_REQ_SENT; | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
184 TRACE(("leave cli_sessionloop: sent userauth service req")) |
33 | 185 return; |
26 | 186 |
33 | 187 /* userauth code */ |
188 case SERVICE_AUTH_ACCEPT_RCVD: | |
189 cli_auth_getmethods(); | |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
190 cli_ses.state = USERAUTH_REQ_SENT; |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
191 TRACE(("leave cli_sessionloop: sent userauth methods req")) |
33 | 192 return; |
193 | |
194 case USERAUTH_FAIL_RCVD: | |
195 cli_auth_try(); | |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
196 cli_ses.state = USERAUTH_REQ_SENT; |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
197 TRACE(("leave cli_sessionloop: cli_auth_try")) |
33 | 198 return; |
199 | |
47 | 200 /* |
37 | 201 case USERAUTH_SUCCESS_RCVD: |
202 send_msg_service_request(SSH_SERVICE_CONNECTION); | |
203 cli_ses.state = SERVICE_CONN_REQ_SENT; | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
204 TRACE(("leave cli_sessionloop: sent ssh-connection service req")) |
37 | 205 return; |
206 | |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
207 case SERVICE_CONN_ACCEPT_RCVD: |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
208 cli_send_chansess_request(); |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
209 TRACE(("leave cli_sessionloop: cli_send_chansess_request")) |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
210 cli_ses.state = SESSION_RUNNING; |
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
211 return; |
47 | 212 */ |
45
9ee8996a375f
Pubkey auth is mostly there for the client. Something strange with
Matt Johnston <matt@ucc.asn.au>
parents:
43
diff
changeset
|
213 |
37 | 214 case USERAUTH_SUCCESS_RCVD: |
326
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
215 |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
216 if (cli_opts.backgrounded) { |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
217 int devnull; |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
218 // keeping stdin open steals input from the terminal and |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
219 // is confusing, though stdout/stderr could be useful. |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
220 devnull = open(_PATH_DEVNULL, O_RDONLY); |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
221 if (devnull < 0) { |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
222 dropbear_exit("opening /dev/null: %d %s", |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
223 errno, strerror(errno)); |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
224 } |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
225 dup2(devnull, STDIN_FILENO); |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
226 if (daemon(0, 1) < 0) { |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
227 dropbear_exit("Backgrounding failed: %d %s", |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
228 errno, strerror(errno)); |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
229 } |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
230 } |
d965110e3f5c
add -f background option to dbclient
Matt Johnston <matt@ucc.asn.au>
parents:
325
diff
changeset
|
231 |
64 | 232 #ifdef ENABLE_CLI_LOCALTCPFWD |
233 setup_localtcp(); | |
234 #endif | |
65
02e4a7f614f8
Oops, forgot to call the actual code.
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
235 #ifdef ENABLE_CLI_REMOTETCPFWD |
02e4a7f614f8
Oops, forgot to call the actual code.
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
236 setup_remotetcp(); |
02e4a7f614f8
Oops, forgot to call the actual code.
Matt Johnston <matt@ucc.asn.au>
parents:
64
diff
changeset
|
237 #endif |
325
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
272
diff
changeset
|
238 if (!cli_opts.no_cmd) { |
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
272
diff
changeset
|
239 cli_send_chansess_request(); |
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
272
diff
changeset
|
240 } |
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
272
diff
changeset
|
241 TRACE(("leave cli_sessionloop: running")) |
37 | 242 cli_ses.state = SESSION_RUNNING; |
243 return; | |
244 | |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
245 case SESSION_RUNNING: |
325
0e4f225b7e07
Add -N "no remote command" dbclient option.
Matt Johnston <matt@ucc.asn.au>
parents:
272
diff
changeset
|
246 if (ses.chancount < 1 && !cli_opts.no_cmd) { |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
247 cli_finished(); |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
248 } |
41
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
249 |
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
250 if (cli_ses.winchange) { |
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
251 cli_chansess_winchange(); |
18eccbfb9641
added window-size change handling
Matt Johnston <matt@ucc.asn.au>
parents:
40
diff
changeset
|
252 } |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
253 return; |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
254 |
33 | 255 /* XXX more here needed */ |
256 | |
257 | |
258 default: | |
259 break; | |
26 | 260 } |
261 | |
165
0cfba3034be5
Fixed DEBUG_TRACE macro so that we don't get semicolons left about the place
Matt Johnston <matt@ucc.asn.au>
parents:
136
diff
changeset
|
262 TRACE(("leave cli_sessionloop: fell out")) |
26 | 263 |
264 } | |
265 | |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
266 void cli_session_cleanup() { |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
267 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
268 if (!sessinitdone) { |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
269 return; |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
270 } |
99
0247fbd9379d
Move the revert-to-non-blocking-stdin code to cli-session so it
Matt Johnston <matt@ucc.asn.au>
parents:
74
diff
changeset
|
271 |
175
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
272 /* Set std{in,out,err} back to non-blocking - busybox ash dies nastily if |
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
273 * we don't revert the flags */ |
100
c72f5c10125d
oops, the fcntl() was commented out
Matt Johnston <matt@ucc.asn.au>
parents:
99
diff
changeset
|
274 fcntl(cli_ses.stdincopy, F_SETFL, cli_ses.stdinflags); |
175
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
275 fcntl(cli_ses.stdoutcopy, F_SETFL, cli_ses.stdoutflags); |
2c5741e4b855
* Reset the non-blocking status of stdout and stderr as well on exit
Matt Johnston <matt@ucc.asn.au>
parents:
165
diff
changeset
|
276 fcntl(cli_ses.stderrcopy, F_SETFL, cli_ses.stderrflags); |
99
0247fbd9379d
Move the revert-to-non-blocking-stdin code to cli-session so it
Matt Johnston <matt@ucc.asn.au>
parents:
74
diff
changeset
|
277 |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
278 cli_tty_cleanup(); |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
279 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
280 } |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
281 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
282 static void cli_finished() { |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
283 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
284 cli_session_cleanup(); |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
285 common_session_cleanup(); |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
286 fprintf(stderr, "Connection to %s@%s:%s closed.\n", cli_opts.username, |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
287 cli_opts.remotehost, cli_opts.remoteport); |
108
10f4d3319780
- added circular buffering for channels
Matt Johnston <matt@ucc.asn.au>
parents:
107
diff
changeset
|
288 exit(cli_ses.retval); |
40
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
289 } |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
290 |
b4874d772210
- Added terminal mode handling etc for the client, and window change
Matt Johnston <matt@ucc.asn.au>
parents:
39
diff
changeset
|
291 |
26 | 292 /* called when the remote side closes the connection */ |
293 static void cli_remoteclosed() { | |
294 | |
295 /* XXX TODO perhaps print a friendlier message if we get this but have | |
296 * already sent/received disconnect message(s) ??? */ | |
297 close(ses.sock); | |
298 ses.sock = -1; | |
33 | 299 dropbear_exit("remote closed the connection"); |
26 | 300 } |
43 | 301 |
302 /* Operates in-place turning dirty (untrusted potentially containing control | |
249
efbaf6b03837
added keyboard-interactive client support
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
303 * characters) text into clean text. |
efbaf6b03837
added keyboard-interactive client support
Matt Johnston <matt@ucc.asn.au>
parents:
215
diff
changeset
|
304 * Note: this is safe only with ascii - other charsets could have problems. */ |
43 | 305 void cleantext(unsigned char* dirtytext) { |
306 | |
307 unsigned int i, j; | |
47 | 308 unsigned char c; |
43 | 309 |
310 j = 0; | |
311 for (i = 0; dirtytext[i] != '\0'; i++) { | |
312 | |
313 c = dirtytext[i]; | |
314 /* We can ignore '\r's */ | |
315 if ( (c >= ' ' && c <= '~') || c == '\n' || c == '\t') { | |
316 dirtytext[j] = c; | |
317 j++; | |
318 } | |
319 } | |
320 /* Null terminate */ | |
321 dirtytext[j] = '\0'; | |
322 } |