preparing for release of 2.0.18
[rsync.git] / rsync.c
blob8e7b74c92082736f223f08166bc09d8c58737be5
1 /*
2 Copyright (C) Andrew Tridgell 1996
3 Copyright (C) Paul Mackerras 1996
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.
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.
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.
20 #include "rsync.h"
22 extern int csum_length;
24 extern int verbose;
25 extern int am_server;
26 extern int always_checksum;
27 extern time_t starttime;
29 extern int remote_version;
31 extern char *backup_suffix;
32 extern char *tmpdir;
34 extern int whole_file;
35 extern int block_size;
36 extern int update_only;
37 extern int make_backups;
38 extern int preserve_links;
39 extern int preserve_hard_links;
40 extern int preserve_perms;
41 extern int preserve_devices;
42 extern int preserve_uid;
43 extern int preserve_gid;
44 extern int preserve_times;
45 extern int dry_run;
46 extern int ignore_times;
47 extern int recurse;
48 extern int delete_mode;
49 extern int cvs_exclude;
50 extern int am_root;
51 extern int relative_paths;
52 extern int io_timeout;
53 extern int io_error;
54 extern struct stats stats;
57 free a sums struct
59 static void free_sums(struct sum_struct *s)
61 if (s->sums) free(s->sums);
62 free(s);
67 * delete a file or directory. If force_delet is set then delete
68 * recursively
70 static int delete_file(char *fname)
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;
80 if (do_unlink(fname) == 0 || errno == ENOENT) return 0;
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;
92 if (!S_ISDIR(st.st_mode)) {
93 rprintf(FERROR,"unlink(%s) : %s\n", fname, strerror(errno));
94 return -1;
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;
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;
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;
126 closedir(d);
128 if (do_rmdir(fname) != 0) {
129 rprintf(FERROR,"rmdir(%s) : %s\n", fname, strerror(errno));
130 return -1;
133 return 0;
137 send a sums struct down a fd
139 static void send_sums(struct sum_struct *s,int f_out)
141 int i;
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);
157 generate a stream of signatures/checksums that describe a buffer
159 generate approximately one checksum every n bytes
161 static struct sum_struct *generate_sums(struct map_struct *buf,OFF_T len,int n)
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;
170 count = (len+(block_len-1))/block_len;
172 s = (struct sum_struct *)malloc(sizeof(*s));
173 if (!s) out_of_memory("generate_sums");
175 s->count = count;
176 s->remainder = remainder;
177 s->n = n;
178 s->flength = len;
180 if (count==0) {
181 s->sums = NULL;
182 return s;
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);
189 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
190 if (!s->sums) out_of_memory("generate_sums");
192 for (i=0;i<count;i++) {
193 int n1 = MIN(len,n);
194 char *map = map_ptr(buf,offset,n1);
196 s->sums[i].sum1 = get_checksum1(map,n1);
197 get_checksum2(map,n1,s->sums[i].sum2);
199 s->sums[i].offset = offset;
200 s->sums[i].len = n1;
201 s->sums[i].i = i;
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);
207 len -= n1;
208 offset += n1;
211 return s;
216 receive the checksums for a buffer
218 static struct sum_struct *receive_sums(int f)
220 struct sum_struct *s;
221 int i;
222 OFF_T offset = 0;
224 s = (struct sum_struct *)malloc(sizeof(*s));
225 if (!s) out_of_memory("receive_sums");
227 s->count = read_int(f);
228 s->n = read_int(f);
229 s->remainder = read_int(f);
230 s->sums = NULL;
232 if (verbose > 3)
233 rprintf(FINFO,"count=%d n=%d rem=%d\n",
234 s->count,s->n,s->remainder);
236 if (s->count == 0)
237 return(s);
239 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
240 if (!s->sums) out_of_memory("receive_sums");
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);
246 s->sums[i].offset = offset;
247 s->sums[i].i = i;
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;
254 offset += s->sums[i].len;
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);
261 s->flength = offset;
263 return s;
267 static int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st,
268 int report)
270 int updated = 0;
271 STRUCT_STAT st2;
272 extern int am_daemon;
274 if (dry_run) return 0;
276 if (!st) {
277 if (link_stat(fname,&st2) != 0) {
278 rprintf(FERROR,"stat %s : %s\n",fname,strerror(errno));
279 return 0;
281 st = &st2;
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;
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;
307 } else {
308 updated = 1;
312 #ifdef HAVE_CHMOD
313 if (preserve_perms && !S_ISLNK(st->st_mode) &&
314 st->st_mode != file->mode) {
315 updated = 1;
316 if (do_chmod(fname,file->mode) != 0) {
317 rprintf(FERROR,"failed to set permissions on %s : %s\n",
318 fname,strerror(errno));
319 return 0;
322 #endif
324 if (verbose > 1 && report) {
325 if (updated)
326 rprintf(FINFO,"%s\n",fname);
327 else
328 rprintf(FINFO,"%s is uptodate\n",fname);
330 return updated;
334 /* choose whether to skip a particular file */
335 static int skip_file(char *fname,
336 struct file_struct *file, STRUCT_STAT *st)
338 if (st->st_size != file->length) {
339 return 0;
342 /* if always checksum is set then we use the checksum instead
343 of the file time to determine whether to sync */
344 if (always_checksum && S_ISREG(st->st_mode)) {
345 char sum[MD4_SUM_LENGTH];
346 file_checksum(fname,sum,st->st_size);
347 return (memcmp(sum,file->sum,csum_length) == 0);
350 if (ignore_times) {
351 return 0;
354 return (st->st_mtime == file->modtime);
358 /* use a larger block size for really big files */
359 int adapt_block_size(struct file_struct *file, int bsize)
361 int ret;
363 if (bsize != BLOCK_SIZE) return bsize;
365 ret = file->length / (10000); /* rough heuristic */
366 ret = ret & ~15; /* multiple of 16 */
367 if (ret < bsize) ret = bsize;
368 if (ret > CHUNK_SIZE/2) ret = CHUNK_SIZE/2;
369 return ret;
372 void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
374 int fd;
375 STRUCT_STAT st;
376 struct map_struct *buf;
377 struct sum_struct *s;
378 int statret;
379 struct file_struct *file = flist->files[i];
381 if (verbose > 2)
382 rprintf(FINFO,"recv_generator(%s,%d)\n",fname,i);
384 statret = link_stat(fname,&st);
386 if (S_ISDIR(file->mode)) {
387 if (dry_run) return;
388 if (statret == 0 && !S_ISDIR(st.st_mode)) {
389 if (do_unlink(fname) != 0) {
390 rprintf(FERROR,"unlink %s : %s\n",fname,strerror(errno));
391 return;
393 statret = -1;
395 if (statret != 0 && do_mkdir(fname,file->mode) != 0 && errno != EEXIST) {
396 if (!(relative_paths && errno==ENOENT &&
397 create_directory_path(fname)==0 &&
398 do_mkdir(fname,file->mode)==0)) {
399 rprintf(FERROR,"mkdir %s : %s (2)\n",
400 fname,strerror(errno));
403 if (set_perms(fname,file,NULL,0) && verbose)
404 rprintf(FINFO,"%s/\n",fname);
405 return;
408 if (preserve_links && S_ISLNK(file->mode)) {
409 #if SUPPORT_LINKS
410 char lnk[MAXPATHLEN];
411 int l;
412 if (statret == 0) {
413 l = readlink(fname,lnk,MAXPATHLEN-1);
414 if (l > 0) {
415 lnk[l] = 0;
416 if (strcmp(lnk,file->link) == 0) {
417 set_perms(fname,file,&st,1);
418 return;
422 delete_file(fname);
423 if (do_symlink(file->link,fname) != 0) {
424 rprintf(FERROR,"link %s -> %s : %s\n",
425 fname,file->link,strerror(errno));
426 } else {
427 set_perms(fname,file,NULL,0);
428 if (verbose)
429 rprintf(FINFO,"%s -> %s\n",
430 fname,file->link);
432 #endif
433 return;
436 #ifdef HAVE_MKNOD
437 if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
438 if (statret != 0 ||
439 st.st_mode != file->mode ||
440 st.st_rdev != file->rdev) {
441 delete_file(fname);
442 if (verbose > 2)
443 rprintf(FINFO,"mknod(%s,0%o,0x%x)\n",
444 fname,(int)file->mode,(int)file->rdev);
445 if (do_mknod(fname,file->mode,file->rdev) != 0) {
446 rprintf(FERROR,"mknod %s : %s\n",fname,strerror(errno));
447 } else {
448 set_perms(fname,file,NULL,0);
449 if (verbose)
450 rprintf(FINFO,"%s\n",fname);
452 } else {
453 set_perms(fname,file,&st,1);
455 return;
457 #endif
459 if (preserve_hard_links && check_hard_link(file)) {
460 if (verbose > 1)
461 rprintf(FINFO,"%s is a hard link\n",f_name(file));
462 return;
465 if (!S_ISREG(file->mode)) {
466 rprintf(FINFO,"skipping non-regular file %s\n",fname);
467 return;
470 if (statret == -1) {
471 if (errno == ENOENT) {
472 write_int(f_out,i);
473 if (!dry_run) send_sums(NULL,f_out);
474 } else {
475 if (verbose > 1)
476 rprintf(FERROR,"recv_generator failed to open %s\n",fname);
478 return;
481 if (!S_ISREG(st.st_mode)) {
482 if (delete_file(fname) != 0) {
483 return;
486 /* now pretend the file didn't exist */
487 write_int(f_out,i);
488 if (!dry_run) send_sums(NULL,f_out);
489 return;
492 if (update_only && st.st_mtime > file->modtime) {
493 if (verbose > 1)
494 rprintf(FINFO,"%s is newer\n",fname);
495 return;
498 if (skip_file(fname, file, &st)) {
499 set_perms(fname,file,&st,1);
500 return;
503 if (dry_run) {
504 write_int(f_out,i);
505 return;
508 if (whole_file) {
509 write_int(f_out,i);
510 send_sums(NULL,f_out);
511 return;
514 /* open the file */
515 fd = open(fname,O_RDONLY);
517 if (fd == -1) {
518 rprintf(FERROR,"failed to open %s : %s\n",fname,strerror(errno));
519 rprintf(FERROR,"skipping %s\n",fname);
520 return;
523 if (st.st_size > 0) {
524 buf = map_file(fd,st.st_size);
525 } else {
526 buf = NULL;
529 if (verbose > 3)
530 rprintf(FINFO,"gen mapped %s of size %d\n",fname,(int)st.st_size);
532 s = generate_sums(buf,st.st_size,adapt_block_size(file, block_size));
534 if (verbose > 2)
535 rprintf(FINFO,"sending sums for %d\n",i);
537 write_int(f_out,i);
538 send_sums(s,f_out);
540 close(fd);
541 if (buf) unmap_file(buf);
543 free_sums(s);
548 static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname)
550 int i,n,remainder,len,count;
551 OFF_T offset = 0;
552 OFF_T offset2;
553 char *data;
554 static char file_sum1[MD4_SUM_LENGTH];
555 static char file_sum2[MD4_SUM_LENGTH];
556 char *map=NULL;
558 count = read_int(f_in);
559 n = read_int(f_in);
560 remainder = read_int(f_in);
562 sum_init();
564 for (i=recv_token(f_in,&data); i != 0; i=recv_token(f_in,&data)) {
565 if (i > 0) {
566 if (verbose > 3)
567 rprintf(FINFO,"data recv %d at %d\n",i,(int)offset);
569 stats.literal_data += i;
570 sum_update(data,i);
572 if (fd != -1 && write_file(fd,data,i) != i) {
573 rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
574 exit_cleanup(1);
576 offset += i;
577 } else {
578 i = -(i+1);
579 offset2 = i*n;
580 len = n;
581 if (i == count-1 && remainder != 0)
582 len = remainder;
584 stats.matched_data += len;
586 if (verbose > 3)
587 rprintf(FINFO,"chunk[%d] of size %d at %d offset=%d\n",
588 i,len,(int)offset2,(int)offset);
590 map = map_ptr(buf,offset2,len);
592 see_token(map, len);
593 sum_update(map,len);
595 if (fd != -1 && write_file(fd,map,len) != len) {
596 rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
597 exit_cleanup(1);
599 offset += len;
603 if (fd != -1 && offset > 0 && sparse_end(fd) != 0) {
604 rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
605 exit_cleanup(1);
608 sum_end(file_sum1);
610 if (remote_version >= 14) {
611 read_buf(f_in,file_sum2,MD4_SUM_LENGTH);
612 if (verbose > 2)
613 rprintf(FINFO,"got file_sum\n");
614 if (fd != -1 && memcmp(file_sum1,file_sum2,MD4_SUM_LENGTH) != 0)
615 return 0;
617 return 1;
621 static void delete_one(struct file_struct *f)
623 if (!S_ISDIR(f->mode)) {
624 if (do_unlink(f_name(f)) != 0) {
625 rprintf(FERROR,"unlink %s : %s\n",f_name(f),strerror(errno));
626 } else if (verbose) {
627 rprintf(FINFO,"deleting %s\n",f_name(f));
629 } else {
630 if (do_rmdir(f_name(f)) != 0) {
631 if (errno != ENOTEMPTY && errno != EEXIST)
632 rprintf(FERROR,"rmdir %s : %s\n",f_name(f),strerror(errno));
633 } else if (verbose) {
634 rprintf(FINFO,"deleting directory %s\n",f_name(f));
641 static struct delete_list {
642 dev_t dev;
643 ino_t inode;
644 } *delete_list;
645 static int dlist_len, dlist_alloc_len;
647 static void add_delete_entry(struct file_struct *file)
649 if (dlist_len == dlist_alloc_len) {
650 dlist_alloc_len += 1024;
651 delete_list = (struct delete_list *)Realloc(delete_list, sizeof(delete_list[0])*dlist_alloc_len);
652 if (!delete_list) out_of_memory("add_delete_entry");
655 delete_list[dlist_len].dev = file->dev;
656 delete_list[dlist_len].inode = file->inode;
657 dlist_len++;
659 if (verbose > 3)
660 rprintf(FINFO,"added %s to delete list\n", f_name(file));
663 /* yuck! This function wouldn't have been necessary if I had the sorting
664 algorithm right. Unfortunately fixing the sorting algorithm would introduce
665 a backward incompatibility as file list indexes are sent over the link.
667 static int delete_already_done(struct file_list *flist,int j)
669 int i;
670 STRUCT_STAT st;
672 if (link_stat(f_name(flist->files[j]), &st)) return 1;
674 for (i=0;i<dlist_len;i++) {
675 if (st.st_ino == delete_list[i].inode &&
676 st.st_dev == delete_list[i].dev)
677 return 1;
680 return 0;
684 /* this deletes any files on the receiving side that are not present
685 on the sending side. For version 1.6.4 I have changed the behaviour
686 to match more closely what most people seem to expect of this option */
687 static void delete_files(struct file_list *flist)
689 struct file_list *local_file_list;
690 int i, j;
691 char *name;
693 if (cvs_exclude)
694 add_cvs_excludes();
696 if (io_error) {
697 rprintf(FINFO,"IO error encountered - skipping file deletion\n");
698 return;
701 for (j=0;j<flist->count;j++) {
702 if (!S_ISDIR(flist->files[j]->mode) ||
703 !(flist->files[j]->flags & FLAG_DELETE)) continue;
705 if (remote_version < 19 &&
706 delete_already_done(flist, j)) continue;
708 name = strdup(f_name(flist->files[j]));
710 if (!(local_file_list = send_file_list(-1,1,&name))) {
711 free(name);
712 continue;
715 if (verbose > 1)
716 rprintf(FINFO,"deleting in %s\n", name);
718 for (i=local_file_list->count-1;i>=0;i--) {
719 if (!local_file_list->files[i]->basename) continue;
720 if (remote_version < 19 &&
721 S_ISDIR(local_file_list->files[i]->mode))
722 add_delete_entry(local_file_list->files[i]);
723 if (-1 == flist_find(flist,local_file_list->files[i])) {
724 delete_one(local_file_list->files[i]);
727 flist_free(local_file_list);
728 free(name);
732 static char *cleanup_fname;
734 void exit_cleanup(int code)
736 io_flush();
737 if (cleanup_fname)
738 do_unlink(cleanup_fname);
739 signal(SIGUSR1, SIG_IGN);
740 if (code) {
741 kill_all(SIGUSR1);
743 exit(code);
746 void sig_int(void)
748 exit_cleanup(1);
754 static int get_tmpname(char *fnametmp, char *fname)
756 char *f;
758 /* open tmp file */
759 if (tmpdir) {
760 f = strrchr(fname,'/');
761 if (f == NULL)
762 f = fname;
763 else
764 f++;
765 if (strlen(tmpdir)+strlen(f)+10 > MAXPATHLEN) {
766 rprintf(FERROR,"filename too long\n");
767 return 0;
769 slprintf(fnametmp,MAXPATHLEN-1, "%s/.%s.XXXXXX",tmpdir,f);
770 return 1;
773 f = strrchr(fname,'/');
775 if (strlen(fname)+9 > MAXPATHLEN) {
776 rprintf(FERROR,"filename too long\n");
777 return 0;
780 if (f) {
781 *f = 0;
782 slprintf(fnametmp,MAXPATHLEN-1,"%s/.%s.XXXXXX",
783 fname,f+1);
784 *f = '/';
785 } else {
786 slprintf(fnametmp,MAXPATHLEN-1,".%s.XXXXXX",fname);
789 return 1;
792 int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
794 int fd1,fd2;
795 STRUCT_STAT st;
796 char *fname;
797 char fnametmp[MAXPATHLEN];
798 struct map_struct *buf;
799 int i;
800 struct file_struct *file;
801 int phase=0;
802 int recv_ok;
804 if (verbose > 2) {
805 rprintf(FINFO,"recv_files(%d) starting\n",flist->count);
808 if (recurse && delete_mode && !local_name && flist->count>0) {
809 delete_files(flist);
812 while (1) {
813 i = read_int(f_in);
814 if (i == -1) {
815 if (phase==0 && remote_version >= 13) {
816 phase++;
817 csum_length = SUM_LENGTH;
818 if (verbose > 2)
819 rprintf(FINFO,"recv_files phase=%d\n",phase);
820 write_int(f_gen,-1);
821 continue;
823 break;
826 if (i < 0 || i >= flist->count) {
827 rprintf(FERROR,"Invalid file index %d in recv_files (count=%d)\n",
828 i, flist->count);
829 exit_cleanup(1);
832 file = flist->files[i];
833 fname = f_name(file);
835 stats.num_transferred_files++;
836 stats.total_transferred_size += file->length;
838 if (local_name)
839 fname = local_name;
841 if (dry_run) {
842 if (!am_server && verbose)
843 printf("%s\n",fname);
844 continue;
847 if (verbose > 2)
848 rprintf(FINFO,"recv_files(%s)\n",fname);
850 /* open the file */
851 fd1 = open(fname,O_RDONLY);
853 if (fd1 != -1 && do_fstat(fd1,&st) != 0) {
854 rprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
855 receive_data(f_in,NULL,-1,NULL);
856 close(fd1);
857 continue;
860 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
861 rprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
862 receive_data(f_in,NULL,-1,NULL);
863 close(fd1);
864 continue;
867 if (fd1 != -1 && st.st_size > 0) {
868 buf = map_file(fd1,st.st_size);
869 if (verbose > 2)
870 rprintf(FINFO,"recv mapped %s of size %d\n",fname,(int)st.st_size);
871 } else {
872 buf = NULL;
875 if (!get_tmpname(fnametmp,fname)) {
876 if (buf) unmap_file(buf);
877 close(fd1);
878 continue;
881 if (NULL == do_mktemp(fnametmp)) {
882 rprintf(FERROR,"mktemp %s failed\n",fnametmp);
883 receive_data(f_in,buf,-1,NULL);
884 if (buf) unmap_file(buf);
885 close(fd1);
886 continue;
889 /* we initially set the perms without the
890 setuid/setgid bits to ensure that there is no race
891 condition. They are then correctly updated after
892 the lchown. Thanks to snabb@epipe.fi for pointing
893 this out */
894 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,
895 file->mode & ACCESSPERMS);
897 if (fd2 == -1 && relative_paths && errno == ENOENT &&
898 create_directory_path(fnametmp) == 0) {
899 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,
900 file->mode & ACCESSPERMS);
902 if (fd2 == -1) {
903 rprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
904 receive_data(f_in,buf,-1,NULL);
905 if (buf) unmap_file(buf);
906 close(fd1);
907 continue;
910 cleanup_fname = fnametmp;
912 if (!am_server && verbose)
913 printf("%s\n",fname);
915 /* recv file data */
916 recv_ok = receive_data(f_in,buf,fd2,fname);
918 if (buf) unmap_file(buf);
919 if (fd1 != -1) {
920 close(fd1);
922 close(fd2);
924 if (verbose > 2)
925 rprintf(FINFO,"renaming %s to %s\n",fnametmp,fname);
927 if (make_backups) {
928 char fnamebak[MAXPATHLEN];
929 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
930 rprintf(FERROR,"backup filename too long\n");
931 continue;
933 slprintf(fnamebak,sizeof(fnamebak)-1,"%s%s",fname,backup_suffix);
934 if (do_rename(fname,fnamebak) != 0 && errno != ENOENT) {
935 rprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
936 continue;
940 /* move tmp file over real file */
941 if (do_rename(fnametmp,fname) != 0) {
942 if (errno == EXDEV) {
943 /* rename failed on cross-filesystem link.
944 Copy the file instead. */
945 if (copy_file(fnametmp,fname, file->mode)) {
946 rprintf(FERROR,"copy %s -> %s : %s\n",
947 fnametmp,fname,strerror(errno));
948 } else {
949 set_perms(fname,file,NULL,0);
951 do_unlink(fnametmp);
952 } else {
953 rprintf(FERROR,"rename %s -> %s : %s\n",
954 fnametmp,fname,strerror(errno));
955 do_unlink(fnametmp);
957 } else {
958 set_perms(fname,file,NULL,0);
961 cleanup_fname = NULL;
964 if (!recv_ok) {
965 if (csum_length == SUM_LENGTH) {
966 rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
967 fname);
968 } else {
969 if (verbose > 1)
970 rprintf(FINFO,"redoing %s(%d)\n",fname,i);
971 write_int(f_gen,i);
976 if (preserve_hard_links)
977 do_hard_links(flist);
979 /* now we need to fix any directory permissions that were
980 modified during the transfer */
981 for (i = 0; i < flist->count; i++) {
982 file = flist->files[i];
983 if (!file->basename || !S_ISDIR(file->mode)) continue;
984 recv_generator(f_name(file),flist,i,-1);
987 if (verbose > 2)
988 rprintf(FINFO,"recv_files finished\n");
990 return 0;
995 void send_files(struct file_list *flist,int f_out,int f_in)
997 int fd;
998 struct sum_struct *s;
999 struct map_struct *buf;
1000 STRUCT_STAT st;
1001 char fname[MAXPATHLEN];
1002 int i;
1003 struct file_struct *file;
1004 int phase = 0;
1006 if (verbose > 2)
1007 rprintf(FINFO,"send_files starting\n");
1009 setup_readbuffer(f_in);
1011 while (1) {
1012 int offset=0;
1014 i = read_int(f_in);
1015 if (i == -1) {
1016 if (phase==0 && remote_version >= 13) {
1017 phase++;
1018 csum_length = SUM_LENGTH;
1019 write_int(f_out,-1);
1020 if (verbose > 2)
1021 rprintf(FINFO,"send_files phase=%d\n",phase);
1022 continue;
1024 break;
1027 if (i < 0 || i >= flist->count) {
1028 rprintf(FERROR,"Invalid file index %d (count=%d)\n",
1029 i, flist->count);
1030 exit_cleanup(1);
1033 file = flist->files[i];
1035 stats.num_transferred_files++;
1036 stats.total_transferred_size += file->length;
1038 fname[0] = 0;
1039 if (file->basedir) {
1040 strlcpy(fname,file->basedir,MAXPATHLEN-1);
1041 if (strlen(fname) == MAXPATHLEN-1) {
1042 io_error = 1;
1043 rprintf(FERROR, "send_files failed on long-named directory %s\n",
1044 fname);
1045 return;
1047 strlcat(fname,"/",MAXPATHLEN-1);
1048 offset = strlen(file->basedir)+1;
1050 strlcat(fname,f_name(file),MAXPATHLEN-strlen(fname));
1052 if (verbose > 2)
1053 rprintf(FINFO,"send_files(%d,%s)\n",i,fname);
1055 if (dry_run) {
1056 if (!am_server && verbose)
1057 printf("%s\n",fname);
1058 write_int(f_out,i);
1059 continue;
1062 s = receive_sums(f_in);
1063 if (!s) {
1064 io_error = 1;
1065 rprintf(FERROR,"receive_sums failed\n");
1066 return;
1069 fd = open(fname,O_RDONLY);
1070 if (fd == -1) {
1071 io_error = 1;
1072 rprintf(FERROR,"send_files failed to open %s: %s\n",
1073 fname,strerror(errno));
1074 free_sums(s);
1075 continue;
1078 /* map the local file */
1079 if (do_fstat(fd,&st) != 0) {
1080 io_error = 1;
1081 rprintf(FERROR,"fstat failed : %s\n",strerror(errno));
1082 free_sums(s);
1083 close(fd);
1084 return;
1087 if (st.st_size > 0) {
1088 buf = map_file(fd,st.st_size);
1089 } else {
1090 buf = NULL;
1093 if (verbose > 2)
1094 rprintf(FINFO,"send_files mapped %s of size %d\n",
1095 fname,(int)st.st_size);
1097 write_int(f_out,i);
1099 write_int(f_out,s->count);
1100 write_int(f_out,s->n);
1101 write_int(f_out,s->remainder);
1103 if (verbose > 2)
1104 rprintf(FINFO,"calling match_sums %s\n",fname);
1106 if (!am_server && verbose)
1107 printf("%s\n",fname+offset);
1109 match_sums(f_out,s,buf,st.st_size);
1111 if (buf) unmap_file(buf);
1112 close(fd);
1114 free_sums(s);
1116 if (verbose > 2)
1117 rprintf(FINFO,"sender finished %s\n",fname);
1120 if (verbose > 2)
1121 rprintf(FINFO,"send files finished\n");
1123 match_report();
1125 write_int(f_out,-1);
1130 void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
1132 int i;
1133 int phase=0;
1135 if (verbose > 2)
1136 rprintf(FINFO,"generator starting pid=%d count=%d\n",
1137 (int)getpid(),flist->count);
1139 for (i = 0; i < flist->count; i++) {
1140 struct file_struct *file = flist->files[i];
1141 mode_t saved_mode = file->mode;
1142 if (!file->basename) continue;
1144 /* we need to ensure that any directories we create have writeable
1145 permissions initially so that we can create the files within
1146 them. This is then fixed after the files are transferred */
1147 if (!am_root && S_ISDIR(file->mode)) {
1148 file->mode |= S_IWUSR; /* user write */
1151 recv_generator(local_name?local_name:f_name(file),
1152 flist,i,f);
1154 file->mode = saved_mode;
1157 phase++;
1158 csum_length = SUM_LENGTH;
1159 ignore_times=1;
1161 if (verbose > 2)
1162 rprintf(FINFO,"generate_files phase=%d\n",phase);
1164 write_int(f,-1);
1166 /* we expect to just sit around now, so don't exit on a timeout. If we
1167 really get a timeout then the other process should exit */
1168 io_timeout = 0;
1170 if (remote_version >= 13) {
1171 /* in newer versions of the protocol the files can cycle through
1172 the system more than once to catch initial checksum errors */
1173 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
1174 struct file_struct *file = flist->files[i];
1175 recv_generator(local_name?local_name:f_name(file),
1176 flist,i,f);
1179 phase++;
1180 if (verbose > 2)
1181 rprintf(FINFO,"generate_files phase=%d\n",phase);
1183 write_int(f,-1);