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