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