summaryrefslogtreecommitdiff
path: root/generator.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2002-07-31 21:20:07 +0000
committerWayne Davison <wayned@samba.org>2002-07-31 21:20:07 +0000
commit8060514230c598945923397398e59d27688b845e (patch)
tree9cea3db151c776fb464e6e3edce7e63d12ba89a0 /generator.c
parentb1a2f37a6ed3fb6d377960d4e62e5eceea279b3b (diff)
downloadrsync-8060514230c598945923397398e59d27688b845e.tar.gz
rsync-8060514230c598945923397398e59d27688b845e.tar.bz2
rsync-8060514230c598945923397398e59d27688b845e.zip
Stefan Nehlsen's fix of a timeout problem on large files.
(Modified to work with the latest CVS source.)
Diffstat (limited to 'generator.c')
-rw-r--r--generator.c125
1 files changed, 43 insertions, 82 deletions
diff --git a/generator.c b/generator.c
index 7a939aff..dd3eef66 100644
--- a/generator.c
+++ b/generator.c
@@ -100,33 +100,17 @@ static int adapt_block_size(struct file_struct *file, int bsize)
/*
- send a sums struct down a fd
+ send a header that says "we have no checksums" down the f_out fd
*/
-static void send_sums(struct sum_struct *s, int f_out)
+static void send_null_sums(int f_out)
{
- if (s) {
- size_t i;
-
- /* tell the other guy how many we are going to be
- doing and how many bytes there are in the last
- chunk */
- write_int(f_out, s->count);
- write_int(f_out, s->n);
- write_int(f_out, s->remainder);
-
- for (i = 0; i < s->count; i++) {
- write_int(f_out, s->sums[i].sum1);
- write_buf(f_out, s->sums[i].sum2, csum_length);
- }
- } else {
- /* we don't have checksums */
- write_int(f_out, 0);
- write_int(f_out, block_size);
- write_int(f_out, 0);
- }
+ write_int(f_out, 0);
+ write_int(f_out, block_size);
+ write_int(f_out, 0);
}
+
/**
* Perhaps we want to just send an empty checksum set for this file,
* which will force the whole thing to be literally transferred.
@@ -157,71 +141,52 @@ static BOOL disable_deltas_p(void)
}
-/**
- * Generate a stream of signatures/checksums that describe a buffer.
- *
- * Generate approximately one checksum every @p n bytes.
+/*
+ * Generate and send a stream of signatures/checksums that describe a buffer
*
- * @return Newly-allocated sum_struct
- **/
-static struct sum_struct *generate_sums(struct map_struct *buf, OFF_T len,
- int n)
+ * Generate approximately one checksum every block_len bytes.
+ */
+static void generate_and_send_sums(struct map_struct *buf, OFF_T len,
+ int block_len, int f_out)
{
- int i;
- struct sum_struct *s;
- int count;
- int block_len = n;
- int remainder = (len % block_len);
+ size_t i;
+ struct sum_struct sum;
OFF_T offset = 0;
- count = (len + (block_len - 1)) / block_len;
-
- s = (struct sum_struct *) malloc(sizeof(*s));
- if (!s)
- out_of_memory("generate_sums");
+ sum.count = (len + (block_len - 1)) / block_len;
+ sum.remainder = (len % block_len);
+ sum.n = block_len;
+ sum.flength = len;
+ /* not needed here sum.sums = NULL; */
- s->count = count;
- s->remainder = remainder;
- s->n = n;
- s->flength = len;
-
- if (count == 0) {
- s->sums = NULL;
- return s;
- }
-
- if (verbose > 3) {
+ if (sum.count && verbose > 3) {
rprintf(FINFO, "count=%ld rem=%ld n=%ld flength=%.0f\n",
- (long) s->count, (long) s->remainder,
- (long) s->n, (double) s->flength);
+ (long) sum.count, (long) sum.remainder,
+ (long) sum.n, (double) sum.flength);
}
- s->sums = (struct sum_buf *) malloc(sizeof(s->sums[0]) * s->count);
- if (!s->sums)
- out_of_memory("generate_sums");
+ write_int(f_out, sum.count);
+ write_int(f_out, sum.n);
+ write_int(f_out, sum.remainder);
- for (i = 0; i < count; i++) {
- int n1 = MIN(len, n);
+ for (i = 0; i < sum.count; i++) {
+ int n1 = MIN(len, block_len);
char *map = map_ptr(buf, offset, n1);
+ uint32 sum1 = get_checksum1(map, n1);
+ char sum2[SUM_LENGTH];
- s->sums[i].sum1 = get_checksum1(map, n1);
- get_checksum2(map, n1, s->sums[i].sum2);
+ get_checksum2(map, n1, sum2);
- s->sums[i].offset = offset;
- s->sums[i].len = n1;
- s->sums[i].i = i;
-
- if (verbose > 3)
+ if (verbose > 3) {
rprintf(FINFO,
- "chunk[%d] offset=%.0f len=%d sum1=%08x\n",
- i, (double) s->sums[i].offset,
- s->sums[i].len, s->sums[i].sum1);
-
+ "chunk[%d] offset=%.0f len=%d sum1=%08lx\n",
+ i, (double) offset, n1, (unsigned long) sum1);
+ }
+ write_int(f_out, sum1);
+ write_buf(f_out, sum2, csum_length);
len -= n1;
offset += n1;
}
-
- return s;
}
@@ -239,7 +204,6 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out)
int fd;
STRUCT_STAT st;
struct map_struct *buf;
- struct sum_struct *s;
int statret;
struct file_struct *file = flist->files[i];
char *fnamecmp;
@@ -399,7 +363,7 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out)
if (statret == -1) {
if (errno == ENOENT) {
write_int(f_out,i);
- if (!dry_run) send_sums(NULL,f_out);
+ if (!dry_run) send_null_sums(f_out);
} else {
if (verbose > 1)
rprintf(FERROR, RSYNC_NAME
@@ -416,7 +380,7 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out)
/* now pretend the file didn't exist */
write_int(f_out,i);
- if (!dry_run) send_sums(NULL,f_out);
+ if (!dry_run) send_null_sums(f_out);
return;
}
@@ -445,7 +409,7 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out)
if (disable_deltas_p()) {
write_int(f_out,i);
- send_sums(NULL,f_out);
+ send_null_sums(f_out);
return;
}
@@ -456,7 +420,7 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out)
rprintf(FERROR,RSYNC_NAME": failed to open \"%s\", continuing : %s\n",fnamecmp,strerror(errno));
/* pretend the file didn't exist */
write_int(f_out,i);
- send_sums(NULL,f_out);
+ send_null_sums(f_out);
return;
}
@@ -469,18 +433,15 @@ void recv_generator(char *fname, struct file_list *flist, int i, int f_out)
if (verbose > 3)
rprintf(FINFO,"gen mapped %s of size %.0f\n",fnamecmp,(double)st.st_size);
- s = generate_sums(buf,st.st_size,adapt_block_size(file, block_size));
-
if (verbose > 2)
- rprintf(FINFO,"sending sums for %d\n",i);
+ rprintf(FINFO, "generating and sending sums for %d\n", i);
write_int(f_out,i);
- send_sums(s,f_out);
+ generate_and_send_sums(buf, st.st_size,
+ adapt_block_size(file, block_size), f_out);
close(fd);
if (buf) unmap_file(buf);
-
- free_sums(s);
}