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