aboutsummaryrefslogtreecommitdiff
path: root/src/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/socket.c')
-rw-r--r--src/socket.c64
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");