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