From 61bcb73eb60fdf9990366a11f585b670035d6cca Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Thu, 2 May 2013 18:35:44 -0300 Subject: [PATCH] Implementa suporte a compressao no cliente. Ainda e necessario um cabecalho antes da mensagem comprimida. --- rnetclient.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/rnetclient.c b/rnetclient.c index 679d468..6c8c20b 100644 --- a/rnetclient.c +++ b/rnetclient.c @@ -24,6 +24,7 @@ #include #include #include +#include static void * get_creds(char *certfile) { @@ -43,12 +44,50 @@ static void session_new(gnutls_session_t *session) gnutls_credentials_set(*session, GNUTLS_CRD_CERTIFICATE, cred); } +static int deflateRecord(char *buffer, size_t len, char **out, size_t *olen) +{ + z_stream zstrm; + int r; + zstrm.zalloc = Z_NULL; + zstrm.zfree = Z_NULL; + zstrm.opaque = Z_NULL; + if ((r = deflateInit(&zstrm, Z_DEFAULT_COMPRESSION)) != Z_OK) + return -1; + *out = malloc(len * 2 + 36); + if (!out) { + deflateEnd(&zstrm); + return -1; + } + zstrm.next_in = buffer; + zstrm.avail_in = len; + zstrm.next_out = *out + 6; + zstrm.avail_out = len * 2 + 30; + while ((r = deflate(&zstrm, Z_FINISH)) != Z_STREAM_END && + zstrm.avail_out > 0); + if ((r = deflate(&zstrm, Z_FINISH)) != Z_STREAM_END) { + deflateEnd(&zstrm); + free(*out); + return -1; + } + *olen = zstrm.avail_out + 6; + (*out)[0] = 0x1; + (*out)[1] = (zstrm.avail_out >> 8); + (*out)[2] = (zstrm.avail_out & 0xff); + (*out)[3] = (len >> 8); + (*out)[4] = (len & 0xff); + (*out)[5] = 0x1; + deflateEnd(&zstrm); + return 0; +} + int main(int argc, char **argv) { struct sockaddr_in saddr; int c; int r; char buffer[256]; + char *out; + size_t olen; gnutls_session_t session; gnutls_global_init(); session_new(&session); @@ -73,7 +112,9 @@ int main(int argc, char **argv) else fprintf(stderr, "handshake ok\n"); buffer[0] = 0x40; - gnutls_record_send(session, buffer, 1); + deflateRecord(buffer, 1, &out, &olen); + gnutls_record_send(session, out, olen); + free(out); while ((r = gnutls_record_recv(session, buffer, sizeof(buffer))) > 0) write(1, buffer, r); close(c); -- 2.20.1