fix realloc call for systems that don't handle realloc(NULL, ...)
[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;
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 775 write_int(f_gen,-1);
c6e7fcb4
AT
776 continue;
777 }
778 break;
779 }
c627d613 780
3ec4dd97
AT
781 file = flist->files[i];
782 fname = f_name(file);
c627d613
AT
783
784 if (local_name)
785 fname = local_name;
786
787 if (dry_run) {
788 if (!am_server && verbose)
789 printf("%s\n",fname);
790 continue;
791 }
792
793 if (verbose > 2)
9486289c 794 rprintf(FINFO,"recv_files(%s)\n",fname);
c627d613
AT
795
796 /* open the file */
ac1eb754 797 fd1 = open(fname,O_RDONLY);
c627d613 798
bcacc18b 799 if (fd1 != -1 && do_fstat(fd1,&st) != 0) {
9486289c 800 rprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
7b8356d0 801 receive_data(f_in,NULL,-1,NULL);
c627d613 802 close(fd1);
7b8356d0 803 continue;
c627d613
AT
804 }
805
ac1eb754 806 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
9486289c 807 rprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
7b8356d0 808 receive_data(f_in,NULL,-1,NULL);
c627d613 809 close(fd1);
7b8356d0 810 continue;
c627d613
AT
811 }
812
ac1eb754 813 if (fd1 != -1 && st.st_size > 0) {
c627d613 814 buf = map_file(fd1,st.st_size);
9e31c482 815 if (verbose > 2)
9486289c 816 rprintf(FINFO,"recv mapped %s of size %d\n",fname,(int)st.st_size);
c627d613
AT
817 } else {
818 buf = NULL;
819 }
820
c627d613 821 /* open tmp file */
950ab32d
AT
822 if (tmpdir) {
823 char *f;
824 f = strrchr(fname,'/');
825 if (f == NULL)
826 f = fname;
827 else
828 f++;
d4ebe7a7
AT
829 if (strlen(tmpdir)+strlen(f)+10 > MAXPATHLEN) {
830 rprintf(FERROR,"filename too long\n");
831 if (buf) unmap_file(buf);
832 close(fd1);
833 continue;
834 }
e42c9458 835 slprintf(fnametmp,sizeof(fnametmp)-1, "%s/.%s.XXXXXX",tmpdir,f);
950ab32d 836 } else {
eb697c99
AT
837 char *f = strrchr(fname,'/');
838
d4ebe7a7
AT
839 if (strlen(fname)+9 > MAXPATHLEN) {
840 rprintf(FERROR,"filename too long\n");
841 if (buf) unmap_file(buf);
842 close(fd1);
843 continue;
844 }
845
eb697c99
AT
846 if (f) {
847 *f = 0;
e42c9458 848 slprintf(fnametmp,sizeof(fnametmp)-1,"%s/.%s.XXXXXX",fname,f+1);
eb697c99
AT
849 *f = '/';
850 } else {
e42c9458 851 slprintf(fnametmp,sizeof(fnametmp)-1,".%s.XXXXXX",fname);
eb697c99 852 }
950ab32d 853 }
1b2d733a 854 if (NULL == do_mktemp(fnametmp)) {
9486289c 855 rprintf(FERROR,"mktemp %s failed\n",fnametmp);
7b8356d0
AT
856 receive_data(f_in,buf,-1,NULL);
857 if (buf) unmap_file(buf);
858 close(fd1);
859 continue;
c627d613 860 }
31e12522 861 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
fee64929 862 if (fd2 == -1 && relative_paths && errno == ENOENT &&
6574b4f7 863 create_directory_path(fnametmp) == 0) {
31e12522 864 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
6574b4f7 865 }
c627d613 866 if (fd2 == -1) {
9486289c 867 rprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
7b8356d0
AT
868 receive_data(f_in,buf,-1,NULL);
869 if (buf) unmap_file(buf);
870 close(fd1);
871 continue;
c627d613
AT
872 }
873
874 cleanup_fname = fnametmp;
875
876 if (!am_server && verbose)
877 printf("%s\n",fname);
878
879 /* recv file data */
9e31c482 880 recv_ok = receive_data(f_in,buf,fd2,fname);
c627d613 881
3ec4dd97 882 if (buf) unmap_file(buf);
981791bd 883 if (fd1 != -1) {
981791bd
AT
884 close(fd1);
885 }
c627d613
AT
886 close(fd2);
887
888 if (verbose > 2)
9486289c 889 rprintf(FINFO,"renaming %s to %s\n",fnametmp,fname);
c627d613
AT
890
891 if (make_backups) {
892 char fnamebak[MAXPATHLEN];
13a1f792 893 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
9486289c 894 rprintf(FERROR,"backup filename too long\n");
13a1f792
AT
895 continue;
896 }
e42c9458 897 slprintf(fnamebak,sizeof(fnamebak)-1,"%s%s",fname,backup_suffix);
1b2d733a 898 if (do_rename(fname,fnamebak) != 0 && errno != ENOENT) {
9486289c 899 rprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
7b8356d0 900 continue;
c627d613
AT
901 }
902 }
903
904 /* move tmp file over real file */
1b2d733a 905 if (do_rename(fnametmp,fname) != 0) {
950ab32d
AT
906 if (errno == EXDEV) {
907 /* rename failed on cross-filesystem link.
908 Copy the file instead. */
13dc412d 909 if (copy_file(fnametmp,fname, file->mode)) {
9486289c 910 rprintf(FERROR,"copy %s -> %s : %s\n",
950ab32d 911 fnametmp,fname,strerror(errno));
13dc412d
AT
912 } else {
913 set_perms(fname,file,NULL,0);
914 }
31e12522 915 do_unlink(fnametmp);
950ab32d 916 } else {
9486289c 917 rprintf(FERROR,"rename %s -> %s : %s\n",
950ab32d 918 fnametmp,fname,strerror(errno));
31e12522 919 do_unlink(fnametmp);
950ab32d 920 }
13dc412d
AT
921 } else {
922 set_perms(fname,file,NULL,0);
c627d613
AT
923 }
924
925 cleanup_fname = NULL;
926
9e31c482
AT
927
928 if (!recv_ok) {
e7ebc36c 929 if (csum_length == SUM_LENGTH) {
9486289c 930 rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
e7ebc36c
AT
931 fname);
932 } else {
933 if (verbose > 1)
9486289c 934 rprintf(FINFO,"redoing %s(%d)\n",fname,i);
e7ebc36c
AT
935 write_int(f_gen,i);
936 }
9e31c482 937 }
c627d613
AT
938 }
939
7c596906
AT
940 if (preserve_hard_links)
941 do_hard_links(flist);
942
7b8356d0
AT
943 /* now we need to fix any directory permissions that were
944 modified during the transfer */
7c596906 945 for (i = 0; i < flist->count; i++) {
23e43fce 946 file = flist->files[i];
3ec4dd97
AT
947 if (!file->basename || !S_ISDIR(file->mode)) continue;
948 recv_generator(f_name(file),flist,i,-1);
7b8356d0 949 }
7b8356d0 950
c627d613 951 if (verbose > 2)
9486289c 952 rprintf(FINFO,"recv_files finished\n");
c627d613
AT
953
954 return 0;
955}
956
957
958
71c46176 959void send_files(struct file_list *flist,int f_out,int f_in)
c627d613
AT
960{
961 int fd;
962 struct sum_struct *s;
c6e7fcb4 963 struct map_struct *buf;
bcacc18b 964 STRUCT_STAT st;
c627d613 965 char fname[MAXPATHLEN];
c627d613 966 int i;
dc5ddbcc 967 struct file_struct *file;
c6e7fcb4 968 int phase = 0;
7796395a 969 int offset=0;
c627d613
AT
970
971 if (verbose > 2)
9486289c 972 rprintf(FINFO,"send_files starting\n");
c627d613 973
4c36ddbe 974 setup_readbuffer(f_in);
720b47f2 975
e7ebc36c
AT
976 while (1) {
977 i = read_int(f_in);
978 if (i == -1) {
979 if (phase==0 && remote_version >= 13) {
980 phase++;
981 csum_length = SUM_LENGTH;
982 write_int(f_out,-1);
e7ebc36c 983 if (verbose > 2)
9486289c 984 rprintf(FINFO,"send_files phase=%d\n",phase);
e7ebc36c
AT
985 continue;
986 }
987 break;
988 }
c627d613 989
e7ebc36c
AT
990 file = flist->files[i];
991
992 fname[0] = 0;
993 if (file->basedir) {
7a6421fa 994 strlcpy(fname,file->basedir,MAXPATHLEN-1);
e7ebc36c 995 if (strlen(fname) == MAXPATHLEN-1) {
6ba9279f 996 io_error = 1;
9486289c 997 rprintf(FERROR, "send_files failed on long-named directory %s\n",
e7ebc36c 998 fname);
71c46176 999 return;
e7ebc36c 1000 }
e42c9458 1001 strlcat(fname,"/",MAXPATHLEN-1);
7796395a 1002 offset = strlen(file->basedir)+1;
e7ebc36c 1003 }
e42c9458 1004 strlcat(fname,f_name(file),MAXPATHLEN-strlen(fname));
e7ebc36c
AT
1005
1006 if (verbose > 2)
9486289c 1007 rprintf(FINFO,"send_files(%d,%s)\n",i,fname);
e7ebc36c
AT
1008
1009 if (dry_run) {
1010 if (!am_server && verbose)
1011 printf("%s\n",fname);
1012 write_int(f_out,i);
1013 continue;
1014 }
c627d613 1015
e7ebc36c
AT
1016 s = receive_sums(f_in);
1017 if (!s) {
6ba9279f 1018 io_error = 1;
9486289c 1019 rprintf(FERROR,"receive_sums failed\n");
71c46176 1020 return;
e7ebc36c
AT
1021 }
1022
1023 fd = open(fname,O_RDONLY);
1024 if (fd == -1) {
6ba9279f 1025 io_error = 1;
9486289c 1026 rprintf(FERROR,"send_files failed to open %s: %s\n",
e7ebc36c 1027 fname,strerror(errno));
0b910560 1028 free_sums(s);
e7ebc36c
AT
1029 continue;
1030 }
1031
1032 /* map the local file */
bcacc18b 1033 if (do_fstat(fd,&st) != 0) {
6ba9279f 1034 io_error = 1;
9486289c 1035 rprintf(FERROR,"fstat failed : %s\n",strerror(errno));
0b910560 1036 free_sums(s);
e7ebc36c 1037 close(fd);
71c46176 1038 return;
e7ebc36c
AT
1039 }
1040
1041 if (st.st_size > 0) {
1042 buf = map_file(fd,st.st_size);
1043 } else {
1044 buf = NULL;
1045 }
1046
1047 if (verbose > 2)
9486289c 1048 rprintf(FINFO,"send_files mapped %s of size %d\n",
e7ebc36c
AT
1049 fname,(int)st.st_size);
1050
1051 write_int(f_out,i);
1052
1053 write_int(f_out,s->count);
1054 write_int(f_out,s->n);
1055 write_int(f_out,s->remainder);
1056
1057 if (verbose > 2)
9486289c 1058 rprintf(FINFO,"calling match_sums %s\n",fname);
e7ebc36c
AT
1059
1060 if (!am_server && verbose)
7796395a 1061 printf("%s\n",fname+offset);
e7ebc36c
AT
1062
1063 match_sums(f_out,s,buf,st.st_size);
e7ebc36c
AT
1064
1065 if (buf) unmap_file(buf);
1066 close(fd);
1067
1068 free_sums(s);
1069
1070 if (verbose > 2)
9486289c 1071 rprintf(FINFO,"sender finished %s\n",fname);
e7ebc36c 1072 }
c627d613 1073
dc5ddbcc 1074 if (verbose > 2)
9486289c 1075 rprintf(FINFO,"send files finished\n");
dc5ddbcc 1076
c627d613
AT
1077 match_report();
1078
1079 write_int(f_out,-1);
c627d613
AT
1080}
1081
1082
1083
c6e7fcb4 1084void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
c627d613
AT
1085{
1086 int i;
9e31c482 1087 int phase=0;
c627d613
AT
1088
1089 if (verbose > 2)
9486289c 1090 rprintf(FINFO,"generator starting pid=%d count=%d\n",
c627d613
AT
1091 (int)getpid(),flist->count);
1092
1093 for (i = 0; i < flist->count; i++) {
3ec4dd97 1094 struct file_struct *file = flist->files[i];
7b8356d0 1095 mode_t saved_mode = file->mode;
3ec4dd97 1096 if (!file->basename) continue;
7b8356d0
AT
1097
1098 /* we need to ensure that any directories we create have writeable
1099 permissions initially so that we can create the files within
1100 them. This is then fixed after the files are transferred */
1101 if (!am_root && S_ISDIR(file->mode)) {
1102 file->mode |= S_IWUSR; /* user write */
c627d613 1103 }
7b8356d0 1104
3ec4dd97 1105 recv_generator(local_name?local_name:f_name(file),
c627d613 1106 flist,i,f);
7b8356d0
AT
1107
1108 file->mode = saved_mode;
c627d613 1109 }
c6e7fcb4 1110
9e31c482
AT
1111 phase++;
1112 csum_length = SUM_LENGTH;
1113 ignore_times=1;
1114
1115 if (verbose > 2)
9486289c 1116 rprintf(FINFO,"generate_files phase=%d\n",phase);
9e31c482 1117
c627d613 1118 write_int(f,-1);
c6e7fcb4 1119
6ba9279f
AT
1120 /* we expect to just sit around now, so don't exit on a timeout. If we
1121 really get a timeout then the other process should exit */
1122 io_timeout = 0;
1123
c6e7fcb4 1124 if (remote_version >= 13) {
7b8356d0
AT
1125 /* in newer versions of the protocol the files can cycle through
1126 the system more than once to catch initial checksum errors */
c6e7fcb4 1127 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
3ec4dd97
AT
1128 struct file_struct *file = flist->files[i];
1129 recv_generator(local_name?local_name:f_name(file),
c6e7fcb4
AT
1130 flist,i,f);
1131 }
1132
9e31c482
AT
1133 phase++;
1134 if (verbose > 2)
9486289c 1135 rprintf(FINFO,"generate_files phase=%d\n",phase);
9e31c482 1136
c6e7fcb4 1137 write_int(f,-1);
c6e7fcb4
AT
1138 }
1139
1140
c627d613 1141 if (verbose > 2)
9486289c 1142 rprintf(FINFO,"generator wrote %ld\n",(long)write_total());
c627d613 1143}
dc5ddbcc
AT
1144
1145