changes to make VPATH work correctly, thanks to patl@cag.lcs.mit.edu
[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 (do_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 (do_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
280/* use a larger block size for really big files */
281int adapt_block_size(struct file_struct *file, int bsize)
282{
283 int ret = file->length / (10000); /* rough heuristic */
284 ret = ret & ~15; /* multiple of 16 */
285 if (ret < bsize) ret = bsize;
286 if (ret > CHUNK_SIZE/2) ret = CHUNK_SIZE/2;
287 return ret;
288}
289
290void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
291{
292 int fd;
293 struct stat st;
294 struct map_struct *buf;
295 struct sum_struct *s;
296 int statret;
297 struct file_struct *file = flist->files[i];
298
299 if (verbose > 2)
300 fprintf(FERROR,"recv_generator(%s,%d)\n",fname,i);
301
302 statret = link_stat(fname,&st);
303
304 if (S_ISDIR(file->mode)) {
305 if (dry_run) return;
306 if (statret == 0 && !S_ISDIR(st.st_mode)) {
307 if (do_unlink(fname) != 0) {
308 fprintf(FERROR,"unlink %s : %s\n",fname,strerror(errno));
309 return;
310 }
311 statret = -1;
312 }
313 if (statret != 0 && mkdir(fname,file->mode) != 0 && errno != EEXIST) {
314 if (!(relative_paths && errno==ENOENT &&
315 create_directory_path(fname)==0 &&
316 mkdir(fname,file->mode)==0)) {
317 fprintf(FERROR,"mkdir %s : %s (2)\n",
318 fname,strerror(errno));
319 }
320 }
321 if (set_perms(fname,file,NULL,0) && verbose)
322 fprintf(FINFO,"%s/\n",fname);
323 return;
324 }
325
326 if (preserve_links && S_ISLNK(file->mode)) {
327#if SUPPORT_LINKS
328 char lnk[MAXPATHLEN];
329 int l;
330 if (statret == 0) {
331 l = readlink(fname,lnk,MAXPATHLEN-1);
332 if (l > 0) {
333 lnk[l] = 0;
334 if (strcmp(lnk,file->link) == 0) {
335 set_perms(fname,file,&st,1);
336 return;
337 }
338 }
339 }
340 do_unlink(fname);
341 if (do_symlink(file->link,fname) != 0) {
342 fprintf(FERROR,"link %s -> %s : %s\n",
343 fname,file->link,strerror(errno));
344 } else {
345 set_perms(fname,file,NULL,0);
346 if (verbose)
347 fprintf(FINFO,"%s -> %s\n",
348 fname,file->link);
349 }
350#endif
351 return;
352 }
353
354#ifdef HAVE_MKNOD
355 if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
356 if (statret != 0 ||
357 st.st_mode != file->mode ||
358 st.st_rdev != file->rdev) {
359 do_unlink(fname);
360 if (verbose > 2)
361 fprintf(FERROR,"mknod(%s,0%o,0x%x)\n",
362 fname,(int)file->mode,(int)file->rdev);
363 if (do_mknod(fname,file->mode,file->rdev) != 0) {
364 fprintf(FERROR,"mknod %s : %s\n",fname,strerror(errno));
365 } else {
366 set_perms(fname,file,NULL,0);
367 if (verbose)
368 fprintf(FINFO,"%s\n",fname);
369 }
370 } else {
371 set_perms(fname,file,&st,1);
372 }
373 return;
374 }
375#endif
376
377 if (preserve_hard_links && check_hard_link(file)) {
378 if (verbose > 1)
379 fprintf(FINFO,"%s is a hard link\n",f_name(file));
380 return;
381 }
382
383 if (!S_ISREG(file->mode)) {
384 fprintf(FERROR,"skipping non-regular file %s\n",fname);
385 return;
386 }
387
388 if (statret == -1) {
389 if (errno == ENOENT) {
390 write_int(f_out,i);
391 if (!dry_run) send_sums(NULL,f_out);
392 } else {
393 if (verbose > 1)
394 fprintf(FERROR,"recv_generator failed to open %s\n",fname);
395 }
396 return;
397 }
398
399 if (!S_ISREG(st.st_mode)) {
400 /* its not a regular file on the receiving end, but it is on the
401 sending end. If its a directory then skip it (too dangerous to
402 do a recursive deletion??) otherwise try to unlink it */
403 if (S_ISDIR(st.st_mode)) {
404 fprintf(FERROR,"ERROR: %s is a directory\n",fname);
405 return;
406 }
407 if (do_unlink(fname) != 0) {
408 fprintf(FERROR,"%s : not a regular file (generator)\n",fname);
409 return;
410 }
411
412 /* now pretend the file didn't exist */
413 write_int(f_out,i);
414 if (!dry_run) send_sums(NULL,f_out);
415 return;
416 }
417
418 if (update_only && st.st_mtime > file->modtime) {
419 if (verbose > 1)
420 fprintf(FERROR,"%s is newer\n",fname);
421 return;
422 }
423
424 if (skip_file(fname, file, &st)) {
425 set_perms(fname,file,&st,1);
426 return;
427 }
428
429 if (dry_run) {
430 write_int(f_out,i);
431 return;
432 }
433
434 if (whole_file) {
435 write_int(f_out,i);
436 send_sums(NULL,f_out);
437 return;
438 }
439
440 /* open the file */
441 fd = open(fname,O_RDONLY);
442
443 if (fd == -1) {
444 fprintf(FERROR,"failed to open %s : %s\n",fname,strerror(errno));
445 fprintf(FERROR,"skipping %s\n",fname);
446 return;
447 }
448
449 if (st.st_size > 0) {
450 buf = map_file(fd,st.st_size);
451 } else {
452 buf = NULL;
453 }
454
455 if (verbose > 3)
456 fprintf(FERROR,"gen mapped %s of size %d\n",fname,(int)st.st_size);
457
458 s = generate_sums(buf,st.st_size,adapt_block_size(file, block_size));
459
460 if (verbose > 2)
461 fprintf(FERROR,"sending sums for %d\n",i);
462
463 write_int(f_out,i);
464 send_sums(s,f_out);
465 write_flush(f_out);
466
467 close(fd);
468 if (buf) unmap_file(buf);
469
470 free_sums(s);
471}
472
473
474
475static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname)
476{
477 int i,n,remainder,len,count;
478 off_t offset = 0;
479 off_t offset2;
480 char *data;
481 static char file_sum1[MD4_SUM_LENGTH];
482 static char file_sum2[MD4_SUM_LENGTH];
483 char *map=NULL;
484
485 count = read_int(f_in);
486 n = read_int(f_in);
487 remainder = read_int(f_in);
488
489 sum_init();
490
491 for (i=recv_token(f_in,&data); i != 0; i=recv_token(f_in,&data)) {
492 if (i > 0) {
493 if (verbose > 3)
494 fprintf(FERROR,"data recv %d at %d\n",i,(int)offset);
495
496 sum_update(data,i);
497
498 if (fd != -1 && write_sparse(fd,data,i) != i) {
499 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
500 exit_cleanup(1);
501 }
502 offset += i;
503 } else {
504 i = -(i+1);
505 offset2 = i*n;
506 len = n;
507 if (i == count-1 && remainder != 0)
508 len = remainder;
509
510 if (verbose > 3)
511 fprintf(FERROR,"chunk[%d] of size %d at %d offset=%d\n",
512 i,len,(int)offset2,(int)offset);
513
514 map = map_ptr(buf,offset2,len);
515
516 see_token(map, len);
517 sum_update(map,len);
518
519 if (fd != -1 && write_sparse(fd,map,len) != len) {
520 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
521 exit_cleanup(1);
522 }
523 offset += len;
524 }
525 }
526
527 if (fd != -1 && offset > 0 && sparse_end(fd) != 0) {
528 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
529 exit_cleanup(1);
530 }
531
532 sum_end(file_sum1);
533
534 if (remote_version >= 14) {
535 read_buf(f_in,file_sum2,MD4_SUM_LENGTH);
536 if (verbose > 2)
537 fprintf(FERROR,"got file_sum\n");
538 if (fd != -1 && memcmp(file_sum1,file_sum2,MD4_SUM_LENGTH) != 0)
539 return 0;
540 }
541 return 1;
542}
543
544
545static void delete_one(struct file_struct *f)
546{
547 if (!S_ISDIR(f->mode)) {
548 if (do_unlink(f_name(f)) != 0) {
549 fprintf(FERROR,"unlink %s : %s\n",f_name(f),strerror(errno));
550 } else if (verbose) {
551 fprintf(FERROR,"deleting %s\n",f_name(f));
552 }
553 } else {
554 if (do_rmdir(f_name(f)) != 0) {
555 if (errno != ENOTEMPTY)
556 fprintf(FERROR,"rmdir %s : %s\n",f_name(f),strerror(errno));
557 } else if (verbose) {
558 fprintf(FERROR,"deleting directory %s\n",f_name(f));
559 }
560 }
561}
562
563
564/* yuck! This function wouldn't have been necessary if I had the sorting
565 algorithm right. Unfortunately fixing the sorting algorithm would introduce
566 a backward incompatibility as file list indexes are sent over the link.
567
568 The aim is to see if a directory has already had the deletion algorithm applied
569 to it (due to recursion), and if so to skip it. The bisection is to
570 prevent this being an n^2 algorithm */
571static int delete_already_done(struct file_list *flist,int j)
572{
573 int low=0,high=j-1;
574 char *name;
575 char *p;
576
577 if (j == 0) return 0;
578
579 name = strdup(f_name(flist->files[j]));
580
581 if (!name) {
582 fprintf(FERROR,"out of memory in delete_already_done");
583 exit_cleanup(1);
584 }
585
586 p = strrchr(name,'/');
587 if (!p) {
588 free(name);
589 return 0;
590 }
591 *p = 0;
592
593 while (low != high) {
594 int mid = (low+high)/2;
595 int ret = strcmp(f_name(flist->files[flist_up(flist, mid)]),name);
596 if (ret == 0) {
597 free(name);
598 return 1;
599 }
600 if (ret > 0) {
601 high=mid;
602 } else {
603 low=mid+1;
604 }
605 }
606
607 low = flist_up(flist, low);
608
609 if (strcmp(f_name(flist->files[low]),name) == 0) {
610 free(name);
611 return 1;
612 }
613
614 free(name);
615 return 0;
616}
617
618
619/* this deletes any files on the receiving side that are not present
620 on the sending side. For version 1.6.4 I have changed the behaviour
621 to match more closely what most people seem to expect of this option */
622static void delete_files(struct file_list *flist)
623{
624 struct file_list *local_file_list;
625 int i, j;
626
627 if (cvs_exclude)
628 add_cvs_excludes();
629
630 for (j=0;j<flist->count;j++) {
631 char *name = f_name(flist->files[j]);
632
633 if (!S_ISDIR(flist->files[j]->mode)) continue;
634
635 if (delete_already_done(flist, j)) continue;
636
637 if (!(local_file_list = send_file_list(-1,1,&name)))
638 continue;
639
640 if (verbose > 1)
641 fprintf(FINFO,"deleting in %s\n", name);
642
643 for (i=local_file_list->count-1;i>=0;i--) {
644 if (!local_file_list->files[i]->basename) continue;
645 if (-1 == flist_find(flist,local_file_list->files[i])) {
646 delete_one(local_file_list->files[i]);
647 }
648 }
649 flist_free(local_file_list);
650 }
651}
652
653static char *cleanup_fname;
654
655void exit_cleanup(int code)
656{
657 if (cleanup_fname)
658 do_unlink(cleanup_fname);
659 signal(SIGUSR1, SIG_IGN);
660 if (code) {
661 kill_all(SIGUSR1);
662 }
663 exit(code);
664}
665
666void sig_int(void)
667{
668 exit_cleanup(1);
669}
670
671
672int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
673{
674 int fd1,fd2;
675 struct stat st;
676 char *fname;
677 char fnametmp[MAXPATHLEN];
678 struct map_struct *buf;
679 int i;
680 struct file_struct *file;
681 int phase=0;
682 int recv_ok;
683
684 if (verbose > 2) {
685 fprintf(FERROR,"recv_files(%d) starting\n",flist->count);
686 }
687
688 if (recurse && delete_mode && !local_name && flist->count>0) {
689 delete_files(flist);
690 }
691
692 while (1)
693 {
694 i = read_int(f_in);
695 if (i == -1) {
696 if (phase==0 && remote_version >= 13) {
697 phase++;
698 csum_length = SUM_LENGTH;
699 if (verbose > 2)
700 fprintf(FERROR,"recv_files phase=%d\n",phase);
701 write_int(f_gen,-1);
702 write_flush(f_gen);
703 continue;
704 }
705 break;
706 }
707
708 file = flist->files[i];
709 fname = f_name(file);
710
711 if (local_name)
712 fname = local_name;
713
714 if (dry_run) {
715 if (!am_server && verbose)
716 printf("%s\n",fname);
717 continue;
718 }
719
720 if (verbose > 2)
721 fprintf(FERROR,"recv_files(%s)\n",fname);
722
723 /* open the file */
724 fd1 = open(fname,O_RDONLY);
725
726 if (fd1 != -1 && fstat(fd1,&st) != 0) {
727 fprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
728 receive_data(f_in,NULL,-1,NULL);
729 close(fd1);
730 continue;
731 }
732
733 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
734 fprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
735 receive_data(f_in,NULL,-1,NULL);
736 close(fd1);
737 continue;
738 }
739
740 if (fd1 != -1 && st.st_size > 0) {
741 buf = map_file(fd1,st.st_size);
742 if (verbose > 2)
743 fprintf(FERROR,"recv mapped %s of size %d\n",fname,(int)st.st_size);
744 } else {
745 buf = NULL;
746 }
747
748 /* open tmp file */
749 if (strlen(fname) > (MAXPATHLEN-8)) {
750 fprintf(FERROR,"filename too long\n");
751 if (buf) unmap_file(buf);
752 close(fd1);
753 continue;
754 }
755 if (tmpdir) {
756 char *f;
757 f = strrchr(fname,'/');
758 if (f == NULL)
759 f = fname;
760 else
761 f++;
762 sprintf(fnametmp,"%s/%s.XXXXXX",tmpdir,f);
763 } else {
764 sprintf(fnametmp,"%s.XXXXXX",fname);
765 }
766 if (NULL == mktemp(fnametmp)) {
767 fprintf(FERROR,"mktemp %s failed\n",fnametmp);
768 receive_data(f_in,buf,-1,NULL);
769 if (buf) unmap_file(buf);
770 close(fd1);
771 continue;
772 }
773 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
774 if (fd2 == -1 && relative_paths && errno == ENOENT &&
775 create_directory_path(fnametmp) == 0) {
776 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
777 }
778 if (fd2 == -1) {
779 fprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
780 receive_data(f_in,buf,-1,NULL);
781 if (buf) unmap_file(buf);
782 close(fd1);
783 continue;
784 }
785
786 cleanup_fname = fnametmp;
787
788 if (!am_server && verbose)
789 printf("%s\n",fname);
790
791 /* recv file data */
792 recv_ok = receive_data(f_in,buf,fd2,fname);
793
794 if (buf) unmap_file(buf);
795 if (fd1 != -1) {
796 close(fd1);
797 }
798 close(fd2);
799
800 if (verbose > 2)
801 fprintf(FERROR,"renaming %s to %s\n",fnametmp,fname);
802
803 if (make_backups) {
804 char fnamebak[MAXPATHLEN];
805 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
806 fprintf(FERROR,"backup filename too long\n");
807 continue;
808 }
809 sprintf(fnamebak,"%s%s",fname,backup_suffix);
810 if (rename(fname,fnamebak) != 0 && errno != ENOENT) {
811 fprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
812 continue;
813 }
814 }
815
816 /* move tmp file over real file */
817 if (rename(fnametmp,fname) != 0) {
818 if (errno == EXDEV) {
819 /* rename failed on cross-filesystem link.
820 Copy the file instead. */
821 if (copy_file(fnametmp,fname, file->mode)) {
822 fprintf(FERROR,"copy %s -> %s : %s\n",
823 fnametmp,fname,strerror(errno));
824 } else {
825 set_perms(fname,file,NULL,0);
826 }
827 do_unlink(fnametmp);
828 } else {
829 fprintf(FERROR,"rename %s -> %s : %s\n",
830 fnametmp,fname,strerror(errno));
831 do_unlink(fnametmp);
832 }
833 } else {
834 set_perms(fname,file,NULL,0);
835 }
836
837 cleanup_fname = NULL;
838
839
840 if (!recv_ok) {
841 if (csum_length == SUM_LENGTH) {
842 fprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
843 fname);
844 } else {
845 if (verbose > 1)
846 fprintf(FERROR,"redoing %s(%d)\n",fname,i);
847 write_int(f_gen,i);
848 }
849 }
850 }
851
852 if (preserve_hard_links)
853 do_hard_links(flist);
854
855 /* now we need to fix any directory permissions that were
856 modified during the transfer */
857 for (i = 0; i < flist->count; i++) {
858 struct file_struct *file = flist->files[i];
859 if (!file->basename || !S_ISDIR(file->mode)) continue;
860 recv_generator(f_name(file),flist,i,-1);
861 }
862
863 if (verbose > 2)
864 fprintf(FERROR,"recv_files finished\n");
865
866 return 0;
867}
868
869
870
871off_t send_files(struct file_list *flist,int f_out,int f_in)
872{
873 int fd;
874 struct sum_struct *s;
875 struct map_struct *buf;
876 struct stat st;
877 char fname[MAXPATHLEN];
878 off_t total=0;
879 int i;
880 struct file_struct *file;
881 int phase = 0;
882 int offset=0;
883
884 if (verbose > 2)
885 fprintf(FERROR,"send_files starting\n");
886
887 setup_nonblocking(f_in,f_out);
888
889 while (1) {
890 i = read_int(f_in);
891 if (i == -1) {
892 if (phase==0 && remote_version >= 13) {
893 phase++;
894 csum_length = SUM_LENGTH;
895 write_int(f_out,-1);
896 write_flush(f_out);
897 if (verbose > 2)
898 fprintf(FERROR,"send_files phase=%d\n",phase);
899 continue;
900 }
901 break;
902 }
903
904 file = flist->files[i];
905
906 fname[0] = 0;
907 if (file->basedir) {
908 strncpy(fname,file->basedir,MAXPATHLEN-1);
909 fname[MAXPATHLEN-1] = 0;
910 if (strlen(fname) == MAXPATHLEN-1) {
911 fprintf(FERROR, "send_files failed on long-named directory %s\n",
912 fname);
913 return -1;
914 }
915 strcat(fname,"/");
916 offset = strlen(file->basedir)+1;
917 }
918 strncat(fname,f_name(file),MAXPATHLEN-strlen(fname));
919
920 if (verbose > 2)
921 fprintf(FERROR,"send_files(%d,%s)\n",i,fname);
922
923 if (dry_run) {
924 if (!am_server && verbose)
925 printf("%s\n",fname);
926 write_int(f_out,i);
927 continue;
928 }
929
930 s = receive_sums(f_in);
931 if (!s) {
932 fprintf(FERROR,"receive_sums failed\n");
933 return -1;
934 }
935
936 fd = open(fname,O_RDONLY);
937 if (fd == -1) {
938 fprintf(FERROR,"send_files failed to open %s: %s\n",
939 fname,strerror(errno));
940 free_sums(s);
941 continue;
942 }
943
944 /* map the local file */
945 if (fstat(fd,&st) != 0) {
946 fprintf(FERROR,"fstat failed : %s\n",strerror(errno));
947 free_sums(s);
948 close(fd);
949 return -1;
950 }
951
952 if (st.st_size > 0) {
953 buf = map_file(fd,st.st_size);
954 } else {
955 buf = NULL;
956 }
957
958 if (verbose > 2)
959 fprintf(FERROR,"send_files mapped %s of size %d\n",
960 fname,(int)st.st_size);
961
962 write_int(f_out,i);
963
964 write_int(f_out,s->count);
965 write_int(f_out,s->n);
966 write_int(f_out,s->remainder);
967
968 if (verbose > 2)
969 fprintf(FERROR,"calling match_sums %s\n",fname);
970
971 if (!am_server && verbose)
972 printf("%s\n",fname+offset);
973
974 match_sums(f_out,s,buf,st.st_size);
975 write_flush(f_out);
976
977 if (buf) unmap_file(buf);
978 close(fd);
979
980 free_sums(s);
981
982 if (verbose > 2)
983 fprintf(FERROR,"sender finished %s\n",fname);
984
985 total += st.st_size;
986 }
987
988 if (verbose > 2)
989 fprintf(FERROR,"send files finished\n");
990
991 match_report();
992
993 write_int(f_out,-1);
994 write_flush(f_out);
995
996 return total;
997}
998
999
1000
1001void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
1002{
1003 int i;
1004 int phase=0;
1005
1006 if (verbose > 2)
1007 fprintf(FERROR,"generator starting pid=%d count=%d\n",
1008 (int)getpid(),flist->count);
1009
1010 for (i = 0; i < flist->count; i++) {
1011 struct file_struct *file = flist->files[i];
1012 mode_t saved_mode = file->mode;
1013 if (!file->basename) continue;
1014
1015 /* we need to ensure that any directories we create have writeable
1016 permissions initially so that we can create the files within
1017 them. This is then fixed after the files are transferred */
1018 if (!am_root && S_ISDIR(file->mode)) {
1019 file->mode |= S_IWUSR; /* user write */
1020 }
1021
1022 recv_generator(local_name?local_name:f_name(file),
1023 flist,i,f);
1024
1025 file->mode = saved_mode;
1026 }
1027
1028 phase++;
1029 csum_length = SUM_LENGTH;
1030 ignore_times=1;
1031
1032 if (verbose > 2)
1033 fprintf(FERROR,"generate_files phase=%d\n",phase);
1034
1035 write_int(f,-1);
1036 write_flush(f);
1037
1038 if (remote_version >= 13) {
1039 /* in newer versions of the protocol the files can cycle through
1040 the system more than once to catch initial checksum errors */
1041 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
1042 struct file_struct *file = flist->files[i];
1043 recv_generator(local_name?local_name:f_name(file),
1044 flist,i,f);
1045 }
1046
1047 phase++;
1048 if (verbose > 2)
1049 fprintf(FERROR,"generate_files phase=%d\n",phase);
1050
1051 write_int(f,-1);
1052 write_flush(f);
1053 }
1054
1055
1056 if (verbose > 2)
1057 fprintf(FERROR,"generator wrote %ld\n",(long)write_total());
1058}
1059
1060