added support for --include, --include-from and the +/- syntax
[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;
bcacc18b 75 STRUCT_STAT st;
3cb6f5d6
AT
76 int ret;
77
78 if (do_unlink(fname) == 0 || errno == ENOENT) return 0;
79
80#if SUPPORT_LINKS
bcacc18b 81 ret = do_lstat(fname, &st);
3cb6f5d6 82#else
bcacc18b 83 ret = do_stat(fname, &st);
3cb6f5d6
AT
84#endif
85 if (ret) {
9486289c 86 rprintf(FERROR,"stat(%s) : %s\n", fname, strerror(errno));
3cb6f5d6
AT
87 return -1;
88 }
89
90 if (!S_ISDIR(st.st_mode)) {
9486289c 91 rprintf(FERROR,"unlink(%s) : %s\n", fname, strerror(errno));
3cb6f5d6
AT
92 return -1;
93 }
94
95 if (do_rmdir(fname) == 0 || errno == ENOENT) return 0;
98ae8c3e 96 if (!force_delete || (errno != ENOTEMPTY && errno != EEXIST)) {
9486289c 97 rprintf(FERROR,"rmdir(%s) : %s\n", fname, strerror(errno));
3cb6f5d6
AT
98 return -1;
99 }
100
101 /* now we do a recsursive delete on the directory ... */
102 d = opendir(fname);
103 if (!d) {
9486289c 104 rprintf(FERROR,"opendir(%s): %s\n",
3cb6f5d6
AT
105 fname,strerror(errno));
106 return -1;
107 }
108
109 for (di=readdir(d); di; di=readdir(d)) {
d6e6ecbd
AT
110 char *dname = d_name(di);
111 if (strcmp(dname,".")==0 ||
112 strcmp(dname,"..")==0)
3cb6f5d6 113 continue;
e42c9458 114 slprintf(buf, sizeof(buf)-1, "%s/%s", fname, dname);
3cb6f5d6 115 if (verbose > 0)
9486289c 116 rprintf(FINFO,"deleting %s\n", buf);
3cb6f5d6
AT
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) {
9486289c 126 rprintf(FERROR,"rmdir(%s) : %s\n", fname, strerror(errno));
3cb6f5d6
AT
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 */
bcacc18b 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);
bcacc18b 166 OFF_T offset = 0;
c627d613
AT
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)
9486289c 184 rprintf(FINFO,"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)
9486289c 202 rprintf(FINFO,"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;
bcacc18b 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)
9486289c 231 rprintf(FINFO,"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)
9486289c 255 rprintf(FINFO,"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
bcacc18b 265static int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st,
7b8356d0 266 int report)
c627d613
AT
267{
268 int updated = 0;
bcacc18b 269 STRUCT_STAT st2;
943882a2 270 extern int am_daemon;
c627d613 271
7b8356d0 272 if (dry_run) return 0;
c627d613
AT
273
274 if (!st) {
82306bf6 275 if (link_stat(fname,&st2) != 0) {
9486289c 276 rprintf(FERROR,"stat %s : %s\n",fname,strerror(errno));
7b8356d0 277 return 0;
c627d613
AT
278 }
279 st = &st2;
280 }
281
7bec6a5c
AT
282 if (preserve_times && !S_ISLNK(st->st_mode) &&
283 st->st_mtime != file->modtime) {
c627d613
AT
284 updated = 1;
285 if (set_modtime(fname,file->modtime) != 0) {
9486289c 286 rprintf(FERROR,"failed to set times on %s : %s\n",
c627d613 287 fname,strerror(errno));
7b8356d0 288 return 0;
c627d613
AT
289 }
290 }
291
292#ifdef HAVE_CHMOD
7bec6a5c
AT
293 if (preserve_perms && !S_ISLNK(st->st_mode) &&
294 st->st_mode != file->mode) {
c627d613 295 updated = 1;
7308bd66 296 if (do_chmod(fname,file->mode) != 0) {
9486289c 297 rprintf(FERROR,"failed to set permissions on %s : %s\n",
c627d613 298 fname,strerror(errno));
7b8356d0 299 return 0;
c627d613
AT
300 }
301 }
302#endif
303
943882a2
AT
304 if ((am_root || !am_daemon) &&
305 ((am_root && preserve_uid && st->st_uid != file->uid) ||
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)
9486289c 313 rprintf(FERROR,"chown %s : %s\n",
5fb543d5
AT
314 fname,strerror(errno));
315 return updated;
316 }
317 updated = 1;
c627d613
AT
318 }
319
320 if (verbose > 1 && report) {
5fb543d5 321 if (updated)
9486289c 322 rprintf(FINFO,"%s\n",fname);
5fb543d5 323 else
9486289c 324 rprintf(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,
bcacc18b 332 struct file_struct *file, STRUCT_STAT *st)
964ca2ec
AT
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;
bcacc18b 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)
9486289c 374 rprintf(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) {
9486289c 382 rprintf(FERROR,"unlink %s : %s\n",fname,strerror(errno));
7b8356d0
AT
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)) {
9486289c 391 rprintf(FERROR,"mkdir %s : %s (2)\n",
6574b4f7
AT
392 fname,strerror(errno));
393 }
394 }
7b8356d0 395 if (set_perms(fname,file,NULL,0) && verbose)
9486289c 396 rprintf(FINFO,"%s/\n",fname);
7b8356d0
AT
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) {
9486289c 416 rprintf(FERROR,"link %s -> %s : %s\n",
dc5ddbcc 417 fname,file->link,strerror(errno));
c627d613 418 } else {
dc5ddbcc 419 set_perms(fname,file,NULL,0);
c627d613 420 if (verbose)
9486289c 421 rprintf(FINFO,"%s -> %s\n",
dc5ddbcc 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)
9486289c 435 rprintf(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) {
9486289c 438 rprintf(FERROR,"mknod %s : %s\n",fname,strerror(errno));
c627d613 439 } else {
dc5ddbcc 440 set_perms(fname,file,NULL,0);
c627d613 441 if (verbose)
9486289c 442 rprintf(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)
9486289c 453 rprintf(FINFO,"%s is a hard link\n",f_name(file));
dc5ddbcc
AT
454 return;
455 }
456
457 if (!S_ISREG(file->mode)) {
9486289c 458 rprintf(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)
9486289c 468 rprintf(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)
9486289c 486 rprintf(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) {
9486289c
AT
510 rprintf(FERROR,"failed to open %s : %s\n",fname,strerror(errno));
511 rprintf(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)
9486289c 522 rprintf(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)
9486289c 527 rprintf(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;
bcacc18b
AT
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)
9486289c 560 rprintf(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) {
9486289c 565 rprintf(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)
9486289c 577 rprintf(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) {
9486289c 586 rprintf(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) {
9486289c 594 rprintf(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)
9486289c 603 rprintf(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) {
9486289c 615 rprintf(FERROR,"unlink %s : %s\n",f_name(f),strerror(errno));
c627d613 616 } else if (verbose) {
9486289c 617 rprintf(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)
9486289c 622 rprintf(FERROR,"rmdir %s : %s\n",f_name(f),strerror(errno));
c627d613 623 } else if (verbose) {
9486289c 624 rprintf(FINFO,"deleting directory %s\n",f_name(f));
c627d613
AT
625 }
626 }
627}
628
629
3b3a2fbc 630
3333ffbd
AT
631static struct delete_list {
632 dev_t dev;
633 ino_t inode;
634} *delete_list;
635static int dlist_len, dlist_alloc_len;
3b3a2fbc 636
3333ffbd
AT
637static void add_delete_entry(struct file_struct *file)
638{
639 if (dlist_len == dlist_alloc_len) {
640 dlist_alloc_len += 1024;
641 if (!delete_list) {
642 delete_list = (struct delete_list *)malloc(sizeof(delete_list[0])*dlist_alloc_len);
643 } else {
644 delete_list = (struct delete_list *)realloc(delete_list, sizeof(delete_list[0])*dlist_alloc_len);
645 }
646 if (!delete_list) out_of_memory("add_delete_entry");
3b3a2fbc
AT
647 }
648
3333ffbd
AT
649 delete_list[dlist_len].dev = file->dev;
650 delete_list[dlist_len].inode = file->inode;
651 dlist_len++;
0a25de67 652
3333ffbd 653 if (verbose > 3)
9486289c 654 rprintf(FINFO,"added %s to delete list\n", f_name(file));
3333ffbd 655}
0a25de67 656
3333ffbd
AT
657/* yuck! This function wouldn't have been necessary if I had the sorting
658 algorithm right. Unfortunately fixing the sorting algorithm would introduce
659 a backward incompatibility as file list indexes are sent over the link.
660*/
661static int delete_already_done(struct file_list *flist,int j)
662{
663 int i;
bcacc18b 664 STRUCT_STAT st;
3b3a2fbc 665
3333ffbd 666 if (link_stat(f_name(flist->files[j]), &st)) return 1;
3b3a2fbc 667
3333ffbd
AT
668 for (i=0;i<dlist_len;i++) {
669 if (st.st_ino == delete_list[i].inode &&
670 st.st_dev == delete_list[i].dev)
671 return 1;
3b3a2fbc
AT
672 }
673
3b3a2fbc
AT
674 return 0;
675}
676
677
e92338c8
AT
678/* this deletes any files on the receiving side that are not present
679 on the sending side. For version 1.6.4 I have changed the behaviour
680 to match more closely what most people seem to expect of this option */
c627d613
AT
681static void delete_files(struct file_list *flist)
682{
3333ffbd
AT
683 struct file_list *local_file_list;
684 int i, j;
685 char *name;
4fe159a8 686
3333ffbd
AT
687 if (cvs_exclude)
688 add_cvs_excludes();
6ba9279f 689
3333ffbd 690 if (io_error) {
9486289c 691 rprintf(FINFO,"IO error encountered - skipping file deletion\n");
3333ffbd
AT
692 return;
693 }
3b3a2fbc 694
3333ffbd
AT
695 for (j=0;j<flist->count;j++) {
696 if (!S_ISDIR(flist->files[j]->mode) ||
697 !(flist->files[j]->flags & FLAG_DELETE)) continue;
3b3a2fbc 698
7b1ce0d7
AT
699 if (remote_version < 19 &&
700 delete_already_done(flist, j)) continue;
0a25de67 701
3333ffbd 702 name = strdup(f_name(flist->files[j]));
3b3a2fbc 703
3333ffbd
AT
704 if (!(local_file_list = send_file_list(-1,1,&name))) {
705 free(name);
706 continue;
707 }
3b3a2fbc 708
3333ffbd 709 if (verbose > 1)
9486289c 710 rprintf(FINFO,"deleting in %s\n", name);
e92338c8 711
3333ffbd
AT
712 for (i=local_file_list->count-1;i>=0;i--) {
713 if (!local_file_list->files[i]->basename) continue;
7b1ce0d7
AT
714 if (remote_version < 19 &&
715 S_ISDIR(local_file_list->files[i]->mode))
3333ffbd
AT
716 add_delete_entry(local_file_list->files[i]);
717 if (-1 == flist_find(flist,local_file_list->files[i])) {
718 delete_one(local_file_list->files[i]);
719 }
720 }
721 flist_free(local_file_list);
722 free(name);
723 }
c627d613
AT
724}
725
3a6a366f 726static char *cleanup_fname;
c627d613 727
34ccb63e 728void exit_cleanup(int code)
c627d613 729{
8d9dc9f9 730 io_flush();
82306bf6 731 if (cleanup_fname)
31e12522 732 do_unlink(cleanup_fname);
82306bf6
AT
733 signal(SIGUSR1, SIG_IGN);
734 if (code) {
3ba62a83 735 kill_all(SIGUSR1);
82306bf6
AT
736 }
737 exit(code);
34ccb63e
AT
738}
739
740void sig_int(void)
741{
742 exit_cleanup(1);
c627d613
AT
743}
744
745
c6e7fcb4 746int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
c627d613
AT
747{
748 int fd1,fd2;
bcacc18b 749 STRUCT_STAT st;
c627d613
AT
750 char *fname;
751 char fnametmp[MAXPATHLEN];
c6e7fcb4 752 struct map_struct *buf;
c627d613 753 int i;
dc5ddbcc 754 struct file_struct *file;
c6e7fcb4 755 int phase=0;
9e31c482 756 int recv_ok;
c627d613 757
981791bd 758 if (verbose > 2) {
9486289c 759 rprintf(FINFO,"recv_files(%d) starting\n",flist->count);
981791bd 760 }
c627d613
AT
761
762 if (recurse && delete_mode && !local_name && flist->count>0) {
763 delete_files(flist);
764 }
765
766 while (1)
9e31c482 767 {
c627d613 768 i = read_int(f_in);
c6e7fcb4
AT
769 if (i == -1) {
770 if (phase==0 && remote_version >= 13) {
771 phase++;
9e31c482
AT
772 csum_length = SUM_LENGTH;
773 if (verbose > 2)
9486289c 774 rprintf(FINFO,"recv_files phase=%d\n",phase);
c6e7fcb4
AT
775 write_int(f_gen,-1);
776 write_flush(f_gen);
777 continue;
778 }
779 break;
780 }
c627d613 781
3ec4dd97
AT
782 file = flist->files[i];
783 fname = f_name(file);
c627d613
AT
784
785 if (local_name)
786 fname = local_name;
787
788 if (dry_run) {
789 if (!am_server && verbose)
790 printf("%s\n",fname);
791 continue;
792 }
793
794 if (verbose > 2)
9486289c 795 rprintf(FINFO,"recv_files(%s)\n",fname);
c627d613
AT
796
797 /* open the file */
ac1eb754 798 fd1 = open(fname,O_RDONLY);
c627d613 799
bcacc18b 800 if (fd1 != -1 && do_fstat(fd1,&st) != 0) {
9486289c 801 rprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
7b8356d0 802 receive_data(f_in,NULL,-1,NULL);
c627d613 803 close(fd1);
7b8356d0 804 continue;
c627d613
AT
805 }
806
ac1eb754 807 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
9486289c 808 rprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
7b8356d0 809 receive_data(f_in,NULL,-1,NULL);
c627d613 810 close(fd1);
7b8356d0 811 continue;
c627d613
AT
812 }
813
ac1eb754 814 if (fd1 != -1 && st.st_size > 0) {
c627d613 815 buf = map_file(fd1,st.st_size);
9e31c482 816 if (verbose > 2)
9486289c 817 rprintf(FINFO,"recv mapped %s of size %d\n",fname,(int)st.st_size);
c627d613
AT
818 } else {
819 buf = NULL;
820 }
821
c627d613 822 /* open tmp file */
950ab32d
AT
823 if (tmpdir) {
824 char *f;
825 f = strrchr(fname,'/');
826 if (f == NULL)
827 f = fname;
828 else
829 f++;
d4ebe7a7
AT
830 if (strlen(tmpdir)+strlen(f)+10 > MAXPATHLEN) {
831 rprintf(FERROR,"filename too long\n");
832 if (buf) unmap_file(buf);
833 close(fd1);
834 continue;
835 }
e42c9458 836 slprintf(fnametmp,sizeof(fnametmp)-1, "%s/.%s.XXXXXX",tmpdir,f);
950ab32d 837 } else {
eb697c99
AT
838 char *f = strrchr(fname,'/');
839
d4ebe7a7
AT
840 if (strlen(fname)+9 > MAXPATHLEN) {
841 rprintf(FERROR,"filename too long\n");
842 if (buf) unmap_file(buf);
843 close(fd1);
844 continue;
845 }
846
eb697c99
AT
847 if (f) {
848 *f = 0;
e42c9458 849 slprintf(fnametmp,sizeof(fnametmp)-1,"%s/.%s.XXXXXX",fname,f+1);
eb697c99
AT
850 *f = '/';
851 } else {
e42c9458 852 slprintf(fnametmp,sizeof(fnametmp)-1,".%s.XXXXXX",fname);
eb697c99 853 }
950ab32d 854 }
1b2d733a 855 if (NULL == do_mktemp(fnametmp)) {
9486289c 856 rprintf(FERROR,"mktemp %s failed\n",fnametmp);
7b8356d0
AT
857 receive_data(f_in,buf,-1,NULL);
858 if (buf) unmap_file(buf);
859 close(fd1);
860 continue;
c627d613 861 }
31e12522 862 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
fee64929 863 if (fd2 == -1 && relative_paths && errno == ENOENT &&
6574b4f7 864 create_directory_path(fnametmp) == 0) {
31e12522 865 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
6574b4f7 866 }
c627d613 867 if (fd2 == -1) {
9486289c 868 rprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
7b8356d0
AT
869 receive_data(f_in,buf,-1,NULL);
870 if (buf) unmap_file(buf);
871 close(fd1);
872 continue;
c627d613
AT
873 }
874
875 cleanup_fname = fnametmp;
876
877 if (!am_server && verbose)
878 printf("%s\n",fname);
879
880 /* recv file data */
9e31c482 881 recv_ok = receive_data(f_in,buf,fd2,fname);
c627d613 882
3ec4dd97 883 if (buf) unmap_file(buf);
981791bd 884 if (fd1 != -1) {
981791bd
AT
885 close(fd1);
886 }
c627d613
AT
887 close(fd2);
888
889 if (verbose > 2)
9486289c 890 rprintf(FINFO,"renaming %s to %s\n",fnametmp,fname);
c627d613
AT
891
892 if (make_backups) {
893 char fnamebak[MAXPATHLEN];
13a1f792 894 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
9486289c 895 rprintf(FERROR,"backup filename too long\n");
13a1f792
AT
896 continue;
897 }
e42c9458 898 slprintf(fnamebak,sizeof(fnamebak)-1,"%s%s",fname,backup_suffix);
1b2d733a 899 if (do_rename(fname,fnamebak) != 0 && errno != ENOENT) {
9486289c 900 rprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
7b8356d0 901 continue;
c627d613
AT
902 }
903 }
904
905 /* move tmp file over real file */
1b2d733a 906 if (do_rename(fnametmp,fname) != 0) {
950ab32d
AT
907 if (errno == EXDEV) {
908 /* rename failed on cross-filesystem link.
909 Copy the file instead. */
13dc412d 910 if (copy_file(fnametmp,fname, file->mode)) {
9486289c 911 rprintf(FERROR,"copy %s -> %s : %s\n",
950ab32d 912 fnametmp,fname,strerror(errno));
13dc412d
AT
913 } else {
914 set_perms(fname,file,NULL,0);
915 }
31e12522 916 do_unlink(fnametmp);
950ab32d 917 } else {
9486289c 918 rprintf(FERROR,"rename %s -> %s : %s\n",
950ab32d 919 fnametmp,fname,strerror(errno));
31e12522 920 do_unlink(fnametmp);
950ab32d 921 }
13dc412d
AT
922 } else {
923 set_perms(fname,file,NULL,0);
c627d613
AT
924 }
925
926 cleanup_fname = NULL;
927
9e31c482
AT
928
929 if (!recv_ok) {
e7ebc36c 930 if (csum_length == SUM_LENGTH) {
9486289c 931 rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
e7ebc36c
AT
932 fname);
933 } else {
934 if (verbose > 1)
9486289c 935 rprintf(FINFO,"redoing %s(%d)\n",fname,i);
e7ebc36c
AT
936 write_int(f_gen,i);
937 }
9e31c482 938 }
c627d613
AT
939 }
940
7c596906
AT
941 if (preserve_hard_links)
942 do_hard_links(flist);
943
7b8356d0
AT
944 /* now we need to fix any directory permissions that were
945 modified during the transfer */
7c596906 946 for (i = 0; i < flist->count; i++) {
23e43fce 947 file = flist->files[i];
3ec4dd97
AT
948 if (!file->basename || !S_ISDIR(file->mode)) continue;
949 recv_generator(f_name(file),flist,i,-1);
7b8356d0 950 }
7b8356d0 951
c627d613 952 if (verbose > 2)
9486289c 953 rprintf(FINFO,"recv_files finished\n");
c627d613
AT
954
955 return 0;
956}
957
958
959
71c46176 960void send_files(struct file_list *flist,int f_out,int f_in)
c627d613
AT
961{
962 int fd;
963 struct sum_struct *s;
c6e7fcb4 964 struct map_struct *buf;
bcacc18b 965 STRUCT_STAT st;
c627d613 966 char fname[MAXPATHLEN];
c627d613 967 int i;
dc5ddbcc 968 struct file_struct *file;
c6e7fcb4 969 int phase = 0;
7796395a 970 int offset=0;
c627d613
AT
971
972 if (verbose > 2)
9486289c 973 rprintf(FINFO,"send_files starting\n");
c627d613 974
720b47f2
AT
975 setup_nonblocking(f_in,f_out);
976
e7ebc36c
AT
977 while (1) {
978 i = read_int(f_in);
979 if (i == -1) {
980 if (phase==0 && remote_version >= 13) {
981 phase++;
982 csum_length = SUM_LENGTH;
983 write_int(f_out,-1);
984 write_flush(f_out);
985 if (verbose > 2)
9486289c 986 rprintf(FINFO,"send_files phase=%d\n",phase);
e7ebc36c
AT
987 continue;
988 }
989 break;
990 }
c627d613 991
e7ebc36c
AT
992 file = flist->files[i];
993
994 fname[0] = 0;
995 if (file->basedir) {
7a6421fa 996 strlcpy(fname,file->basedir,MAXPATHLEN-1);
e7ebc36c 997 if (strlen(fname) == MAXPATHLEN-1) {
6ba9279f 998 io_error = 1;
9486289c 999 rprintf(FERROR, "send_files failed on long-named directory %s\n",
e7ebc36c 1000 fname);
71c46176 1001 return;
e7ebc36c 1002 }
e42c9458 1003 strlcat(fname,"/",MAXPATHLEN-1);
7796395a 1004 offset = strlen(file->basedir)+1;
e7ebc36c 1005 }
e42c9458 1006 strlcat(fname,f_name(file),MAXPATHLEN-strlen(fname));
e7ebc36c
AT
1007
1008 if (verbose > 2)
9486289c 1009 rprintf(FINFO,"send_files(%d,%s)\n",i,fname);
e7ebc36c
AT
1010
1011 if (dry_run) {
1012 if (!am_server && verbose)
1013 printf("%s\n",fname);
1014 write_int(f_out,i);
1015 continue;
1016 }
c627d613 1017
e7ebc36c
AT
1018 s = receive_sums(f_in);
1019 if (!s) {
6ba9279f 1020 io_error = 1;
9486289c 1021 rprintf(FERROR,"receive_sums failed\n");
71c46176 1022 return;
e7ebc36c
AT
1023 }
1024
1025 fd = open(fname,O_RDONLY);
1026 if (fd == -1) {
6ba9279f 1027 io_error = 1;
9486289c 1028 rprintf(FERROR,"send_files failed to open %s: %s\n",
e7ebc36c 1029 fname,strerror(errno));
0b910560 1030 free_sums(s);
e7ebc36c
AT
1031 continue;
1032 }
1033
1034 /* map the local file */
bcacc18b 1035 if (do_fstat(fd,&st) != 0) {
6ba9279f 1036 io_error = 1;
9486289c 1037 rprintf(FERROR,"fstat failed : %s\n",strerror(errno));
0b910560 1038 free_sums(s);
e7ebc36c 1039 close(fd);
71c46176 1040 return;
e7ebc36c
AT
1041 }
1042
1043 if (st.st_size > 0) {
1044 buf = map_file(fd,st.st_size);
1045 } else {
1046 buf = NULL;
1047 }
1048
1049 if (verbose > 2)
9486289c 1050 rprintf(FINFO,"send_files mapped %s of size %d\n",
e7ebc36c
AT
1051 fname,(int)st.st_size);
1052
1053 write_int(f_out,i);
1054
1055 write_int(f_out,s->count);
1056 write_int(f_out,s->n);
1057 write_int(f_out,s->remainder);
1058
1059 if (verbose > 2)
9486289c 1060 rprintf(FINFO,"calling match_sums %s\n",fname);
e7ebc36c
AT
1061
1062 if (!am_server && verbose)
7796395a 1063 printf("%s\n",fname+offset);
e7ebc36c
AT
1064
1065 match_sums(f_out,s,buf,st.st_size);
1066 write_flush(f_out);
1067
1068 if (buf) unmap_file(buf);
1069 close(fd);
1070
1071 free_sums(s);
1072
1073 if (verbose > 2)
9486289c 1074 rprintf(FINFO,"sender finished %s\n",fname);
e7ebc36c 1075 }
c627d613 1076
dc5ddbcc 1077 if (verbose > 2)
9486289c 1078 rprintf(FINFO,"send files finished\n");
dc5ddbcc 1079
c627d613
AT
1080 match_report();
1081
1082 write_int(f_out,-1);
1083 write_flush(f_out);
c627d613
AT
1084}
1085
1086
1087
c6e7fcb4 1088void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
c627d613
AT
1089{
1090 int i;
9e31c482 1091 int phase=0;
c627d613
AT
1092
1093 if (verbose > 2)
9486289c 1094 rprintf(FINFO,"generator starting pid=%d count=%d\n",
c627d613
AT
1095 (int)getpid(),flist->count);
1096
1097 for (i = 0; i < flist->count; i++) {
3ec4dd97 1098 struct file_struct *file = flist->files[i];
7b8356d0 1099 mode_t saved_mode = file->mode;
3ec4dd97 1100 if (!file->basename) continue;
7b8356d0
AT
1101
1102 /* we need to ensure that any directories we create have writeable
1103 permissions initially so that we can create the files within
1104 them. This is then fixed after the files are transferred */
1105 if (!am_root && S_ISDIR(file->mode)) {
1106 file->mode |= S_IWUSR; /* user write */
c627d613 1107 }
7b8356d0 1108
3ec4dd97 1109 recv_generator(local_name?local_name:f_name(file),
c627d613 1110 flist,i,f);
7b8356d0
AT
1111
1112 file->mode = saved_mode;
c627d613 1113 }
c6e7fcb4 1114
9e31c482
AT
1115 phase++;
1116 csum_length = SUM_LENGTH;
1117 ignore_times=1;
1118
1119 if (verbose > 2)
9486289c 1120 rprintf(FINFO,"generate_files phase=%d\n",phase);
9e31c482 1121
c627d613
AT
1122 write_int(f,-1);
1123 write_flush(f);
c6e7fcb4 1124
6ba9279f
AT
1125 /* we expect to just sit around now, so don't exit on a timeout. If we
1126 really get a timeout then the other process should exit */
1127 io_timeout = 0;
1128
c6e7fcb4 1129 if (remote_version >= 13) {
7b8356d0
AT
1130 /* in newer versions of the protocol the files can cycle through
1131 the system more than once to catch initial checksum errors */
c6e7fcb4 1132 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
3ec4dd97
AT
1133 struct file_struct *file = flist->files[i];
1134 recv_generator(local_name?local_name:f_name(file),
c6e7fcb4
AT
1135 flist,i,f);
1136 }
1137
9e31c482
AT
1138 phase++;
1139 if (verbose > 2)
9486289c 1140 rprintf(FINFO,"generate_files phase=%d\n",phase);
9e31c482 1141
c6e7fcb4
AT
1142 write_int(f,-1);
1143 write_flush(f);
1144 }
1145
1146
c627d613 1147 if (verbose > 2)
9486289c 1148 rprintf(FINFO,"generator wrote %ld\n",(long)write_total());
c627d613 1149}
dc5ddbcc
AT
1150
1151