- fixed spelling errors in man page
[rsync/rsync.git] / rsync.c
... / ...
CommitLineData
1/*
2 Copyright (C) Andrew Tridgell 1996
3 Copyright (C) Paul Mackerras 1996
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18*/
19
20#include "rsync.h"
21
22extern int csum_length;
23
24extern int verbose;
25extern int am_server;
26extern int always_checksum;
27extern time_t starttime;
28
29extern int remote_version;
30
31extern char *backup_suffix;
32
33extern int whole_file;
34extern int block_size;
35extern int update_only;
36extern int make_backups;
37extern int preserve_links;
38extern int preserve_hard_links;
39extern int preserve_perms;
40extern int preserve_devices;
41extern int preserve_uid;
42extern int preserve_gid;
43extern int preserve_times;
44extern int dry_run;
45extern int ignore_times;
46extern int recurse;
47extern int delete_mode;
48extern int cvs_exclude;
49extern int am_root;
50extern int relative_paths;
51
52/*
53 free a sums struct
54 */
55static void free_sums(struct sum_struct *s)
56{
57 if (s->sums) free(s->sums);
58 free(s);
59}
60
61
62
63/*
64 send a sums struct down a fd
65 */
66static void send_sums(struct sum_struct *s,int f_out)
67{
68 int i;
69
70 /* tell the other guy how many we are going to be doing and how many
71 bytes there are in the last chunk */
72 write_int(f_out,s?s->count:0);
73 write_int(f_out,s?s->n:block_size);
74 write_int(f_out,s?s->remainder:0);
75 if (s)
76 for (i=0;i<s->count;i++) {
77 write_int(f_out,s->sums[i].sum1);
78 write_buf(f_out,s->sums[i].sum2,csum_length);
79 }
80 write_flush(f_out);
81}
82
83
84/*
85 generate a stream of signatures/checksums that describe a buffer
86
87 generate approximately one checksum every n bytes
88 */
89static struct sum_struct *generate_sums(struct map_struct *buf,off_t len,int n)
90{
91 int i;
92 struct sum_struct *s;
93 int count;
94 int block_len = n;
95 int remainder = (len%block_len);
96 off_t offset = 0;
97
98 count = (len+(block_len-1))/block_len;
99
100 s = (struct sum_struct *)malloc(sizeof(*s));
101 if (!s) out_of_memory("generate_sums");
102
103 s->count = count;
104 s->remainder = remainder;
105 s->n = n;
106 s->flength = len;
107
108 if (count==0) {
109 s->sums = NULL;
110 return s;
111 }
112
113 if (verbose > 3)
114 fprintf(FERROR,"count=%d rem=%d n=%d flength=%d\n",
115 s->count,s->remainder,s->n,(int)s->flength);
116
117 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
118 if (!s->sums) out_of_memory("generate_sums");
119
120 for (i=0;i<count;i++) {
121 int n1 = MIN(len,n);
122 char *map = map_ptr(buf,offset,n1);
123
124 s->sums[i].sum1 = get_checksum1(map,n1);
125 get_checksum2(map,n1,s->sums[i].sum2);
126
127 s->sums[i].offset = offset;
128 s->sums[i].len = n1;
129 s->sums[i].i = i;
130
131 if (verbose > 3)
132 fprintf(FERROR,"chunk[%d] offset=%d len=%d sum1=%08x\n",
133 i,(int)s->sums[i].offset,s->sums[i].len,s->sums[i].sum1);
134
135 len -= n1;
136 offset += n1;
137 }
138
139 return s;
140}
141
142
143/*
144 receive the checksums for a buffer
145 */
146static struct sum_struct *receive_sums(int f)
147{
148 struct sum_struct *s;
149 int i;
150 off_t offset = 0;
151
152 s = (struct sum_struct *)malloc(sizeof(*s));
153 if (!s) out_of_memory("receive_sums");
154
155 s->count = read_int(f);
156 s->n = read_int(f);
157 s->remainder = read_int(f);
158 s->sums = NULL;
159
160 if (verbose > 3)
161 fprintf(FERROR,"count=%d n=%d rem=%d\n",
162 s->count,s->n,s->remainder);
163
164 if (s->count == 0)
165 return(s);
166
167 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
168 if (!s->sums) out_of_memory("receive_sums");
169
170 for (i=0;i<s->count;i++) {
171 s->sums[i].sum1 = read_int(f);
172 read_buf(f,s->sums[i].sum2,csum_length);
173
174 s->sums[i].offset = offset;
175 s->sums[i].i = i;
176
177 if (i == s->count-1 && s->remainder != 0) {
178 s->sums[i].len = s->remainder;
179 } else {
180 s->sums[i].len = s->n;
181 }
182 offset += s->sums[i].len;
183
184 if (verbose > 3)
185 fprintf(FERROR,"chunk[%d] len=%d offset=%d sum1=%08x\n",
186 i,s->sums[i].len,(int)s->sums[i].offset,s->sums[i].sum1);
187 }
188
189 s->flength = offset;
190
191 return s;
192}
193
194
195static int set_perms(char *fname,struct file_struct *file,struct stat *st,
196 int report)
197{
198 int updated = 0;
199 struct stat st2;
200
201 if (dry_run) return 0;
202
203 if (!st) {
204 if (link_stat(fname,&st2) != 0) {
205 fprintf(FERROR,"stat %s : %s\n",fname,strerror(errno));
206 return 0;
207 }
208 st = &st2;
209 }
210
211 if (preserve_times && !S_ISLNK(st->st_mode) &&
212 st->st_mtime != file->modtime) {
213 updated = 1;
214 if (set_modtime(fname,file->modtime) != 0) {
215 fprintf(FERROR,"failed to set times on %s : %s\n",
216 fname,strerror(errno));
217 return 0;
218 }
219 }
220
221#ifdef HAVE_CHMOD
222 if (preserve_perms && !S_ISLNK(st->st_mode) &&
223 st->st_mode != file->mode) {
224 updated = 1;
225 if (chmod(fname,file->mode) != 0) {
226 fprintf(FERROR,"failed to set permissions on %s : %s\n",
227 fname,strerror(errno));
228 return 0;
229 }
230 }
231#endif
232
233 if ((am_root && preserve_uid && st->st_uid != file->uid) ||
234 (preserve_gid && st->st_gid != file->gid)) {
235 updated = 1;
236 if (lchown(fname,
237 (am_root&&preserve_uid)?file->uid:-1,
238 preserve_gid?file->gid:-1) != 0) {
239 if (verbose>1 || preserve_uid)
240 fprintf(FERROR,"chown %s : %s\n",fname,strerror(errno));
241 return updated;
242 }
243 }
244
245 if (verbose > 1 && report) {
246 if (updated)
247 fprintf(FINFO,"%s\n",fname);
248 else
249 fprintf(FINFO,"%s is uptodate\n",fname);
250 }
251 return updated;
252}
253
254
255void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
256{
257 int fd;
258 struct stat st;
259 struct map_struct *buf;
260 struct sum_struct *s;
261 char sum[MD4_SUM_LENGTH];
262 int statret;
263 struct file_struct *file = &flist->files[i];
264
265 if (verbose > 2)
266 fprintf(FERROR,"recv_generator(%s,%d)\n",fname,i);
267
268 statret = link_stat(fname,&st);
269
270 if (S_ISDIR(file->mode)) {
271 if (dry_run) return;
272 if (statret == 0 && !S_ISDIR(st.st_mode)) {
273 if (unlink(fname) != 0) {
274 fprintf(FERROR,"unlink %s : %s\n",fname,strerror(errno));
275 return;
276 }
277 statret = -1;
278 }
279 if (statret != 0 && mkdir(fname,file->mode) != 0 && errno != EEXIST) {
280 if (!(relative_paths && errno==ENOENT &&
281 create_directory_path(fname)==0 &&
282 mkdir(fname,file->mode)==0)) {
283 fprintf(FERROR,"mkdir %s : %s (2)\n",
284 fname,strerror(errno));
285 }
286 }
287 if (set_perms(fname,file,NULL,0) && verbose)
288 fprintf(FINFO,"%s/\n",fname);
289 return;
290 }
291
292 if (preserve_links && S_ISLNK(file->mode)) {
293#if SUPPORT_LINKS
294 char lnk[MAXPATHLEN];
295 int l;
296 if (statret == 0) {
297 l = readlink(fname,lnk,MAXPATHLEN-1);
298 if (l > 0) {
299 lnk[l] = 0;
300 if (strcmp(lnk,file->link) == 0) {
301 set_perms(fname,file,&st,1);
302 return;
303 }
304 }
305 }
306 if (!dry_run) unlink(fname);
307 if (!dry_run && symlink(file->link,fname) != 0) {
308 fprintf(FERROR,"link %s -> %s : %s\n",
309 fname,file->link,strerror(errno));
310 } else {
311 set_perms(fname,file,NULL,0);
312 if (verbose)
313 fprintf(FINFO,"%s -> %s\n",
314 fname,file->link);
315 }
316#endif
317 return;
318 }
319
320#ifdef HAVE_MKNOD
321 if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
322 if (statret != 0 ||
323 st.st_mode != file->mode ||
324 st.st_rdev != file->rdev) {
325 if (!dry_run) unlink(fname);
326 if (verbose > 2)
327 fprintf(FERROR,"mknod(%s,0%o,0x%x)\n",
328 fname,(int)file->mode,(int)file->rdev);
329 if (!dry_run &&
330 mknod(fname,file->mode,file->rdev) != 0) {
331 fprintf(FERROR,"mknod %s : %s\n",fname,strerror(errno));
332 } else {
333 set_perms(fname,file,NULL,0);
334 if (verbose)
335 fprintf(FINFO,"%s\n",fname);
336 }
337 } else {
338 set_perms(fname,file,&st,1);
339 }
340 return;
341 }
342#endif
343
344 if (preserve_hard_links && check_hard_link(file)) {
345 if (verbose > 1)
346 fprintf(FINFO,"%s is a hard link\n",file->name);
347 return;
348 }
349
350 if (!S_ISREG(file->mode)) {
351 fprintf(FERROR,"skipping non-regular file %s\n",fname);
352 return;
353 }
354
355 if (statret == -1) {
356 if (errno == ENOENT) {
357 write_int(f_out,i);
358 if (!dry_run) send_sums(NULL,f_out);
359 } else {
360 if (verbose > 1)
361 fprintf(FERROR,"recv_generator failed to open %s\n",fname);
362 }
363 return;
364 }
365
366 if (!S_ISREG(st.st_mode)) {
367 /* its not a regular file on the receiving end, but it is on the
368 sending end. If its a directory then skip it (too dangerous to
369 do a recursive deletion??) otherwise try to unlink it */
370 if (S_ISDIR(st.st_mode)) {
371 fprintf(FERROR,"ERROR: %s is a directory\n",fname);
372 return;
373 }
374 if (unlink(fname) != 0) {
375 fprintf(FERROR,"%s : not a regular file (generator)\n",fname);
376 return;
377 }
378
379 /* now pretend the file didn't exist */
380 write_int(f_out,i);
381 if (!dry_run) send_sums(NULL,f_out);
382 return;
383 }
384
385 if (update_only && st.st_mtime >= file->modtime) {
386 if (verbose > 1)
387 fprintf(FERROR,"%s is newer\n",fname);
388 return;
389 }
390
391 if (always_checksum && S_ISREG(st.st_mode)) {
392 file_checksum(fname,sum,st.st_size);
393 }
394
395 if (st.st_size == file->length &&
396 ((!ignore_times && st.st_mtime == file->modtime) ||
397 (always_checksum && S_ISREG(st.st_mode) &&
398 memcmp(sum,file->sum,csum_length) == 0))) {
399 set_perms(fname,file,&st,1);
400 return;
401 }
402
403 if (dry_run) {
404 write_int(f_out,i);
405 return;
406 }
407
408 if (whole_file) {
409 write_int(f_out,i);
410 send_sums(NULL,f_out);
411 return;
412 }
413
414 /* open the file */
415 fd = open(fname,O_RDONLY);
416
417 if (fd == -1) {
418 fprintf(FERROR,"failed to open %s : %s\n",fname,strerror(errno));
419 return;
420 }
421
422 if (st.st_size > 0) {
423 buf = map_file(fd,st.st_size);
424 } else {
425 buf = NULL;
426 }
427
428 if (verbose > 3)
429 fprintf(FERROR,"gen mapped %s of size %d\n",fname,(int)st.st_size);
430
431 s = generate_sums(buf,st.st_size,block_size);
432
433 if (verbose > 2)
434 fprintf(FERROR,"sending sums for %d\n",i);
435
436 write_int(f_out,i);
437 send_sums(s,f_out);
438 write_flush(f_out);
439
440 close(fd);
441 if (buf) unmap_file(buf);
442
443 free_sums(s);
444}
445
446
447
448static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname)
449{
450 int i,n,remainder,len,count;
451 off_t offset = 0;
452 off_t offset2;
453 char *data;
454 static char file_sum1[MD4_SUM_LENGTH];
455 static char file_sum2[MD4_SUM_LENGTH];
456 char *map=NULL;
457
458 count = read_int(f_in);
459 n = read_int(f_in);
460 remainder = read_int(f_in);
461
462 sum_init();
463
464 for (i=recv_token(f_in,&data); i != 0; i=recv_token(f_in,&data)) {
465 if (i > 0) {
466 if (verbose > 3)
467 fprintf(FERROR,"data recv %d at %d\n",i,(int)offset);
468
469 sum_update(data,i);
470
471 if (fd != -1 && write_sparse(fd,data,i) != i) {
472 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
473 exit_cleanup(1);
474 }
475 offset += i;
476 } else {
477 i = -(i+1);
478 offset2 = i*n;
479 len = n;
480 if (i == count-1 && remainder != 0)
481 len = remainder;
482
483 if (verbose > 3)
484 fprintf(FERROR,"chunk[%d] of size %d at %d offset=%d\n",
485 i,len,(int)offset2,(int)offset);
486
487 map = map_ptr(buf,offset2,len);
488
489 see_token(map, len);
490 sum_update(map,len);
491
492 if (fd != -1 && write_sparse(fd,map,len) != len) {
493 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
494 exit_cleanup(1);
495 }
496 offset += len;
497 }
498 }
499
500 if (fd != -1 && offset > 0 && sparse_end(fd) != 0) {
501 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
502 exit_cleanup(1);
503 }
504
505 sum_end(file_sum1);
506
507 if (remote_version >= 14) {
508 read_buf(f_in,file_sum2,MD4_SUM_LENGTH);
509 if (verbose > 2)
510 fprintf(FERROR,"got file_sum\n");
511 if (fd != -1 && memcmp(file_sum1,file_sum2,MD4_SUM_LENGTH) != 0)
512 return 0;
513 }
514 return 1;
515}
516
517
518static void delete_one(struct file_struct *f)
519{
520 if (!S_ISDIR(f->mode)) {
521 if (!dry_run && unlink(f->name) != 0) {
522 fprintf(FERROR,"unlink %s : %s\n",f->name,strerror(errno));
523 } else if (verbose) {
524 fprintf(FERROR,"deleting %s\n",f->name);
525 }
526 } else {
527 if (!dry_run && rmdir(f->name) != 0) {
528 if (errno != ENOTEMPTY)
529 fprintf(FERROR,"rmdir %s : %s\n",f->name,strerror(errno));
530 } else if (verbose) {
531 fprintf(FERROR,"deleting directory %s\n",f->name);
532 }
533 }
534}
535
536
537/* this deletes any files on the receiving side that are not present
538 on the sending side. For version 1.6.4 I have changed the behaviour
539 to match more closely what most people seem to expect of this option */
540static void delete_files(struct file_list *flist)
541{
542 struct file_list *local_file_list;
543 int i, j;
544 char *last_name=NULL;
545
546 if (cvs_exclude)
547 add_cvs_excludes();
548
549 for (j=0;j<flist->count;j++) {
550 if (!S_ISDIR(flist->files[j].mode)) continue;
551 if (strcmp(flist->files[j].name,".")==0) continue;
552 if (last_name &&
553 flist->files[j].name[strlen(last_name)] == '/' &&
554 strncmp(flist->files[j].name,last_name, strlen(last_name))==0)
555 continue;
556 last_name = flist->files[j].name;
557 if (!(local_file_list = send_file_list(-1,1,&last_name)))
558 continue;
559 if (verbose > 1)
560 fprintf(FINFO,"deleting in %s\n", last_name);
561
562 for (i=local_file_list->count-1;i>=0;i--) {
563 if (!local_file_list->files[i].name) continue;
564 if (-1 == flist_find(flist,&local_file_list->files[i])) {
565 delete_one(&local_file_list->files[i]);
566 }
567 }
568 }
569}
570
571static char *cleanup_fname = NULL;
572
573void exit_cleanup(int code)
574{
575 if (cleanup_fname)
576 unlink(cleanup_fname);
577 signal(SIGUSR1, SIG_IGN);
578 if (code) {
579#ifdef GETPGRP_VOID
580 kill(-getpgrp(), SIGUSR1);
581#else
582 kill(-getpgrp(getpid()), SIGUSR1);
583#endif
584 }
585 exit(code);
586}
587
588void sig_int(void)
589{
590 exit_cleanup(1);
591}
592
593
594int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
595{
596 int fd1,fd2;
597 struct stat st;
598 char *fname;
599 char fnametmp[MAXPATHLEN];
600 struct map_struct *buf;
601 int i;
602 struct file_struct *file;
603 int phase=0;
604 int recv_ok;
605
606 if (verbose > 2) {
607 fprintf(FERROR,"recv_files(%d) starting\n",flist->count);
608 }
609
610 if (recurse && delete_mode && !local_name && flist->count>0) {
611 delete_files(flist);
612 }
613
614 while (1)
615 {
616 i = read_int(f_in);
617 if (i == -1) {
618 if (phase==0 && remote_version >= 13) {
619 phase++;
620 csum_length = SUM_LENGTH;
621 if (verbose > 2)
622 fprintf(FERROR,"recv_files phase=%d\n",phase);
623 write_int(f_gen,-1);
624 write_flush(f_gen);
625 continue;
626 }
627 break;
628 }
629
630 file = &flist->files[i];
631 fname = file->name;
632
633 if (local_name)
634 fname = local_name;
635
636 if (dry_run) {
637 if (!am_server && verbose)
638 printf("%s\n",fname);
639 continue;
640 }
641
642 if (verbose > 2)
643 fprintf(FERROR,"recv_files(%s)\n",fname);
644
645 /* open the file */
646 fd1 = open(fname,O_RDONLY);
647
648 if (fd1 != -1 && fstat(fd1,&st) != 0) {
649 fprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
650 receive_data(f_in,NULL,-1,NULL);
651 close(fd1);
652 continue;
653 }
654
655 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
656 fprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
657 receive_data(f_in,NULL,-1,NULL);
658 close(fd1);
659 continue;
660 }
661
662 if (fd1 != -1 && st.st_size > 0) {
663 buf = map_file(fd1,st.st_size);
664 if (verbose > 2)
665 fprintf(FERROR,"recv mapped %s of size %d\n",fname,(int)st.st_size);
666 } else {
667 buf = NULL;
668 }
669
670 /* open tmp file */
671 if (strlen(fname) > (MAXPATHLEN-8)) {
672 fprintf(FERROR,"filename too long\n");
673 close(fd1);
674 continue;
675 }
676 sprintf(fnametmp,"%s.XXXXXX",fname);
677 if (NULL == mktemp(fnametmp)) {
678 fprintf(FERROR,"mktemp %s failed\n",fnametmp);
679 receive_data(f_in,buf,-1,NULL);
680 if (buf) unmap_file(buf);
681 close(fd1);
682 continue;
683 }
684 fd2 = open(fnametmp,O_WRONLY|O_CREAT,file->mode);
685 if (fd2 == -1 && relative_paths && errno == ENOENT &&
686 create_directory_path(fnametmp) == 0) {
687 fd2 = open(fnametmp,O_WRONLY|O_CREAT,file->mode);
688 }
689 if (fd2 == -1) {
690 fprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
691 receive_data(f_in,buf,-1,NULL);
692 if (buf) unmap_file(buf);
693 close(fd1);
694 continue;
695 }
696
697 cleanup_fname = fnametmp;
698
699 if (!am_server && verbose)
700 printf("%s\n",fname);
701
702 /* recv file data */
703 recv_ok = receive_data(f_in,buf,fd2,fname);
704
705 if (fd1 != -1) {
706 if (buf) unmap_file(buf);
707 close(fd1);
708 }
709 close(fd2);
710
711 if (verbose > 2)
712 fprintf(FERROR,"renaming %s to %s\n",fnametmp,fname);
713
714 if (make_backups) {
715 char fnamebak[MAXPATHLEN];
716 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
717 fprintf(FERROR,"backup filename too long\n");
718 continue;
719 }
720 sprintf(fnamebak,"%s%s",fname,backup_suffix);
721 if (rename(fname,fnamebak) != 0 && errno != ENOENT) {
722 fprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
723 continue;
724 }
725 }
726
727 /* move tmp file over real file */
728 if (rename(fnametmp,fname) != 0) {
729 fprintf(FERROR,"rename %s -> %s : %s\n",
730 fnametmp,fname,strerror(errno));
731 unlink(fnametmp);
732 }
733
734 cleanup_fname = NULL;
735
736 set_perms(fname,file,NULL,0);
737
738 if (!recv_ok) {
739 if (verbose > 1)
740 fprintf(FERROR,"redoing %s(%d)\n",fname,i);
741 if (csum_length == SUM_LENGTH)
742 fprintf(FERROR,"ERROR: file corruption in %s\n",fname);
743 write_int(f_gen,i);
744 }
745 }
746
747 if (preserve_hard_links)
748 do_hard_links(flist);
749
750 /* now we need to fix any directory permissions that were
751 modified during the transfer */
752 for (i = 0; i < flist->count; i++) {
753 struct file_struct *file = &flist->files[i];
754 if (!file->name || !S_ISDIR(file->mode)) continue;
755 recv_generator(file->name,flist,i,-1);
756 }
757
758 if (verbose > 2)
759 fprintf(FERROR,"recv_files finished\n");
760
761 return 0;
762}
763
764
765
766off_t send_files(struct file_list *flist,int f_out,int f_in)
767{
768 int fd;
769 struct sum_struct *s;
770 struct map_struct *buf;
771 struct stat st;
772 char fname[MAXPATHLEN];
773 off_t total=0;
774 int i;
775 struct file_struct *file;
776 int phase = 0;
777
778 if (verbose > 2)
779 fprintf(FERROR,"send_files starting\n");
780
781 setup_nonblocking(f_in,f_out);
782
783 while (1)
784 {
785 i = read_int(f_in);
786 if (i == -1) {
787 if (phase==0 && remote_version >= 13) {
788 phase++;
789 csum_length = SUM_LENGTH;
790 write_int(f_out,-1);
791 write_flush(f_out);
792 if (verbose > 2)
793 fprintf(FERROR,"send_files phase=%d\n",phase);
794 continue;
795 }
796 break;
797 }
798
799 file = &flist->files[i];
800
801 fname[0] = 0;
802 if (file->dir) {
803 strncpy(fname,file->dir,MAXPATHLEN-1);
804 fname[MAXPATHLEN-1] = 0;
805 strcat(fname,"/");
806 }
807 strncat(fname,file->name,MAXPATHLEN-strlen(fname));
808
809 if (verbose > 2)
810 fprintf(FERROR,"send_files(%d,%s)\n",i,fname);
811
812 if (dry_run) {
813 if (!am_server && verbose)
814 printf("%s\n",fname);
815 write_int(f_out,i);
816 continue;
817 }
818
819 s = receive_sums(f_in);
820 if (!s) {
821 fprintf(FERROR,"receive_sums failed\n");
822 return -1;
823 }
824
825 fd = open(fname,O_RDONLY);
826 if (fd == -1) {
827 fprintf(FERROR,"send_files failed to open %s: %s\n",
828 fname,strerror(errno));
829 continue;
830 }
831
832 /* map the local file */
833 if (fstat(fd,&st) != 0) {
834 fprintf(FERROR,"fstat failed : %s\n",strerror(errno));
835 close(fd);
836 return -1;
837 }
838
839 if (st.st_size > 0) {
840 buf = map_file(fd,st.st_size);
841 } else {
842 buf = NULL;
843 }
844
845 if (verbose > 2)
846 fprintf(FERROR,"send_files mapped %s of size %d\n",
847 fname,(int)st.st_size);
848
849 write_int(f_out,i);
850
851 write_int(f_out,s->count);
852 write_int(f_out,s->n);
853 write_int(f_out,s->remainder);
854
855 if (verbose > 2)
856 fprintf(FERROR,"calling match_sums %s\n",fname);
857
858 if (!am_server && verbose)
859 printf("%s\n",fname);
860
861 match_sums(f_out,s,buf,st.st_size);
862 write_flush(f_out);
863
864 if (buf) unmap_file(buf);
865 close(fd);
866
867 free_sums(s);
868
869 if (verbose > 2)
870 fprintf(FERROR,"sender finished %s\n",fname);
871
872 total += st.st_size;
873 }
874
875 if (verbose > 2)
876 fprintf(FERROR,"send files finished\n");
877
878 match_report();
879
880 write_int(f_out,-1);
881 write_flush(f_out);
882
883 return total;
884}
885
886
887
888void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
889{
890 int i;
891 int phase=0;
892
893 if (verbose > 2)
894 fprintf(FERROR,"generator starting pid=%d count=%d\n",
895 (int)getpid(),flist->count);
896
897 for (i = 0; i < flist->count; i++) {
898 struct file_struct *file = &flist->files[i];
899 mode_t saved_mode = file->mode;
900 if (!file->name) continue;
901
902 /* we need to ensure that any directories we create have writeable
903 permissions initially so that we can create the files within
904 them. This is then fixed after the files are transferred */
905 if (!am_root && S_ISDIR(file->mode)) {
906 file->mode |= S_IWUSR; /* user write */
907 }
908
909 recv_generator(local_name?local_name:file->name,
910 flist,i,f);
911
912 file->mode = saved_mode;
913 }
914
915 phase++;
916 csum_length = SUM_LENGTH;
917 ignore_times=1;
918
919 if (verbose > 2)
920 fprintf(FERROR,"generate_files phase=%d\n",phase);
921
922 write_int(f,-1);
923 write_flush(f);
924
925 if (remote_version >= 13) {
926 /* in newer versions of the protocol the files can cycle through
927 the system more than once to catch initial checksum errors */
928 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
929 struct file_struct *file = &flist->files[i];
930 recv_generator(local_name?local_name:file->name,
931 flist,i,f);
932 }
933
934 phase++;
935 if (verbose > 2)
936 fprintf(FERROR,"generate_files phase=%d\n",phase);
937
938 write_int(f,-1);
939 write_flush(f);
940 }
941
942
943 if (verbose > 2)
944 fprintf(FERROR,"generator wrote %d\n",write_total());
945}
946
947