From 2aff1868c6bab9262973134267a4be09a1351780 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Thu, 13 Jun 2013 21:19:32 -0300 Subject: [PATCH] Create helpers to send and receive messages. Needs to do some input and error checking and maybe add some timeouts. --- rnetclient.c | 52 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/rnetclient.c b/rnetclient.c index 741b840..a2aaf10 100644 --- a/rnetclient.c +++ b/rnetclient.c @@ -174,13 +174,44 @@ static void usage(void) exit(1); } +static int rnet_send(gnutls_session_t session, char *buffer, size_t len) +{ + char *out; + size_t olen; + deflateRecord(buffer, len, &out, &olen); + gnutls_record_send(session, out, olen); + free(out); + return 0; +} + +static int rnet_recv(gnutls_session_t session, struct rnet_message **message) +{ + char *out; + size_t olen; + int r; + char *buffer; + size_t len; + rnet_message_expand(message, 6); + buffer = (*message)->buffer; + r = gnutls_record_recv(session, buffer, 6); + len = (buffer[1] << 8 | buffer[2]); + rnet_message_expand(message, len); + buffer = (*message)->buffer + 6; + r = gnutls_record_recv(session, buffer, len); + inflateRecord(buffer - 6, len + 6, &out, &olen); + rnet_message_del(*message); + *message = NULL; + rnet_message_expand(message, olen); + memcpy((*message)->buffer, out, olen); + (*message)->len = olen; + free(out); + return 0; +} + int main(int argc, char **argv) { int c; int r; - char buffer[2048]; - char *out; - size_t olen; struct rnet_decfile *decfile; struct rnet_message *message = NULL; gnutls_session_t session; @@ -214,16 +245,17 @@ int main(int argc, char **argv) gnutls_strerror(r)); rnet_encode(decfile, &message); - deflateRecord(message->buffer, message->len, &out, &olen); - gnutls_record_send(session, out, olen); - free(out); + rnet_send(session, message->buffer, message->len); + rnet_message_del(message); - while ((r = gnutls_record_recv(session, buffer, sizeof(buffer))) > 0) - write(1, buffer, r); - close(c); + message = NULL; + rnet_recv(session, &message); + write(1, message->buffer, message->len); + rnet_message_del(message); + gnutls_bye(session, GNUTLS_SHUT_RDWR); + close(c); rnet_decfile_close(decfile); - gnutls_global_deinit(); return 0; -- 2.20.1