diff options
Diffstat (limited to 'src/socket.c')
-rw-r--r-- | src/socket.c | 64 |
1 files changed, 57 insertions, 7 deletions
diff --git a/src/socket.c b/src/socket.c index 974e712a..e862584c 100644 --- a/src/socket.c +++ b/src/socket.c @@ -81,6 +81,8 @@ struct ssh_socket_struct { not block */ int write_wontblock; int data_except; + FILE *client_fp; + FILE *server_fp; enum ssh_socket_states_e state; ssh_buffer out_buffer; ssh_buffer in_buffer; @@ -156,15 +158,26 @@ ssh_socket ssh_socket_new(ssh_session session) s->in_buffer = ssh_buffer_new(); if (s->in_buffer == NULL) { ssh_set_error_oom(session); - SAFE_FREE(s); - return NULL; + goto error; } s->out_buffer=ssh_buffer_new(); if (s->out_buffer == NULL) { ssh_set_error_oom(session); - ssh_buffer_free(s->in_buffer); - SAFE_FREE(s); - return NULL; + goto error; + } + + if (session->opts.client_trace != NULL) { + s->client_fp = fopen(session->opts.client_trace, "wb"); + if (s->client_fp == NULL) { + goto error; + }; + } + + if (session->opts.server_trace != NULL) { + s->server_fp = fopen(session->opts.server_trace, "wb"); + if (s->server_fp == NULL) { + goto error; + }; } s->read_wontblock = 0; s->write_wontblock = 0; @@ -172,6 +185,10 @@ ssh_socket ssh_socket_new(ssh_session session) s->poll_handle = NULL; s->state=SSH_SOCKET_NONE; return s; +error: + ssh_socket_free(s); + + return NULL; } /** @@ -393,8 +410,16 @@ void ssh_socket_free(ssh_socket s) return; } ssh_socket_close(s); - ssh_buffer_free(s->in_buffer); - ssh_buffer_free(s->out_buffer); + + if (s->client_fp != NULL) { + fclose(s->client_fp); + } + if (s->server_fp != NULL) { + fclose(s->server_fp); + } + SSH_BUFFER_FREE(s->in_buffer); + SSH_BUFFER_FREE(s->out_buffer); + SAFE_FREE(s); } @@ -525,6 +550,18 @@ static ssize_t ssh_socket_unbuffered_read(ssh_socket s, s->data_except = 1; } + if (rc > 0) { + switch(s->session->type) { + case SSH_SESSION_TYPE_CLIENT: + if (s->server_fp != NULL) { + fwrite(buffer, rc, 1, s->server_fp); + } + break; + case SSH_SESSION_TYPE_SERVER: + break; + } + } + return rc; } @@ -557,6 +594,19 @@ static ssize_t ssh_socket_unbuffered_write(ssh_socket s, s->last_errno = errno; #endif s->write_wontblock = 0; + + if (w > 0) { + switch(s->session->type) { + case SSH_SESSION_TYPE_CLIENT: + if (s->client_fp != NULL) { + fwrite(buffer, w, 1, s->client_fp); + } + break; + case SSH_SESSION_TYPE_SERVER: + break; + } + } + /* Reactive the POLLOUT detector in the poll multiplexer system */ if (s->poll_handle) { SSH_LOG(SSH_LOG_PACKET, "Enabling POLLOUT for socket"); |