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