Skip to content
Snippets Groups Projects
Commit 52feec23 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Give the same input improvement to everything but SSH.

The SSH input thread is too complex to easily make this change.
parent 3583d299
No related branches found
No related tags found
No related merge requests found
Pipeline #7741 passed
......@@ -23,6 +23,7 @@ modem_input_thread(void *args)
int rd;
int buffered;
size_t buffer;
size_t bufsz = 0;
bool monitor_dsr = true;
SetThreadName("Modem Input");
......@@ -32,18 +33,24 @@ modem_input_thread(void *args)
monitor_dsr = false;
}
while (com != COM_HANDLE_INVALID && !conn_api.terminate) {
rd = comReadBuf(com, (char *)conn_api.rd_buf, conn_api.rd_buf_size, NULL, 100);
// Strip high bits... we *should* check the parity
if (seven_bits) {
for (int i = 0; i < rd; i++)
conn_api.rd_buf[i] &= 0x7f;
if (bufsz < BUFFER_SIZE) {
rd = comReadBuf(com, (char *)conn_api.rd_buf + bufsz, conn_api.rd_buf_size - bufsz, NULL, bufsz ? 0 : 100);
// Strip high bits... we *should* check the parity
if (seven_bits) {
for (int i = 0; i < rd; i++)
conn_api.rd_buf[bufsz + i] &= 0x7f;
}
bufsz += rd;
}
buffered = 0;
while (com != COM_HANDLE_INVALID && buffered < rd && !conn_api.terminate) {
pthread_mutex_lock(&(conn_inbuf.mutex));
buffer = conn_buf_wait_free(&conn_inbuf, rd - buffered, 100);
buffered += conn_buf_put(&conn_inbuf, conn_api.rd_buf + buffered, buffer);
pthread_mutex_unlock(&(conn_inbuf.mutex));
if (bufsz) {
while (com != COM_HANDLE_INVALID && buffered < rd && !conn_api.terminate) {
pthread_mutex_lock(&(conn_inbuf.mutex));
conn_buf_wait_free(&conn_inbuf, 1, 1000);
buffered = conn_buf_put(&conn_inbuf, conn_api.rd_buf, bufsz);
memmove(conn_api.rd_buf, &conn_api.rd_buf[buffered], bufsz - buffered);
bufsz -= buffered;
pthread_mutex_unlock(&(conn_inbuf.mutex));
}
}
if (args == NULL) {
if ((comGetModemStatus(com) & COM_DCD) == 0)
......
......@@ -20,24 +20,26 @@ rlogin_input_thread(void *args)
{
int rd = 0;
int buffered;
size_t buffer;
size_t bufsz = 0;
SetThreadName("RLogin Input");
conn_api.input_thread_running = 1;
while (rlogin_sock != INVALID_SOCKET && !conn_api.terminate) {
bool data_avail;
if (socket_check(rlogin_sock, &data_avail, NULL, 100)) {
if (data_avail) {
rd = recv(rlogin_sock, conn_api.rd_buf, conn_api.rd_buf_size, 0);
if (socket_check(rlogin_sock, &data_avail, NULL, bufsz ? 0 : 100)) {
if (data_avail && bufsz < BUFFER_SIZE) {
rd = recv(rlogin_sock, conn_api.rd_buf + bufsz, conn_api.rd_buf_size - bufsz, 0);
if (rd <= 0)
break;
buffered = 0;
while (rlogin_sock != INVALID_SOCKET && buffered < rd && !conn_api.terminate) {
pthread_mutex_lock(&(conn_inbuf.mutex));
buffer = conn_buf_wait_free(&conn_inbuf, rd - buffered, 1000);
buffered += conn_buf_put(&conn_inbuf, conn_api.rd_buf + buffered, buffer);
pthread_mutex_unlock(&(conn_inbuf.mutex));
}
bufsz += rd;
}
if (bufsz) {
pthread_mutex_lock(&(conn_inbuf.mutex));
conn_buf_wait_free(&conn_inbuf, 1, 1000);
buffered = conn_buf_put(&conn_inbuf, conn_api.rd_buf, bufsz);
memmove(conn_api.rd_buf, &conn_api.rd_buf[buffered], bufsz - buffered);
bufsz -= buffered;
pthread_mutex_unlock(&(conn_inbuf.mutex));
}
}
else
......
......@@ -59,37 +59,40 @@ telnets_input_thread(void *args)
int status;
int rd;
size_t buffered;
size_t buffer;
size_t bufsz = 0;
SetThreadName("TelnetS Input");
conn_api.input_thread_running = 1;
while (!conn_api.terminate) {
bool data_avail;
if (!socket_check(telnets_sock, &data_avail, NULL, 100))
if (!socket_check(telnets_sock, &data_avail, NULL, bufsz ? 0 : 100))
break;
if (!data_avail)
continue;
pthread_mutex_lock(&telnets_mutex);
FlushData(telnets_session);
status = PopData(telnets_session, conn_api.rd_buf, conn_api.rd_buf_size, &rd);
pthread_mutex_unlock(&telnets_mutex);
// Handle case where there was socket activity without readable data (ie: rekey)
if (status == CRYPT_ERROR_TIMEOUT)
continue;
if (cryptStatusError(status)) {
if (!conn_api.terminate) {
if ((status != CRYPT_ERROR_COMPLETE) && (status != CRYPT_ERROR_READ)) /* connection closed */
cryptlib_error_message(status, "recieving data");
conn_api.terminate = true;
if (data_avail && bufsz < BUFFER_SIZE) {
pthread_mutex_lock(&telnets_mutex);
FlushData(telnets_session);
status = PopData(telnets_session, conn_api.rd_buf + bufsz, conn_api.rd_buf_size - bufsz, &rd);
pthread_mutex_unlock(&telnets_mutex);
bufsz += rd;
// Handle case where there was socket activity without readable data (ie: rekey)
if (status == CRYPT_ERROR_TIMEOUT)
continue;
if (cryptStatusError(status)) {
if (!conn_api.terminate) {
if ((status != CRYPT_ERROR_COMPLETE) && (status != CRYPT_ERROR_READ)) /* connection closed */
cryptlib_error_message(status, "recieving data");
conn_api.terminate = true;
}
break;
}
break;
}
else {
if (bufsz) {
buffered = 0;
while (buffered < rd) {
pthread_mutex_lock(&(conn_inbuf.mutex));
buffer = conn_buf_wait_free(&conn_inbuf, rd - buffered, 100);
buffered += conn_buf_put(&conn_inbuf, conn_api.rd_buf + buffered, buffer);
conn_buf_wait_free(&conn_inbuf, 1, 1000);
buffered = conn_buf_put(&conn_inbuf, conn_api.rd_buf, bufsz);
memmove(conn_api.rd_buf, &conn_api.rd_buf[buffered], bufsz - buffered);
bufsz -= buffered;
pthread_mutex_unlock(&(conn_inbuf.mutex));
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment