*/
#include "includes.h"
-RCSID("$OpenBSD: clientloop.c,v 1.51 2001/02/13 21:51:09 markus Exp $");
+RCSID("$OpenBSD: clientloop.c,v 1.54 2001/04/04 00:06:53 markus Exp $");
#include "ssh.h"
#include "ssh1.h"
#include "buffer.h"
#include "bufaux.h"
#include "key.h"
+#include "kex.h"
#include "log.h"
#include "readconf.h"
#include "clientloop.h"
void client_init_dispatch(void);
int session_ident = -1;
+/*XXX*/
+extern Kex *xxx_kex;
+
/* Returns the user\'s terminal to normal mode if it had been put in raw mode. */
void
*/
if ((u_char) buf[0] == escape_char)
escape_pending = 1;
- else {
+ else
buffer_append(&stdin_buffer, buf, 1);
- stdin_bytes += 1;
- }
}
leave_non_blocking();
}
packet_put_string(buffer_ptr(&stdin_buffer), len);
packet_send();
buffer_consume(&stdin_buffer, len);
+ stdin_bytes += len;
/* If we have a pending EOF, send it now. */
if (stdin_eof && buffer_len(&stdin_buffer) == 0) {
packet_start(SSH_CMSG_EOF);
/* Note: we might still have data in the buffers. */
snprintf(buf, sizeof buf, "select: %s\r\n", strerror(errno));
buffer_append(&stderr_buffer, buf, strlen(buf));
- stderr_bytes += strlen(buf);
quit_pending = 1;
}
}
snprintf(buf, sizeof buf, "Connection to %.300s closed by remote host.\r\n",
host);
buffer_append(&stderr_buffer, buf, strlen(buf));
- stderr_bytes += strlen(buf);
quit_pending = 1;
return;
}
* There is a kernel bug on Solaris that causes select to
* sometimes wake up even though there is no data available.
*/
- if (len < 0 && errno == EAGAIN)
+ if (len < 0 && (errno == EAGAIN || errno == EINTR))
len = 0;
if (len < 0) {
snprintf(buf, sizeof buf, "Read from remote host %.300s: %.100s\r\n",
host, strerror(errno));
buffer_append(&stderr_buffer, buf, strlen(buf));
- stderr_bytes += strlen(buf);
quit_pending = 1;
return;
}
/* Terminate the connection. */
snprintf(string, sizeof string, "%c.\r\n", escape_char);
buffer_append(berr, string, strlen(string));
- /*stderr_bytes += strlen(string); XXX*/
quit_pending = 1;
return -1;
/* Print a message to that effect to the user. */
snprintf(string, sizeof string, "%c^Z [suspend ssh]\r\n", escape_char);
buffer_append(berr, string, strlen(string));
- /*stderr_bytes += strlen(string); XXX*/
/* Restore terminal modes and suspend. */
client_suspend_self(bin, bout, berr);
/* We have been continued. */
continue;
+ case 'R':
+ debug("Rekeying");
+ kex_send_kexinit(xxx_kex);
+ continue;
+
case '&':
/* XXX does not work yet with proto 2 */
if (compat20)
void
client_process_input(fd_set * readset)
{
- int ret;
int len;
char buf[8192];
if (len < 0) {
snprintf(buf, sizeof buf, "read: %.100s\r\n", strerror(errno));
buffer_append(&stderr_buffer, buf, strlen(buf));
- stderr_bytes += strlen(buf);
}
/* Mark that we have seen EOF. */
stdin_eof = 1;
* Just append the data to buffer.
*/
buffer_append(&stdin_buffer, buf, len);
- stdin_bytes += len;
} else {
/*
* Normal, successful read. But we have an escape character
* and have to process the characters one by one.
*/
- ret = process_escapes(&stdin_buffer, &stdout_buffer, &stderr_buffer, buf, len);
- if (ret == -1)
+ if (process_escapes(&stdin_buffer, &stdout_buffer,
+ &stderr_buffer, buf, len) == -1)
return;
- stdout_bytes += ret;
}
}
}
*/
snprintf(buf, sizeof buf, "write stdout: %.50s\r\n", strerror(errno));
buffer_append(&stderr_buffer, buf, strlen(buf));
- stderr_bytes += strlen(buf);
quit_pending = 1;
return;
}
}
/* Consume printed data from the buffer. */
buffer_consume(&stdout_buffer, len);
+ stdout_bytes += len;
}
/* Write buffered output to stderr. */
if (FD_ISSET(fileno(stderr), writeset)) {
}
/* Consume printed characters from the buffer. */
buffer_consume(&stderr_buffer, len);
+ stderr_bytes += len;
}
}
void
client_process_buffered_input_packets(void)
{
- dispatch_run(DISPATCH_NONBLOCK, &quit_pending, NULL);
+ dispatch_run(DISPATCH_NONBLOCK, &quit_pending, compat20 ? xxx_kex : NULL);
}
/* scan buf[] for '~' before sending data to the peer */
if (have_pty && options.log_level != SYSLOG_LEVEL_QUIET) {
snprintf(buf, sizeof buf, "Connection to %.64s closed.\r\n", host);
buffer_append(&stderr_buffer, buf, strlen(buf));
- stderr_bytes += strlen(buf);
}
/* Output any buffered data for stdout. */
while (buffer_len(&stdout_buffer) > 0) {
break;
}
buffer_consume(&stdout_buffer, len);
+ stdout_bytes += len;
}
/* Output any buffered data for stderr. */
break;
}
buffer_consume(&stderr_buffer, len);
+ stderr_bytes += len;
}
if (have_pty)
char *data = packet_get_string(&data_len);
packet_integrity_check(plen, 4 + data_len, type);
buffer_append(&stdout_buffer, data, data_len);
- stdout_bytes += data_len;
memset(data, 0, data_len);
xfree(data);
}
char *data = packet_get_string(&data_len);
packet_integrity_check(plen, 4 + data_len, type);
buffer_append(&stderr_buffer, data, data_len);
- stdout_bytes += data_len;
memset(data, 0, data_len);
xfree(data);
}
void
client_init_dispatch_20(void)
{
- dispatch_init(&dispatch_protocol_error);
+ int i;
+ /* dispatch_init(&dispatch_protocol_error); */
+ for (i = 50; i <= 254; i++)
+ dispatch_set(i, &dispatch_protocol_error);
dispatch_set(SSH2_MSG_CHANNEL_CLOSE, &channel_input_oclose);
dispatch_set(SSH2_MSG_CHANNEL_DATA, &channel_input_data);
dispatch_set(SSH2_MSG_CHANNEL_EOF, &channel_input_ieof);