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