#include "zlib/zlib.h"
extern int do_compression;
+static int compression_level = Z_DEFAULT_COMPRESSION;
+/* determine the compression level based on a wildcard filename list */
+void set_compression(char *fname)
+{
+ extern int module_id;
+ char *dont;
+ char *tok;
+
+ if (!do_compression) return;
+
+ compression_level = Z_DEFAULT_COMPRESSION;
+ dont = lp_dont_compress(module_id);
+
+ if (!dont || !*dont) return;
+
+ if ((dont[0] == '*') && (!dont[1])) {
+ /* an optimization to skip the rest of this routine */
+ compression_level = 0;
+ return;
+ }
+
+ dont = strdup(dont);
+ fname = strdup(fname);
+ if (!dont || !fname) return;
+
+ strlower(dont);
+ strlower(fname);
+
+ for (tok=strtok(dont," ");tok;tok=strtok(NULL," ")) {
+ if (fnmatch(tok, fname, 0) == 0) {
+ compression_level = 0;
+ break;
+ }
+ }
+ free(dont);
+ free(fname);
+}
/* non-compressing recv token */
static int simple_recv_token(int f,char **data)
tx_strm.next_in = NULL;
tx_strm.zalloc = NULL;
tx_strm.zfree = NULL;
- if (deflateInit2(&tx_strm, Z_DEFAULT_COMPRESSION,
+ if (deflateInit2(&tx_strm, compression_level,
Z_DEFLATED, -15, 8,
Z_DEFAULT_STRATEGY) != Z_OK) {
rprintf(FERROR, "compression init failed\n");
- exit_cleanup(1);
+ exit_cleanup(RERR_STREAMIO);
}
if ((obuf = malloc(MAX_DATA_COUNT+2)) == NULL)
out_of_memory("send_deflated_token");
r = deflate(&tx_strm, flush);
if (r != Z_OK) {
rprintf(FERROR, "deflate returned %d\n", r);
- exit_cleanup(1);
+ exit_cleanup(RERR_STREAMIO);
}
if (nb == 0 || tx_strm.avail_out == 0) {
n = MAX_DATA_COUNT - tx_strm.avail_out;
if (r != Z_OK || tx_strm.avail_in != 0) {
rprintf(FERROR, "deflate on token returned %d (%d bytes left)\n",
r, tx_strm.avail_in);
- exit_cleanup(1);
+ exit_cleanup(RERR_STREAMIO);
}
}
}
rx_strm.zfree = NULL;
if (inflateInit2(&rx_strm, -15) != Z_OK) {
rprintf(FERROR, "inflate init failed\n");
- exit_cleanup(1);
+ exit_cleanup(RERR_STREAMIO);
}
if ((cbuf = malloc(MAX_DATA_COUNT)) == NULL
|| (dbuf = malloc(CHUNK_SIZE)) == NULL)
if (r != Z_OK && r != Z_BUF_ERROR) {
rprintf(FERROR, "inflate flush returned %d (%d bytes)\n",
r, n);
- exit_cleanup(1);
+ exit_cleanup(RERR_STREAMIO);
}
if (n != 0 && r != Z_BUF_ERROR) {
/* have to return some more data and
*/
if (!inflateSyncPoint(&rx_strm)) {
rprintf(FERROR, "decompressor lost sync!\n");
- exit_cleanup(1);
+ exit_cleanup(RERR_STREAMIO);
}
rx_strm.avail_in = 4;
rx_strm.next_in = (Bytef *)cbuf;
n = CHUNK_SIZE - rx_strm.avail_out;
if (r != Z_OK) {
rprintf(FERROR, "inflate returned %d (%d bytes)\n", r, n);
- exit_cleanup(1);
+ exit_cleanup(RERR_STREAMIO);
}
if (rx_strm.avail_in == 0)
recv_state = r_inflated;
r = inflate(&rx_strm, Z_SYNC_FLUSH);
if (r != Z_OK) {
rprintf(FERROR, "inflate (token) returned %d\n", r);
- exit_cleanup(1);
+ exit_cleanup(RERR_STREAMIO);
}
} while (len || rx_strm.avail_out == 0);
}