char *exclude_from;
char *log_format;
char *refuse_options;
+ char *dont_compress;
int timeout;
} service;
NULL, /* exclude from */
"%o %h [%a] %m (%u) %f %l", /* log format */
NULL, /* refuse options */
+ "*.gz *.tgz *.zip *.z *.rpm *.deb", /* dont compress */
0 /* timeout */
};
{"transfer logging", P_BOOL, P_LOCAL, &sDefault.transfer_logging,NULL,0},
{"log format", P_STRING, P_LOCAL, &sDefault.log_format, NULL, 0},
{"refuse options", P_STRING, P_LOCAL, &sDefault.refuse_options,NULL, 0},
+ {"dont compress", P_STRING, P_LOCAL, &sDefault.dont_compress,NULL, 0},
{NULL, P_BOOL, P_NONE, NULL, NULL, 0}
};
FN_LOCAL_STRING(lp_exclude_from, exclude_from)
FN_LOCAL_STRING(lp_log_format, log_format)
FN_LOCAL_STRING(lp_refuse_options, refuse_options)
+FN_LOCAL_STRING(lp_dont_compress, dont_compress)
FN_LOCAL_INTEGER(lp_timeout, timeout)
/* local prototypes */
The full names of the options must be used (ie. you must use
"compress" not "z" to disable compression).
+dit(bf(dont compress)) The "dont compress" option allows you to select
+filenames based on wildcard patterns that should not be compressed
+during transfer. Compression is expensive in terms of CPU usage so it
+is usually good to not try to compress files that won't compress well,
+such as already compressed files.
+
+The "dont compress" option takes a space separated list of
+case-insensitive wildcard patterns. Any source filename matching one
+of the patterns will not be compressed during transfer.
+
+The default setting is verb(*.gz *.tgz *.zip *.z *.rpm *.deb)
+
enddit()
manpagesection(AUTHENTICATION STRENGTH)
if (!am_server) {
log_transfer(file, fname+offset);
}
+
+ set_compression(fname);
match_sums(f_out,s,buf,st.st_size);
#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;
+
+ 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");