From 7a9f92d7f11a2e00588857214d93af9eaa13c9e2 Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Sun, 26 Feb 2012 04:39:13 -0500 Subject: [PATCH] Compress all instructions (closes #19 github issue) --- ChangeLog | 6 ++++++ configure.ac | 3 ++- debian/changelog | 8 ++++++++ src/network/Makefile.am | 2 +- src/network/compressor.cc | 32 ++++++++++++++++++++++++++++++++ src/network/compressor.h | 28 ++++++++++++++++++++++++++++ src/network/transportfragment.cc | 5 +++-- 7 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 src/network/compressor.cc create mode 100644 src/network/compressor.h diff --git a/ChangeLog b/ChangeLog index 3ec10e3..24a14cd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-02-26 Keith Winstein + + * Version 0.96 released. + + * Compress all instructions with zlib + 2012-02-25 Keith Winstein * Version 0.95 released. diff --git a/configure.ac b/configure.ac index 15ffed8..2f9ad4d 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ([2.65]) -AC_INIT([mosh], [0.95], [mosh-devel@mit.edu]) +AC_INIT([mosh], [0.96], [mosh-devel@mit.edu]) AM_INIT_AUTOMAKE([-Wall -Werror]) AC_CONFIG_SRCDIR([src/frontend/mosh-client.cc]) AC_CONFIG_MACRO_DIR([m4]) @@ -41,6 +41,7 @@ AC_CHECK_FUNCS([clock_gettime gettimeofday inet_ntoa iswprint memchr memset nl_l # Checks for protobuf PKG_CHECK_MODULES([protobuf], [protobuf]) +PKG_CHECK_MODULES([zlib], [zlib]) AC_CONFIG_FILES([Makefile src/Makefile src/crypto/Makefile src/frontend/Makefile src/network/Makefile src/protobufs/Makefile src/statesync/Makefile src/terminal/Makefile src/util/Makefile scripts/Makefile src/examples/Makefile man/Makefile]) AC_OUTPUT diff --git a/debian/changelog b/debian/changelog index 3e0d3e5..51365e0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +mosh (0.96-1) unstable; urgency=low + + * Version 0.96 released. + + * Compress all instructions with zlib + + -- Keith Winstein Sun, 26 Feb 2012 04:40:46 -0500 + mosh (0.95-1) unstable; urgency=low * Version 0.95 released. diff --git a/src/network/Makefile.am b/src/network/Makefile.am index e3f977f..94b29bc 100644 --- a/src/network/Makefile.am +++ b/src/network/Makefile.am @@ -3,4 +3,4 @@ AM_CXXFLAGS = -pedantic -Wno-long-long -Werror -Wall -Wextra -Weffc++ -fno-defau noinst_LIBRARIES = libmoshnetwork.a -libmoshnetwork_a_SOURCES = network.cc network.h networktransport.cc networktransport.h transportfragment.cc transportfragment.h transportsender.cc transportsender.h transportstate.h +libmoshnetwork_a_SOURCES = network.cc network.h networktransport.cc networktransport.h transportfragment.cc transportfragment.h transportsender.cc transportsender.h transportstate.h compressor.cc compressor.h diff --git a/src/network/compressor.cc b/src/network/compressor.cc new file mode 100644 index 0000000..80ee0ed --- /dev/null +++ b/src/network/compressor.cc @@ -0,0 +1,32 @@ +#include +#include + +#include "compressor.h" + +using namespace Network; +using namespace std; + +string Compressor::compress_str( const string input ) +{ + size_t len = BUFFER_SIZE; + assert( Z_OK == compress( buffer, &len, + reinterpret_cast( input.data() ), + input.size() ) ); + return string( reinterpret_cast( buffer ), len ); +} + +string Compressor::uncompress_str( const string input ) +{ + size_t len = BUFFER_SIZE; + assert( Z_OK == uncompress( buffer, &len, + reinterpret_cast( input.data() ), + input.size() ) ); + return string( reinterpret_cast( buffer ), len ); +} + +/* construct on first use */ +Compressor & Network::get_compressor( void ) +{ + static Compressor the_compressor; + return the_compressor; +} diff --git a/src/network/compressor.h b/src/network/compressor.h new file mode 100644 index 0000000..0d66bc7 --- /dev/null +++ b/src/network/compressor.h @@ -0,0 +1,28 @@ +#ifndef COMPRESSOR_H +#define COMPRESSOR_H + +#include + +namespace Network { + class Compressor { + private: + static const int BUFFER_SIZE = 2048 * 2048; /* effective limit on terminal size */ + + unsigned char *buffer; + + public: + Compressor() : buffer( NULL ) { buffer = new unsigned char[ BUFFER_SIZE ]; } + ~Compressor() { if ( buffer ) { delete[] buffer; } } + + std::string compress_str( const std::string input ); + std::string uncompress_str( const std::string input ); + + /* unused */ + Compressor( const Compressor & ); + Compressor & operator=( const Compressor & ); + }; + + Compressor & get_compressor( void ); +} + +#endif diff --git a/src/network/transportfragment.cc b/src/network/transportfragment.cc index 58f2975..3a7be02 100644 --- a/src/network/transportfragment.cc +++ b/src/network/transportfragment.cc @@ -21,6 +21,7 @@ #include "transportfragment.h" #include "transportinstruction.pb.h" +#include "compressor.h" using namespace Network; using namespace TransportBuffers; @@ -121,7 +122,7 @@ Instruction FragmentAssembly::get_assembly( void ) } Instruction ret; - assert( ret.ParseFromString( encoded ) ); + assert( ret.ParseFromString( get_compressor().uncompress_str( encoded ) ) ); fragments.clear(); fragments_arrived = 0; @@ -155,7 +156,7 @@ vector Fragmenter::make_fragments( const Instruction &inst, int MTU ) last_instruction = inst; last_MTU = MTU; - string payload = inst.SerializeAsString(); + string payload = get_compressor().compress_str( inst.SerializeAsString() ); uint16_t fragment_num = 0; vector ret;