for systems with a broken select use u_sleep() to ensure the write
[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",f_name(file));
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(f)) != 0) {
540 fprintf(FERROR,"unlink %s : %s\n",f_name(f),strerror(errno));
541 } else if (verbose) {
542 fprintf(FERROR,"deleting %s\n",f_name(f));
543 }
544 } else {
545 if (!dry_run && rmdir(f_name(f)) != 0) {
546 if (errno != ENOTEMPTY)
547 fprintf(FERROR,"rmdir %s : %s\n",f_name(f),strerror(errno));
548 } else if (verbose) {
549 fprintf(FERROR,"deleting directory %s\n",f_name(f));
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(f_name(flist->files[j]));
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(f_name(flist->files[flist_up(flist, mid)]),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(f_name(flist->files[low]),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 = f_name(flist->files[j]);
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]->basename) continue;
636 if (-1 == flist_find(flist,local_file_list->files[i])) {
637 delete_one(local_file_list->files[i]);
638 }
639 }
640 flist_free(local_file_list);
641 }
642}
643
644static char *cleanup_fname = NULL;
645
646void exit_cleanup(int code)
647{
648 if (cleanup_fname)
649 unlink(cleanup_fname);
650 signal(SIGUSR1, SIG_IGN);
651 if (code) {
652#ifdef GETPGRP_VOID
653 kill(-getpgrp(), SIGUSR1);
654#else
655 kill(-getpgrp(getpid()), SIGUSR1);
656#endif
657 }
658 exit(code);
659}
660
661void sig_int(void)
662{
663 exit_cleanup(1);
664}
665
666
667int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
668{
669 int fd1,fd2;
670 struct stat st;
671 char *fname;
672 char fnametmp[MAXPATHLEN];
673 struct map_struct *buf;
674 int i;
675 struct file_struct *file;
676 int phase=0;
677 int recv_ok;
678
679 if (verbose > 2) {
680 fprintf(FERROR,"recv_files(%d) starting\n",flist->count);
681 }
682
683 if (recurse && delete_mode && !local_name && flist->count>0) {
684 delete_files(flist);
685 }
686
687 while (1)
688 {
689 i = read_int(f_in);
690 if (i == -1) {
691 if (phase==0 && remote_version >= 13) {
692 phase++;
693 csum_length = SUM_LENGTH;
694 if (verbose > 2)
695 fprintf(FERROR,"recv_files phase=%d\n",phase);
696 write_int(f_gen,-1);
697 write_flush(f_gen);
698 continue;
699 }
700 break;
701 }
702
703 file = flist->files[i];
704 fname = f_name(file);
705
706 if (local_name)
707 fname = local_name;
708
709 if (dry_run) {
710 if (!am_server && verbose)
711 printf("%s\n",fname);
712 continue;
713 }
714
715 if (verbose > 2)
716 fprintf(FERROR,"recv_files(%s)\n",fname);
717
718 /* open the file */
719 fd1 = open(fname,O_RDONLY);
720
721 if (fd1 != -1 && fstat(fd1,&st) != 0) {
722 fprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
723 receive_data(f_in,NULL,-1,NULL);
724 close(fd1);
725 continue;
726 }
727
728 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
729 fprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
730 receive_data(f_in,NULL,-1,NULL);
731 close(fd1);
732 continue;
733 }
734
735 if (fd1 != -1 && st.st_size > 0) {
736 buf = map_file(fd1,st.st_size);
737 if (verbose > 2)
738 fprintf(FERROR,"recv mapped %s of size %d\n",fname,(int)st.st_size);
739 } else {
740 buf = NULL;
741 }
742
743 /* open tmp file */
744 if (strlen(fname) > (MAXPATHLEN-8)) {
745 fprintf(FERROR,"filename too long\n");
746 if (buf) unmap_file(buf);
747 close(fd1);
748 continue;
749 }
750 if (tmpdir) {
751 char *f;
752 f = strrchr(fname,'/');
753 if (f == NULL)
754 f = fname;
755 else
756 f++;
757 sprintf(fnametmp,"%s/%s.XXXXXX",tmpdir,f);
758 } else {
759 sprintf(fnametmp,"%s.XXXXXX",fname);
760 }
761 if (NULL == mktemp(fnametmp)) {
762 fprintf(FERROR,"mktemp %s failed\n",fnametmp);
763 receive_data(f_in,buf,-1,NULL);
764 if (buf) unmap_file(buf);
765 close(fd1);
766 continue;
767 }
768 fd2 = open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
769 if (fd2 == -1 && relative_paths && errno == ENOENT &&
770 create_directory_path(fnametmp) == 0) {
771 fd2 = open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
772 }
773 if (fd2 == -1) {
774 fprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
775 receive_data(f_in,buf,-1,NULL);
776 if (buf) unmap_file(buf);
777 close(fd1);
778 continue;
779 }
780
781 cleanup_fname = fnametmp;
782
783 if (!am_server && verbose)
784 printf("%s\n",fname);
785
786 /* recv file data */
787 recv_ok = receive_data(f_in,buf,fd2,fname);
788
789 if (buf) unmap_file(buf);
790 if (fd1 != -1) {
791 close(fd1);
792 }
793 close(fd2);
794
795 if (verbose > 2)
796 fprintf(FERROR,"renaming %s to %s\n",fnametmp,fname);
797
798 if (make_backups) {
799 char fnamebak[MAXPATHLEN];
800 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
801 fprintf(FERROR,"backup filename too long\n");
802 continue;
803 }
804 sprintf(fnamebak,"%s%s",fname,backup_suffix);
805 if (rename(fname,fnamebak) != 0 && errno != ENOENT) {
806 fprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
807 continue;
808 }
809 }
810
811 /* move tmp file over real file */
812 if (rename(fnametmp,fname) != 0) {
813 if (errno == EXDEV) {
814 /* rename failed on cross-filesystem link.
815 Copy the file instead. */
816 if (copy_file(fnametmp,fname, file->mode)) {
817 fprintf(FERROR,"copy %s -> %s : %s\n",
818 fnametmp,fname,strerror(errno));
819 } else {
820 set_perms(fname,file,NULL,0);
821 }
822 unlink(fnametmp);
823 } else {
824 fprintf(FERROR,"rename %s -> %s : %s\n",
825 fnametmp,fname,strerror(errno));
826 unlink(fnametmp);
827 }
828 } else {
829 set_perms(fname,file,NULL,0);
830 }
831
832 cleanup_fname = NULL;
833
834
835 if (!recv_ok) {
836 if (verbose > 1)
837 fprintf(FERROR,"redoing %s(%d)\n",fname,i);
838 if (csum_length == SUM_LENGTH)
839 fprintf(FERROR,"ERROR: file corruption in %s\n",fname);
840 write_int(f_gen,i);
841 }
842 }
843
844 if (preserve_hard_links)
845 do_hard_links(flist);
846
847 /* now we need to fix any directory permissions that were
848 modified during the transfer */
849 for (i = 0; i < flist->count; i++) {
850 struct file_struct *file = flist->files[i];
851 if (!file->basename || !S_ISDIR(file->mode)) continue;
852 recv_generator(f_name(file),flist,i,-1);
853 }
854
855 if (verbose > 2)
856 fprintf(FERROR,"recv_files finished\n");
857
858 return 0;
859}
860
861
862
863off_t send_files(struct file_list *flist,int f_out,int f_in)
864{
865 int fd;
866 struct sum_struct *s;
867 struct map_struct *buf;
868 struct stat st;
869 char fname[MAXPATHLEN];
870 off_t total=0;
871 int i;
872 struct file_struct *file;
873 int phase = 0;
874
875 if (verbose > 2)
876 fprintf(FERROR,"send_files starting\n");
877
878 setup_nonblocking(f_in,f_out);
879
880 while (1)
881 {
882 i = read_int(f_in);
883 if (i == -1) {
884 if (phase==0 && remote_version >= 13) {
885 phase++;
886 csum_length = SUM_LENGTH;
887 write_int(f_out,-1);
888 write_flush(f_out);
889 if (verbose > 2)
890 fprintf(FERROR,"send_files phase=%d\n",phase);
891 continue;
892 }
893 break;
894 }
895
896 file = flist->files[i];
897
898 fname[0] = 0;
899 if (file->basedir) {
900 strncpy(fname,file->basedir,MAXPATHLEN-1);
901 fname[MAXPATHLEN-1] = 0;
902 if (strlen(fname) == MAXPATHLEN-1) {
903 fprintf(FERROR, "send_files failed on long-named directory %s\n",
904 fname);
905 return -1;
906 }
907 strcat(fname,"/");
908 }
909 strncat(fname,f_name(file),MAXPATHLEN-strlen(fname));
910
911 if (verbose > 2)
912 fprintf(FERROR,"send_files(%d,%s)\n",i,fname);
913
914 if (dry_run) {
915 if (!am_server && verbose)
916 printf("%s\n",fname);
917 write_int(f_out,i);
918 continue;
919 }
920
921 s = receive_sums(f_in);
922 if (!s) {
923 fprintf(FERROR,"receive_sums failed\n");
924 return -1;
925 }
926
927 fd = open(fname,O_RDONLY);
928 if (fd == -1) {
929 fprintf(FERROR,"send_files failed to open %s: %s\n",
930 fname,strerror(errno));
931 continue;
932 }
933
934 /* map the local file */
935 if (fstat(fd,&st) != 0) {
936 fprintf(FERROR,"fstat failed : %s\n",strerror(errno));
937 close(fd);
938 return -1;
939 }
940
941 if (st.st_size > 0) {
942 buf = map_file(fd,st.st_size);
943 } else {
944 buf = NULL;
945 }
946
947 if (verbose > 2)
948 fprintf(FERROR,"send_files mapped %s of size %d\n",
949 fname,(int)st.st_size);
950
951 write_int(f_out,i);
952
953 write_int(f_out,s->count);
954 write_int(f_out,s->n);
955 write_int(f_out,s->remainder);
956
957 if (verbose > 2)
958 fprintf(FERROR,"calling match_sums %s\n",fname);
959
960 if (!am_server && verbose)
961 printf("%s\n",fname);
962
963 match_sums(f_out,s,buf,st.st_size);
964 write_flush(f_out);
965
966 if (buf) unmap_file(buf);
967 close(fd);
968
969 free_sums(s);
970
971 if (verbose > 2)
972 fprintf(FERROR,"sender finished %s\n",fname);
973
974 total += st.st_size;
975 }
976
977 if (verbose > 2)
978 fprintf(FERROR,"send files finished\n");
979
980 match_report();
981
982 write_int(f_out,-1);
983 write_flush(f_out);
984
985 return total;
986}
987
988
989
990void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
991{
992 int i;
993 int phase=0;
994
995 if (verbose > 2)
996 fprintf(FERROR,"generator starting pid=%d count=%d\n",
997 (int)getpid(),flist->count);
998
999 for (i = 0; i < flist->count; i++) {
1000 struct file_struct *file = flist->files[i];
1001 mode_t saved_mode = file->mode;
1002 if (!file->basename) continue;
1003
1004 /* we need to ensure that any directories we create have writeable
1005 permissions initially so that we can create the files within
1006 them. This is then fixed after the files are transferred */
1007 if (!am_root && S_ISDIR(file->mode)) {
1008 file->mode |= S_IWUSR; /* user write */
1009 }
1010
1011 recv_generator(local_name?local_name:f_name(file),
1012 flist,i,f);
1013
1014 file->mode = saved_mode;
1015 }
1016
1017 phase++;
1018 csum_length = SUM_LENGTH;
1019 ignore_times=1;
1020
1021 if (verbose > 2)
1022 fprintf(FERROR,"generate_files phase=%d\n",phase);
1023
1024 write_int(f,-1);
1025 write_flush(f);
1026
1027 if (remote_version >= 13) {
1028 /* in newer versions of the protocol the files can cycle through
1029 the system more than once to catch initial checksum errors */
1030 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
1031 struct file_struct *file = flist->files[i];
1032 recv_generator(local_name?local_name:f_name(file),
1033 flist,i,f);
1034 }
1035
1036 phase++;
1037 if (verbose > 2)
1038 fprintf(FERROR,"generate_files phase=%d\n",phase);
1039
1040 write_int(f,-1);
1041 write_flush(f);
1042 }
1043
1044
1045 if (verbose > 2)
1046 fprintf(FERROR,"generator wrote %d\n",write_total());
1047}
1048
1049