diff options
author | Wayne Davison <wayned@samba.org> | 2002-07-31 21:20:07 +0000 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2002-07-31 21:20:07 +0000 |
commit | 8060514230c598945923397398e59d27688b845e (patch) | |
tree | 9cea3db151c776fb464e6e3edce7e63d12ba89a0 /generator.c | |
parent | b1a2f37a6ed3fb6d377960d4e62e5eceea279b3b (diff) | |
download | rsync-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.c | 125 |
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); } |