compress.c (58582) | compress.c (60573) |
---|---|
1/* | 1/* |
2 * | 2 * |
3 * compress.c | 3 * compress.c |
4 * | 4 * |
5 * Author: Tatu Ylonen <ylo@cs.hut.fi> | 5 * Author: Tatu Ylonen <ylo@cs.hut.fi> |
6 * | 6 * |
7 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 8 * All rights reserved | 7 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 8 * All rights reserved |
9 * | 9 * |
10 * Created: Wed Oct 25 22:12:46 1995 ylo | 10 * Created: Wed Oct 25 22:12:46 1995 ylo |
11 * | 11 * |
12 * Interface to packet compression for ssh. | 12 * Interface to packet compression for ssh. |
13 * | 13 * |
14 */ 15 16#include "includes.h" | 14 */ 15 16#include "includes.h" |
17RCSID("$Id: compress.c,v 1.5 2000/03/16 20:56:14 markus Exp $"); | 17RCSID("$Id: compress.c,v 1.7 2000/04/14 10:30:31 markus Exp $"); |
18 19#include "ssh.h" 20#include "buffer.h" 21#include "zlib.h" 22 23static z_stream incoming_stream; 24static z_stream outgoing_stream; 25 26/* 27 * Initializes compression; level is compression level from 1 to 9 28 * (as in gzip). 29 */ 30 | 18 19#include "ssh.h" 20#include "buffer.h" 21#include "zlib.h" 22 23static z_stream incoming_stream; 24static z_stream outgoing_stream; 25 26/* 27 * Initializes compression; level is compression level from 1 to 9 28 * (as in gzip). 29 */ 30 |
31void | 31void |
32buffer_compress_init(int level) 33{ 34 debug("Enabling compression at level %d.", level); 35 if (level < 1 || level > 9) 36 fatal("Bad compression level %d.", level); 37 inflateInit(&incoming_stream); 38 deflateInit(&outgoing_stream, level); 39} 40 41/* Frees any data structures allocated for compression. */ 42 | 32buffer_compress_init(int level) 33{ 34 debug("Enabling compression at level %d.", level); 35 if (level < 1 || level > 9) 36 fatal("Bad compression level %d.", level); 37 inflateInit(&incoming_stream); 38 deflateInit(&outgoing_stream, level); 39} 40 41/* Frees any data structures allocated for compression. */ 42 |
43void | 43void |
44buffer_compress_uninit() 45{ 46 debug("compress outgoing: raw data %lu, compressed %lu, factor %.2f", 47 outgoing_stream.total_in, outgoing_stream.total_out, 48 outgoing_stream.total_in == 0 ? 0.0 : 49 (double) outgoing_stream.total_out / outgoing_stream.total_in); 50 debug("compress incoming: raw data %lu, compressed %lu, factor %.2f", 51 incoming_stream.total_out, incoming_stream.total_in, --- 7 unchanged lines hidden (view full) --- 59 * Compresses the contents of input_buffer into output_buffer. All packets 60 * compressed using this function will form a single compressed data stream; 61 * however, data will be flushed at the end of every call so that each 62 * output_buffer can be decompressed independently (but in the appropriate 63 * order since they together form a single compression stream) by the 64 * receiver. This appends the compressed data to the output buffer. 65 */ 66 | 44buffer_compress_uninit() 45{ 46 debug("compress outgoing: raw data %lu, compressed %lu, factor %.2f", 47 outgoing_stream.total_in, outgoing_stream.total_out, 48 outgoing_stream.total_in == 0 ? 0.0 : 49 (double) outgoing_stream.total_out / outgoing_stream.total_in); 50 debug("compress incoming: raw data %lu, compressed %lu, factor %.2f", 51 incoming_stream.total_out, incoming_stream.total_in, --- 7 unchanged lines hidden (view full) --- 59 * Compresses the contents of input_buffer into output_buffer. All packets 60 * compressed using this function will form a single compressed data stream; 61 * however, data will be flushed at the end of every call so that each 62 * output_buffer can be decompressed independently (but in the appropriate 63 * order since they together form a single compression stream) by the 64 * receiver. This appends the compressed data to the output buffer. 65 */ 66 |
67void | 67void |
68buffer_compress(Buffer * input_buffer, Buffer * output_buffer) 69{ 70 char buf[4096]; 71 int status; 72 73 /* This case is not handled below. */ 74 if (buffer_len(input_buffer) == 0) 75 return; --- 9 unchanged lines hidden (view full) --- 85 outgoing_stream.avail_out = sizeof(buf); 86 87 /* Compress as much data into the buffer as possible. */ 88 status = deflate(&outgoing_stream, Z_PARTIAL_FLUSH); 89 switch (status) { 90 case Z_OK: 91 /* Append compressed data to output_buffer. */ 92 buffer_append(output_buffer, buf, | 68buffer_compress(Buffer * input_buffer, Buffer * output_buffer) 69{ 70 char buf[4096]; 71 int status; 72 73 /* This case is not handled below. */ 74 if (buffer_len(input_buffer) == 0) 75 return; --- 9 unchanged lines hidden (view full) --- 85 outgoing_stream.avail_out = sizeof(buf); 86 87 /* Compress as much data into the buffer as possible. */ 88 status = deflate(&outgoing_stream, Z_PARTIAL_FLUSH); 89 switch (status) { 90 case Z_OK: 91 /* Append compressed data to output_buffer. */ 92 buffer_append(output_buffer, buf, |
93 sizeof(buf) - outgoing_stream.avail_out); | 93 sizeof(buf) - outgoing_stream.avail_out); |
94 break; | 94 break; |
95 case Z_STREAM_END: 96 fatal("buffer_compress: deflate returned Z_STREAM_END"); 97 /* NOTREACHED */ 98 case Z_STREAM_ERROR: 99 fatal("buffer_compress: deflate returned Z_STREAM_ERROR"); 100 /* NOTREACHED */ 101 case Z_BUF_ERROR: 102 fatal("buffer_compress: deflate returned Z_BUF_ERROR"); 103 /* NOTREACHED */ | |
104 default: 105 fatal("buffer_compress: deflate returned %d", status); 106 /* NOTREACHED */ 107 } | 95 default: 96 fatal("buffer_compress: deflate returned %d", status); 97 /* NOTREACHED */ 98 } |
108 } 109 while (outgoing_stream.avail_out == 0); | 99 } while (outgoing_stream.avail_out == 0); |
110} 111 112/* 113 * Uncompresses the contents of input_buffer into output_buffer. All packets 114 * uncompressed using this function will form a single compressed data 115 * stream; however, data will be flushed at the end of every call so that 116 * each output_buffer. This must be called for the same size units that the 117 * buffer_compress was called, and in the same order that buffers compressed 118 * with that. This appends the uncompressed data to the output buffer. 119 */ 120 | 100} 101 102/* 103 * Uncompresses the contents of input_buffer into output_buffer. All packets 104 * uncompressed using this function will form a single compressed data 105 * stream; however, data will be flushed at the end of every call so that 106 * each output_buffer. This must be called for the same size units that the 107 * buffer_compress was called, and in the same order that buffers compressed 108 * with that. This appends the uncompressed data to the output buffer. 109 */ 110 |
121void | 111void |
122buffer_uncompress(Buffer * input_buffer, Buffer * output_buffer) 123{ 124 char buf[4096]; 125 int status; 126 127 incoming_stream.next_in = (unsigned char *) buffer_ptr(input_buffer); 128 incoming_stream.avail_in = buffer_len(input_buffer); 129 | 112buffer_uncompress(Buffer * input_buffer, Buffer * output_buffer) 113{ 114 char buf[4096]; 115 int status; 116 117 incoming_stream.next_in = (unsigned char *) buffer_ptr(input_buffer); 118 incoming_stream.avail_in = buffer_len(input_buffer); 119 |
130 incoming_stream.next_out = (unsigned char *) buf; 131 incoming_stream.avail_out = sizeof(buf); 132 | |
133 for (;;) { | 120 for (;;) { |
121 /* Set up fixed-size output buffer. */ 122 incoming_stream.next_out = (unsigned char *) buf; 123 incoming_stream.avail_out = sizeof(buf); 124 |
|
134 status = inflate(&incoming_stream, Z_PARTIAL_FLUSH); 135 switch (status) { 136 case Z_OK: 137 buffer_append(output_buffer, buf, | 125 status = inflate(&incoming_stream, Z_PARTIAL_FLUSH); 126 switch (status) { 127 case Z_OK: 128 buffer_append(output_buffer, buf, |
138 sizeof(buf) - incoming_stream.avail_out); 139 incoming_stream.next_out = (unsigned char *) buf; 140 incoming_stream.avail_out = sizeof(buf); | 129 sizeof(buf) - incoming_stream.avail_out); |
141 break; | 130 break; |
142 case Z_STREAM_END: 143 fatal("buffer_uncompress: inflate returned Z_STREAM_END"); 144 /* NOTREACHED */ 145 case Z_DATA_ERROR: 146 fatal("buffer_uncompress: inflate returned Z_DATA_ERROR"); 147 /* NOTREACHED */ 148 case Z_STREAM_ERROR: 149 fatal("buffer_uncompress: inflate returned Z_STREAM_ERROR"); 150 /* NOTREACHED */ | |
151 case Z_BUF_ERROR: 152 /* 153 * Comments in zlib.h say that we should keep calling 154 * inflate() until we get an error. This appears to 155 * be the error that we get. 156 */ 157 return; | 131 case Z_BUF_ERROR: 132 /* 133 * Comments in zlib.h say that we should keep calling 134 * inflate() until we get an error. This appears to 135 * be the error that we get. 136 */ 137 return; |
158 case Z_MEM_ERROR: 159 fatal("buffer_uncompress: inflate returned Z_MEM_ERROR"); 160 /* NOTREACHED */ | |
161 default: 162 fatal("buffer_uncompress: inflate returned %d", status); | 138 default: 139 fatal("buffer_uncompress: inflate returned %d", status); |
140 /* NOTREACHED */ |
|
163 } 164 } 165} | 141 } 142 } 143} |