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