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