configuration parsing and loading code for rsyncd. This is based
[rsync/rsync.git] / rsync.c
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
22 extern int csum_length;
23
24 extern int verbose;
25 extern int am_server;
26 extern int always_checksum;
27 extern time_t starttime;
28
29 extern int remote_version;
30
31 extern char *backup_suffix;
32 extern char *tmpdir;
33
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
55 /*
56   free a sums struct
57   */
58 static 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  */
69 static 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
78         if (do_unlink(fname) == 0 || errno == ENOENT) return 0;
79
80 #if SUPPORT_LINKS
81         ret = do_lstat(fname, &st);
82 #else
83         ret = do_stat(fname, &st);
84 #endif
85         if (ret) {
86                 rprintf(FERROR,"stat(%s) : %s\n", fname, strerror(errno));
87                 return -1;
88         }
89
90         if (!S_ISDIR(st.st_mode)) {
91                 rprintf(FERROR,"unlink(%s) : %s\n", fname, strerror(errno));
92                 return -1;
93         }
94
95         if (do_rmdir(fname) == 0 || errno == ENOENT) return 0;
96         if (!force_delete || (errno != ENOTEMPTY && errno != EEXIST)) {
97                 rprintf(FERROR,"rmdir(%s) : %s\n", fname, strerror(errno));
98                 return -1;
99         }
100
101         /* now we do a recsursive delete on the directory ... */
102         d = opendir(fname);
103         if (!d) {
104                 rprintf(FERROR,"opendir(%s): %s\n",
105                         fname,strerror(errno));
106                 return -1;
107         }
108
109         for (di=readdir(d); di; di=readdir(d)) {
110                 char *dname = d_name(di);
111                 if (strcmp(dname,".")==0 ||
112                     strcmp(dname,"..")==0)
113                         continue;
114                 strncpy(buf, fname, (MAXPATHLEN-strlen(dname))-2);
115                 strcat(buf, "/");
116                 strcat(buf, dname);
117                 buf[MAXPATHLEN-1] = 0;
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   */
139 static 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   write_flush(f_out);
154 }
155
156
157 /*
158   generate a stream of signatures/checksums that describe a buffer
159
160   generate approximately one checksum every n bytes
161   */
162 static struct sum_struct *generate_sums(struct map_struct *buf,OFF_T len,int n)
163 {
164   int i;
165   struct sum_struct *s;
166   int count;
167   int block_len = n;
168   int remainder = (len%block_len);
169   OFF_T offset = 0;
170
171   count = (len+(block_len-1))/block_len;
172
173   s = (struct sum_struct *)malloc(sizeof(*s));
174   if (!s) out_of_memory("generate_sums");
175
176   s->count = count;
177   s->remainder = remainder;
178   s->n = n;
179   s->flength = len;
180
181   if (count==0) {
182     s->sums = NULL;
183     return s;
184   }
185
186   if (verbose > 3)
187     rprintf(FINFO,"count=%d rem=%d n=%d flength=%d\n",
188             s->count,s->remainder,s->n,(int)s->flength);
189
190   s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
191   if (!s->sums) out_of_memory("generate_sums");
192   
193   for (i=0;i<count;i++) {
194     int n1 = MIN(len,n);
195     char *map = map_ptr(buf,offset,n1);
196
197     s->sums[i].sum1 = get_checksum1(map,n1);
198     get_checksum2(map,n1,s->sums[i].sum2);
199
200     s->sums[i].offset = offset;
201     s->sums[i].len = n1;
202     s->sums[i].i = i;
203
204     if (verbose > 3)
205       rprintf(FINFO,"chunk[%d] offset=%d len=%d sum1=%08x\n",
206               i,(int)s->sums[i].offset,s->sums[i].len,s->sums[i].sum1);
207
208     len -= n1;
209     offset += n1;
210   }
211
212   return s;
213 }
214
215
216 /*
217   receive the checksums for a buffer
218   */
219 static struct sum_struct *receive_sums(int f)
220 {
221   struct sum_struct *s;
222   int i;
223   OFF_T offset = 0;
224
225   s = (struct sum_struct *)malloc(sizeof(*s));
226   if (!s) out_of_memory("receive_sums");
227
228   s->count = read_int(f);
229   s->n = read_int(f);
230   s->remainder = read_int(f);  
231   s->sums = NULL;
232
233   if (verbose > 3)
234     rprintf(FINFO,"count=%d n=%d rem=%d\n",
235             s->count,s->n,s->remainder);
236
237   if (s->count == 0) 
238     return(s);
239
240   s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
241   if (!s->sums) out_of_memory("receive_sums");
242
243   for (i=0;i<s->count;i++) {
244     s->sums[i].sum1 = read_int(f);
245     read_buf(f,s->sums[i].sum2,csum_length);
246
247     s->sums[i].offset = offset;
248     s->sums[i].i = i;
249
250     if (i == s->count-1 && s->remainder != 0) {
251       s->sums[i].len = s->remainder;
252     } else {
253       s->sums[i].len = s->n;
254     }
255     offset += s->sums[i].len;
256
257     if (verbose > 3)
258       rprintf(FINFO,"chunk[%d] len=%d offset=%d sum1=%08x\n",
259               i,s->sums[i].len,(int)s->sums[i].offset,s->sums[i].sum1);
260   }
261
262   s->flength = offset;
263
264   return s;
265 }
266
267
268 static int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st,
269                      int report)
270 {
271   int updated = 0;
272   STRUCT_STAT st2;
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 #ifdef HAVE_CHMOD
295   if (preserve_perms && !S_ISLNK(st->st_mode) &&
296       st->st_mode != file->mode) {
297     updated = 1;
298     if (do_chmod(fname,file->mode) != 0) {
299       rprintf(FERROR,"failed to set permissions on %s : %s\n",
300               fname,strerror(errno));
301       return 0;
302     }
303   }
304 #endif
305
306   if ((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 */
332 static 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 */
356 int 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
365 void 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   write_flush(f_out);
533
534   close(fd);
535   if (buf) unmap_file(buf);
536
537   free_sums(s);
538 }
539
540
541
542 static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname)
543 {
544   int i,n,remainder,len,count;
545   OFF_T offset = 0;
546   OFF_T offset2;
547   char *data;
548   static char file_sum1[MD4_SUM_LENGTH];
549   static char file_sum2[MD4_SUM_LENGTH];
550   char *map=NULL;
551
552   count = read_int(f_in);
553   n = read_int(f_in);
554   remainder = read_int(f_in);
555
556   sum_init();
557
558   for (i=recv_token(f_in,&data); i != 0; i=recv_token(f_in,&data)) {
559     if (i > 0) {
560       if (verbose > 3)
561         rprintf(FINFO,"data recv %d at %d\n",i,(int)offset);
562
563       sum_update(data,i);
564
565       if (fd != -1 && write_file(fd,data,i) != i) {
566         rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
567         exit_cleanup(1);
568       }
569       offset += i;
570     } else {
571       i = -(i+1);
572       offset2 = i*n;
573       len = n;
574       if (i == count-1 && remainder != 0)
575         len = remainder;
576
577       if (verbose > 3)
578         rprintf(FINFO,"chunk[%d] of size %d at %d offset=%d\n",
579                 i,len,(int)offset2,(int)offset);
580
581       map = map_ptr(buf,offset2,len);
582
583       see_token(map, len);
584       sum_update(map,len);
585
586       if (fd != -1 && write_file(fd,map,len) != len) {
587         rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
588         exit_cleanup(1);
589       }
590       offset += len;
591     }
592   }
593
594   if (fd != -1 && offset > 0 && sparse_end(fd) != 0) {
595     rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
596     exit_cleanup(1);
597   }
598
599   sum_end(file_sum1);
600
601   if (remote_version >= 14) {
602     read_buf(f_in,file_sum2,MD4_SUM_LENGTH);
603     if (verbose > 2)
604       rprintf(FINFO,"got file_sum\n");
605     if (fd != -1 && memcmp(file_sum1,file_sum2,MD4_SUM_LENGTH) != 0)
606       return 0;
607   }
608   return 1;
609 }
610
611
612 static void delete_one(struct file_struct *f)
613 {
614   if (!S_ISDIR(f->mode)) {
615     if (do_unlink(f_name(f)) != 0) {
616       rprintf(FERROR,"unlink %s : %s\n",f_name(f),strerror(errno));
617     } else if (verbose) {
618       rprintf(FINFO,"deleting %s\n",f_name(f));
619     }
620   } else {    
621     if (do_rmdir(f_name(f)) != 0) {
622       if (errno != ENOTEMPTY && errno != EEXIST)
623         rprintf(FERROR,"rmdir %s : %s\n",f_name(f),strerror(errno));
624     } else if (verbose) {
625       rprintf(FINFO,"deleting directory %s\n",f_name(f));      
626     }
627   }
628 }
629
630
631
632 static struct delete_list {
633         dev_t dev;
634         ino_t inode;
635 } *delete_list;
636 static int dlist_len, dlist_alloc_len;
637
638 static void add_delete_entry(struct file_struct *file)
639 {
640         if (dlist_len == dlist_alloc_len) {
641                 dlist_alloc_len += 1024;
642                 if (!delete_list) {
643                         delete_list = (struct delete_list *)malloc(sizeof(delete_list[0])*dlist_alloc_len);
644                 } else {
645                         delete_list = (struct delete_list *)realloc(delete_list, sizeof(delete_list[0])*dlist_alloc_len);
646                 }
647                 if (!delete_list) out_of_memory("add_delete_entry");
648         }
649
650         delete_list[dlist_len].dev = file->dev;
651         delete_list[dlist_len].inode = file->inode;
652         dlist_len++;
653
654         if (verbose > 3)
655                 rprintf(FINFO,"added %s to delete list\n", f_name(file));
656 }
657
658 /* yuck! This function wouldn't have been necessary if I had the sorting
659    algorithm right. Unfortunately fixing the sorting algorithm would introduce
660    a backward incompatibility as file list indexes are sent over the link.
661 */
662 static int delete_already_done(struct file_list *flist,int j)
663 {
664         int i;
665         STRUCT_STAT st;
666
667         if (link_stat(f_name(flist->files[j]), &st)) return 1;
668
669         for (i=0;i<dlist_len;i++) {
670                 if (st.st_ino == delete_list[i].inode &&
671                     st.st_dev == delete_list[i].dev)
672                         return 1;
673         }
674
675         return 0;
676 }
677
678
679 /* this deletes any files on the receiving side that are not present
680    on the sending side. For version 1.6.4 I have changed the behaviour
681    to match more closely what most people seem to expect of this option */
682 static void delete_files(struct file_list *flist)
683 {
684         struct file_list *local_file_list;
685         int i, j;
686         char *name;
687
688         if (cvs_exclude)
689                 add_cvs_excludes();
690
691         if (io_error) {
692                 rprintf(FINFO,"IO error encountered - skipping file deletion\n");
693                 return;
694         }
695
696         for (j=0;j<flist->count;j++) {
697                 if (!S_ISDIR(flist->files[j]->mode) || 
698                     !(flist->files[j]->flags & FLAG_DELETE)) continue;
699
700                 if (delete_already_done(flist, j)) continue;
701
702                 name = strdup(f_name(flist->files[j]));
703
704                 if (!(local_file_list = send_file_list(-1,1,&name))) {
705                         free(name);
706                         continue;
707                 }
708
709                 if (verbose > 1)
710                         rprintf(FINFO,"deleting in %s\n", name);
711
712                 for (i=local_file_list->count-1;i>=0;i--) {
713                         if (!local_file_list->files[i]->basename) continue;
714                         if (S_ISDIR(local_file_list->files[i]->mode))
715                                 add_delete_entry(local_file_list->files[i]);
716                         if (-1 == flist_find(flist,local_file_list->files[i])) {
717                                 delete_one(local_file_list->files[i]);
718                         }    
719                 }
720                 flist_free(local_file_list);
721                 free(name);
722         }
723 }
724
725 static char *cleanup_fname;
726
727 void exit_cleanup(int code)
728 {
729         if (cleanup_fname)
730                 do_unlink(cleanup_fname);
731         signal(SIGUSR1, SIG_IGN);
732         if (code) {
733                 kill_all(SIGUSR1);
734         }
735         exit(code);
736 }
737
738 void sig_int(void)
739 {
740   exit_cleanup(1);
741 }
742
743
744 int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
745 {  
746   int fd1,fd2;
747   STRUCT_STAT st;
748   char *fname;
749   char fnametmp[MAXPATHLEN];
750   struct map_struct *buf;
751   int i;
752   struct file_struct *file;
753   int phase=0;
754   int recv_ok;
755
756   if (verbose > 2) {
757     rprintf(FINFO,"recv_files(%d) starting\n",flist->count);
758   }
759
760   if (recurse && delete_mode && !local_name && flist->count>0) {
761     delete_files(flist);
762   }
763
764   while (1) 
765     {      
766       i = read_int(f_in);
767       if (i == -1) {
768         if (phase==0 && remote_version >= 13) {
769           phase++;
770           csum_length = SUM_LENGTH;
771           if (verbose > 2)
772             rprintf(FINFO,"recv_files phase=%d\n",phase);
773           write_int(f_gen,-1);
774           write_flush(f_gen);
775           continue;
776         }
777         break;
778       }
779
780       file = flist->files[i];
781       fname = f_name(file);
782
783       if (local_name)
784         fname = local_name;
785
786       if (dry_run) {
787         if (!am_server && verbose)
788           printf("%s\n",fname);
789         continue;
790       }
791
792       if (verbose > 2)
793         rprintf(FINFO,"recv_files(%s)\n",fname);
794
795       /* open the file */  
796       fd1 = open(fname,O_RDONLY);
797
798       if (fd1 != -1 && do_fstat(fd1,&st) != 0) {
799         rprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
800         receive_data(f_in,NULL,-1,NULL);
801         close(fd1);
802         continue;
803       }
804
805       if (fd1 != -1 && !S_ISREG(st.st_mode)) {
806         rprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
807         receive_data(f_in,NULL,-1,NULL);
808         close(fd1);
809         continue;
810       }
811
812       if (fd1 != -1 && st.st_size > 0) {
813         buf = map_file(fd1,st.st_size);
814         if (verbose > 2)
815           rprintf(FINFO,"recv mapped %s of size %d\n",fname,(int)st.st_size);
816       } else {
817         buf = NULL;
818       }
819
820       /* open tmp file */
821       if (strlen(fname) > (MAXPATHLEN-8)) {
822         rprintf(FERROR,"filename too long\n");
823         if (buf) unmap_file(buf);
824         close(fd1);
825         continue;
826       }
827       if (tmpdir) {
828               char *f;
829               f = strrchr(fname,'/');
830               if (f == NULL) 
831                       f = fname;
832               else 
833                       f++;
834               sprintf(fnametmp,"%s/%s.XXXXXX",tmpdir,f);
835       } else {
836               sprintf(fnametmp,"%s.XXXXXX",fname);
837       }
838       if (NULL == do_mktemp(fnametmp)) {
839         rprintf(FERROR,"mktemp %s failed\n",fnametmp);
840         receive_data(f_in,buf,-1,NULL);
841         if (buf) unmap_file(buf);
842         close(fd1);
843         continue;
844       }
845       fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
846       if (fd2 == -1 && relative_paths && errno == ENOENT && 
847           create_directory_path(fnametmp) == 0) {
848               fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
849       }
850       if (fd2 == -1) {
851         rprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
852         receive_data(f_in,buf,-1,NULL);
853         if (buf) unmap_file(buf);
854         close(fd1);
855         continue;
856       }
857       
858       cleanup_fname = fnametmp;
859
860       if (!am_server && verbose)
861         printf("%s\n",fname);
862
863       /* recv file data */
864       recv_ok = receive_data(f_in,buf,fd2,fname);
865
866       if (buf) unmap_file(buf);
867       if (fd1 != -1) {
868         close(fd1);
869       }
870       close(fd2);
871
872       if (verbose > 2)
873         rprintf(FINFO,"renaming %s to %s\n",fnametmp,fname);
874
875       if (make_backups) {
876         char fnamebak[MAXPATHLEN];
877         if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
878                 rprintf(FERROR,"backup filename too long\n");
879                 continue;
880         }
881         sprintf(fnamebak,"%s%s",fname,backup_suffix);
882         if (do_rename(fname,fnamebak) != 0 && errno != ENOENT) {
883           rprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
884           continue;
885         }
886       }
887
888       /* move tmp file over real file */
889       if (do_rename(fnametmp,fname) != 0) {
890               if (errno == EXDEV) {
891                       /* rename failed on cross-filesystem link.  
892                          Copy the file instead. */
893                       if (copy_file(fnametmp,fname, file->mode)) {
894                               rprintf(FERROR,"copy %s -> %s : %s\n",
895                                       fnametmp,fname,strerror(errno));
896                       } else {
897                               set_perms(fname,file,NULL,0);
898                       }
899                       do_unlink(fnametmp);
900               } else {
901                       rprintf(FERROR,"rename %s -> %s : %s\n",
902                               fnametmp,fname,strerror(errno));
903                       do_unlink(fnametmp);
904               }
905       } else {
906               set_perms(fname,file,NULL,0);
907       }
908
909       cleanup_fname = NULL;
910
911
912       if (!recv_ok) {
913               if (csum_length == SUM_LENGTH) {
914                       rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
915                               fname);
916               } else {
917                       if (verbose > 1)
918                               rprintf(FINFO,"redoing %s(%d)\n",fname,i);
919                       write_int(f_gen,i);
920               }
921       }
922     }
923
924   if (preserve_hard_links)
925           do_hard_links(flist);
926
927   /* now we need to fix any directory permissions that were 
928      modified during the transfer */
929   for (i = 0; i < flist->count; i++) {
930           struct file_struct *file = flist->files[i];
931           if (!file->basename || !S_ISDIR(file->mode)) continue;
932           recv_generator(f_name(file),flist,i,-1);
933   }
934
935   if (verbose > 2)
936     rprintf(FINFO,"recv_files finished\n");
937   
938   return 0;
939 }
940
941
942
943 void send_files(struct file_list *flist,int f_out,int f_in)
944
945   int fd;
946   struct sum_struct *s;
947   struct map_struct *buf;
948   STRUCT_STAT st;
949   char fname[MAXPATHLEN];  
950   int i;
951   struct file_struct *file;
952   int phase = 0;
953   int offset=0;
954
955   if (verbose > 2)
956     rprintf(FINFO,"send_files starting\n");
957
958   setup_nonblocking(f_in,f_out);
959
960   while (1) {
961           i = read_int(f_in);
962           if (i == -1) {
963                   if (phase==0 && remote_version >= 13) {
964                           phase++;
965                           csum_length = SUM_LENGTH;
966                           write_int(f_out,-1);
967                           write_flush(f_out);
968                           if (verbose > 2)
969                                   rprintf(FINFO,"send_files phase=%d\n",phase);
970                           continue;
971                   }
972                   break;
973           }
974
975           file = flist->files[i];
976
977           fname[0] = 0;
978           if (file->basedir) {
979                   strncpy(fname,file->basedir,MAXPATHLEN-1);
980                   fname[MAXPATHLEN-1] = 0;
981                   if (strlen(fname) == MAXPATHLEN-1) {
982                           io_error = 1;
983                           rprintf(FERROR, "send_files failed on long-named directory %s\n",
984                                   fname);
985                           return;
986                   }
987                   strcat(fname,"/");
988                   offset = strlen(file->basedir)+1;
989           }
990           strncat(fname,f_name(file),MAXPATHLEN-strlen(fname));
991           
992           if (verbose > 2) 
993                   rprintf(FINFO,"send_files(%d,%s)\n",i,fname);
994           
995           if (dry_run) {        
996                   if (!am_server && verbose)
997                           printf("%s\n",fname);
998                   write_int(f_out,i);
999                   continue;
1000           }
1001
1002           s = receive_sums(f_in);
1003           if (!s) {
1004                   io_error = 1;
1005                   rprintf(FERROR,"receive_sums failed\n");
1006                   return;
1007           }
1008           
1009           fd = open(fname,O_RDONLY);
1010           if (fd == -1) {
1011                   io_error = 1;
1012                   rprintf(FERROR,"send_files failed to open %s: %s\n",
1013                           fname,strerror(errno));
1014                   free_sums(s);
1015                   continue;
1016           }
1017           
1018           /* map the local file */
1019           if (do_fstat(fd,&st) != 0) {
1020                   io_error = 1;
1021                   rprintf(FERROR,"fstat failed : %s\n",strerror(errno));
1022                   free_sums(s);
1023                   close(fd);
1024                   return;
1025           }
1026           
1027           if (st.st_size > 0) {
1028                   buf = map_file(fd,st.st_size);
1029           } else {
1030                   buf = NULL;
1031           }
1032           
1033           if (verbose > 2)
1034                   rprintf(FINFO,"send_files mapped %s of size %d\n",
1035                           fname,(int)st.st_size);
1036           
1037           write_int(f_out,i);
1038           
1039           write_int(f_out,s->count);
1040           write_int(f_out,s->n);
1041           write_int(f_out,s->remainder);
1042           
1043           if (verbose > 2)
1044                   rprintf(FINFO,"calling match_sums %s\n",fname);
1045           
1046           if (!am_server && verbose)
1047                   printf("%s\n",fname+offset);
1048           
1049           match_sums(f_out,s,buf,st.st_size);
1050           write_flush(f_out);
1051           
1052           if (buf) unmap_file(buf);
1053           close(fd);
1054           
1055           free_sums(s);
1056           
1057           if (verbose > 2)
1058                   rprintf(FINFO,"sender finished %s\n",fname);
1059   }
1060
1061   if (verbose > 2)
1062           rprintf(FINFO,"send files finished\n");
1063
1064   match_report();
1065
1066   write_int(f_out,-1);
1067   write_flush(f_out);
1068 }
1069
1070
1071
1072 void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
1073 {
1074   int i;
1075   int phase=0;
1076
1077   if (verbose > 2)
1078     rprintf(FINFO,"generator starting pid=%d count=%d\n",
1079             (int)getpid(),flist->count);
1080
1081   for (i = 0; i < flist->count; i++) {
1082     struct file_struct *file = flist->files[i];
1083     mode_t saved_mode = file->mode;
1084     if (!file->basename) continue;
1085
1086     /* we need to ensure that any directories we create have writeable
1087        permissions initially so that we can create the files within
1088        them. This is then fixed after the files are transferred */
1089     if (!am_root && S_ISDIR(file->mode)) {
1090       file->mode |= S_IWUSR; /* user write */
1091     }
1092
1093     recv_generator(local_name?local_name:f_name(file),
1094                    flist,i,f);
1095
1096     file->mode = saved_mode;
1097   }
1098
1099   phase++;
1100   csum_length = SUM_LENGTH;
1101   ignore_times=1;
1102
1103   if (verbose > 2)
1104     rprintf(FINFO,"generate_files phase=%d\n",phase);
1105
1106   write_int(f,-1);
1107   write_flush(f);
1108
1109   /* we expect to just sit around now, so don't exit on a timeout. If we
1110      really get a timeout then the other process should exit */
1111   io_timeout = 0;
1112
1113   if (remote_version >= 13) {
1114     /* in newer versions of the protocol the files can cycle through
1115        the system more than once to catch initial checksum errors */
1116     for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
1117       struct file_struct *file = flist->files[i];
1118       recv_generator(local_name?local_name:f_name(file),
1119                      flist,i,f);    
1120     }
1121
1122     phase++;
1123     if (verbose > 2)
1124       rprintf(FINFO,"generate_files phase=%d\n",phase);
1125
1126     write_int(f,-1);
1127     write_flush(f);
1128   }
1129
1130
1131   if (verbose > 2)
1132     rprintf(FINFO,"generator wrote %ld\n",(long)write_total());
1133 }
1134
1135