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