Commit 83fff1aa authored by Andrew Tridgell's avatar Andrew Tridgell

added "dont compress" option with the default setting of

	*.gz *.tgz *.zip *.z *.rpm *.deb
parent 055af776
...@@ -131,6 +131,7 @@ typedef struct ...@@ -131,6 +131,7 @@ typedef struct
char *exclude_from; char *exclude_from;
char *log_format; char *log_format;
char *refuse_options; char *refuse_options;
char *dont_compress;
int timeout; int timeout;
} service; } service;
...@@ -155,6 +156,7 @@ static service sDefault = ...@@ -155,6 +156,7 @@ static service sDefault =
NULL, /* exclude from */ NULL, /* exclude from */
"%o %h [%a] %m (%u) %f %l", /* log format */ "%o %h [%a] %m (%u) %f %l", /* log format */
NULL, /* refuse options */ NULL, /* refuse options */
"*.gz *.tgz *.zip *.z *.rpm *.deb", /* dont compress */
0 /* timeout */ 0 /* timeout */
}; };
...@@ -264,6 +266,7 @@ static struct parm_struct parm_table[] = ...@@ -264,6 +266,7 @@ static struct parm_struct parm_table[] =
{"transfer logging", P_BOOL, P_LOCAL, &sDefault.transfer_logging,NULL,0}, {"transfer logging", P_BOOL, P_LOCAL, &sDefault.transfer_logging,NULL,0},
{"log format", P_STRING, P_LOCAL, &sDefault.log_format, NULL, 0}, {"log format", P_STRING, P_LOCAL, &sDefault.log_format, NULL, 0},
{"refuse options", P_STRING, P_LOCAL, &sDefault.refuse_options,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} {NULL, P_BOOL, P_NONE, NULL, NULL, 0}
}; };
...@@ -337,6 +340,7 @@ FN_LOCAL_STRING(lp_exclude, exclude) ...@@ -337,6 +340,7 @@ FN_LOCAL_STRING(lp_exclude, exclude)
FN_LOCAL_STRING(lp_exclude_from, exclude_from) FN_LOCAL_STRING(lp_exclude_from, exclude_from)
FN_LOCAL_STRING(lp_log_format, log_format) FN_LOCAL_STRING(lp_log_format, log_format)
FN_LOCAL_STRING(lp_refuse_options, refuse_options) FN_LOCAL_STRING(lp_refuse_options, refuse_options)
FN_LOCAL_STRING(lp_dont_compress, dont_compress)
FN_LOCAL_INTEGER(lp_timeout, timeout) FN_LOCAL_INTEGER(lp_timeout, timeout)
/* local prototypes */ /* local prototypes */
......
...@@ -294,6 +294,18 @@ prints an error message and exits. ...@@ -294,6 +294,18 @@ prints an error message and exits.
The full names of the options must be used (ie. you must use The full names of the options must be used (ie. you must use
"compress" not "z" to disable compression). "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() enddit()
manpagesection(AUTHENTICATION STRENGTH) manpagesection(AUTHENTICATION STRENGTH)
......
...@@ -201,6 +201,8 @@ void send_files(struct file_list *flist,int f_out,int f_in) ...@@ -201,6 +201,8 @@ void send_files(struct file_list *flist,int f_out,int f_in)
log_transfer(file, fname+offset); log_transfer(file, fname+offset);
} }
set_compression(fname);
match_sums(f_out,s,buf,st.st_size); match_sums(f_out,s,buf,st.st_size);
log_send(file, &initial_stats); log_send(file, &initial_stats);
......
...@@ -21,7 +21,38 @@ ...@@ -21,7 +21,38 @@
#include "zlib/zlib.h" #include "zlib/zlib.h"
extern int do_compression; 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 */ /* non-compressing recv token */
static int simple_recv_token(int f,char **data) static int simple_recv_token(int f,char **data)
...@@ -104,7 +135,7 @@ send_deflated_token(int f, int token, ...@@ -104,7 +135,7 @@ send_deflated_token(int f, int token,
tx_strm.next_in = NULL; tx_strm.next_in = NULL;
tx_strm.zalloc = NULL; tx_strm.zalloc = NULL;
tx_strm.zfree = NULL; tx_strm.zfree = NULL;
if (deflateInit2(&tx_strm, Z_DEFAULT_COMPRESSION, if (deflateInit2(&tx_strm, compression_level,
Z_DEFLATED, -15, 8, Z_DEFLATED, -15, 8,
Z_DEFAULT_STRATEGY) != Z_OK) { Z_DEFAULT_STRATEGY) != Z_OK) {
rprintf(FERROR, "compression init failed\n"); rprintf(FERROR, "compression init failed\n");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment