--- generator.c	11 Jun 2004 07:40:51 -0000	1.87
+++ generator.c	15 Jun 2004 16:19:44 -0000
@@ -39,6 +39,7 @@ extern int opt_ignore_existing;
 extern int csum_length;
 extern int ignore_times;
 extern int size_only;
+extern OFF_T max_size;
 extern int io_timeout;
 extern int protocol_version;
 extern int always_checksum;
@@ -345,6 +346,10 @@ void recv_generator(char *fname, struct 
 		    && verbose && f_out != -1)
 			rprintf(FINFO,"%s/\n",fname);
 		return;
+	} else if (max_size && file->length > max_size) {
+		if (verbose > 1)
+			rprintf(FINFO, "%s is over max-size\n", fname);
+		return;
 	}
 
 	if (preserve_links && S_ISLNK(file->mode)) {
--- options.c	7 Jun 2004 22:05:22 -0000	1.156
+++ options.c	15 Jun 2004 16:19:44 -0000
@@ -90,6 +90,7 @@ int delete_after = 0;
 int only_existing = 0;
 int opt_ignore_existing = 0;
 int max_delete = 0;
+OFF_T max_size = 0;
 int ignore_errors = 0;
 int modify_window = 0;
 int blocking_io = -1;
@@ -139,6 +140,7 @@ char *batch_prefix = NULL;
 
 static int daemon_opt;   /* sets am_daemon after option error-reporting */
 static int modify_window_set;
+static char *max_size_arg;
 
 /** Local address to bind.  As a character string because it's
  * interpreted by the IPv6 layer: should be a numeric IP4 or ip6
@@ -260,6 +262,7 @@ void usage(enum logcode F)
   rprintf(F,"     --delete-after          receiver deletes after transferring, not before\n");
   rprintf(F,"     --ignore-errors         delete even if there are I/O errors\n");
   rprintf(F,"     --max-delete=NUM        don't delete more than NUM files\n");
+  rprintf(F,"     --max-size=SIZE         don't transfer any file larger than SIZE\n");
   rprintf(F,"     --partial               keep partially transferred files\n");
   rprintf(F,"     --force                 force deletion of directories even if not empty\n");
   rprintf(F,"     --numeric-ids           don't map uid/gid values by user/group name\n");
@@ -310,7 +313,7 @@ void usage(enum logcode F)
 enum {OPT_VERSION = 1000, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
       OPT_DELETE_AFTER, OPT_DELETE_EXCLUDED, OPT_LINK_DEST,
       OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW,
-      OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_TIMEOUT,
+      OPT_READ_BATCH, OPT_WRITE_BATCH, OPT_TIMEOUT, OPT_MAX_SIZE,
       OPT_REFUSED_BASE = 9000};
 
 static struct poptOption long_options[] = {
@@ -364,6 +367,7 @@ static struct poptOption long_options[] 
   {"rsh",             'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
   {"block-size",      'B', POPT_ARG_INT,    &block_size, 0, 0, 0 },
   {"max-delete",       0,  POPT_ARG_INT,    &max_delete, 0, 0, 0 },
+  {"max-size",         0,  POPT_ARG_STRING, &max_size_arg,  OPT_MAX_SIZE, 0, 0 },
   {"timeout",          0,  POPT_ARG_INT,    &io_timeout, OPT_TIMEOUT, 0, 0 },
   {"temp-dir",        'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 },
   {"compare-dest",     0,  POPT_ARG_STRING, &compare_dest, 0, 0, 0 },
@@ -580,6 +584,32 @@ int parse_arguments(int *argc, const cha
 			checksum_seed = FIXED_CHECKSUM_SEED;
 			break;
 
+		case OPT_MAX_SIZE:
+			for (arg = max_size_arg; isdigit(*arg); arg++) {}
+			if (*arg == '.')
+				for (arg++; isdigit(*arg); arg++) {}
+			if (arg == max_size_arg)
+				arg = "?";
+			switch (*arg) {
+			case 'k': case 'K':
+				max_size = atof(max_size_arg) * 1024;
+				break;
+			case 'm': case 'M':
+				max_size = atof(max_size_arg) * 1024*1024;
+				break;
+			case 'g': case 'G':
+				max_size = atof(max_size_arg) * 1024*1024*1024;
+				break;
+			case '\0':
+				break;
+			default:
+				rprintf(FERROR,
+					"--max-size value is invalid.\n");
+				exit_cleanup(RERR_SYNTAX);
+				break;
+			}
+			break;
+
 		case OPT_TIMEOUT:
 			if (io_timeout && io_timeout < select_timeout)
 				select_timeout = io_timeout;
@@ -884,6 +914,11 @@ void server_options(char **args,int *arg
 		args[ac++] = arg;
 	}
 
+	if (max_size && am_sender) {
+		args[ac++] = "--max-size";
+		args[ac++] = max_size_arg;
+	}
+
 	if (batch_prefix) {
 		char *r_or_w = write_batch ? "write" : "read";
 		if (asprintf(&arg, "--%s-batch=%s", r_or_w, batch_prefix) < 0)
--- rsync.yo	5 Jun 2004 16:16:30 -0000	1.171
+++ rsync.yo	15 Jun 2004 16:19:45 -0000
@@ -315,6 +315,7 @@ verb(
      --delete-after          receiver deletes after transfer, not before
      --ignore-errors         delete even if there are I/O errors
      --max-delete=NUM        don't delete more than NUM files
+     --max-size=SIZE         don't transfer any file larger than SIZE
      --partial               keep partially transferred files
      --force                 force deletion of dirs even if not empty
      --numeric-ids           don't map uid/gid values by user/group name
@@ -577,6 +578,11 @@ dit(bf(--max-delete=NUM)) This tells rsy
 files or directories. This is useful when mirroring very large trees
 to prevent disasters.
 
+dit(bf(--max-size=SIZE)) This tells rsync to avoid transferring any
+file that is larger than the specified SIZE. The SIZE value can be
+suffixed with a letter to indicate a size multiplier (K, M, or G) and
+may be a fractional value (e.g. "--max-size=1.5m").
+
 dit(bf(--delete)) This tells rsync to delete any files on the receiving
 side that aren't on the sending side.   Files that are excluded from
 transfer are excluded from being deleted unless you use --delete-excluded.
