allow the specification of multiple filenames (with or without
[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;
7a6421fa 114 strlcpy(buf, fname, (MAXPATHLEN-strlen(dname))-2);
3cb6f5d6 115 strcat(buf, "/");
d6e6ecbd 116 strcat(buf, dname);
3cb6f5d6
AT
117 buf[MAXPATHLEN-1] = 0;
118 if (verbose > 0)
9486289c 119 rprintf(FINFO,"deleting %s\n", buf);
3cb6f5d6
AT
120 if (delete_file(buf) != 0) {
121 closedir(d);
122 return -1;
123 }
124 }
125
126 closedir(d);
127
128 if (do_rmdir(fname) != 0) {
9486289c 129 rprintf(FERROR,"rmdir(%s) : %s\n", fname, strerror(errno));
3cb6f5d6
AT
130 return -1;
131 }
132
133 return 0;
134}
c627d613
AT
135
136/*
137 send a sums struct down a fd
138 */
139static void send_sums(struct sum_struct *s,int f_out)
140{
141 int i;
142
143 /* tell the other guy how many we are going to be doing and how many
144 bytes there are in the last chunk */
145 write_int(f_out,s?s->count:0);
146 write_int(f_out,s?s->n:block_size);
147 write_int(f_out,s?s->remainder:0);
148 if (s)
149 for (i=0;i<s->count;i++) {
150 write_int(f_out,s->sums[i].sum1);
43a481dc 151 write_buf(f_out,s->sums[i].sum2,csum_length);
c627d613
AT
152 }
153 write_flush(f_out);
154}
155
156
157/*
158 generate a stream of signatures/checksums that describe a buffer
159
160 generate approximately one checksum every n bytes
161 */
bcacc18b 162static struct sum_struct *generate_sums(struct map_struct *buf,OFF_T len,int n)
c627d613
AT
163{
164 int i;
165 struct sum_struct *s;
166 int count;
167 int block_len = n;
168 int remainder = (len%block_len);
bcacc18b 169 OFF_T offset = 0;
c627d613
AT
170
171 count = (len+(block_len-1))/block_len;
172
173 s = (struct sum_struct *)malloc(sizeof(*s));
174 if (!s) out_of_memory("generate_sums");
175
176 s->count = count;
177 s->remainder = remainder;
178 s->n = n;
179 s->flength = len;
180
181 if (count==0) {
182 s->sums = NULL;
183 return s;
184 }
185
186 if (verbose > 3)
9486289c 187 rprintf(FINFO,"count=%d rem=%d n=%d flength=%d\n",
c627d613
AT
188 s->count,s->remainder,s->n,(int)s->flength);
189
190 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
191 if (!s->sums) out_of_memory("generate_sums");
192
193 for (i=0;i<count;i++) {
194 int n1 = MIN(len,n);
d9bea2dd 195 char *map = map_ptr(buf,offset,n1);
c627d613 196
d9bea2dd
AT
197 s->sums[i].sum1 = get_checksum1(map,n1);
198 get_checksum2(map,n1,s->sums[i].sum2);
c627d613
AT
199
200 s->sums[i].offset = offset;
201 s->sums[i].len = n1;
202 s->sums[i].i = i;
203
204 if (verbose > 3)
9486289c 205 rprintf(FINFO,"chunk[%d] offset=%d len=%d sum1=%08x\n",
c627d613
AT
206 i,(int)s->sums[i].offset,s->sums[i].len,s->sums[i].sum1);
207
208 len -= n1;
c627d613
AT
209 offset += n1;
210 }
211
212 return s;
213}
214
215
216/*
217 receive the checksums for a buffer
218 */
219static struct sum_struct *receive_sums(int f)
220{
221 struct sum_struct *s;
222 int i;
bcacc18b 223 OFF_T offset = 0;
c627d613
AT
224
225 s = (struct sum_struct *)malloc(sizeof(*s));
226 if (!s) out_of_memory("receive_sums");
227
228 s->count = read_int(f);
229 s->n = read_int(f);
230 s->remainder = read_int(f);
231 s->sums = NULL;
232
233 if (verbose > 3)
9486289c 234 rprintf(FINFO,"count=%d n=%d rem=%d\n",
c627d613
AT
235 s->count,s->n,s->remainder);
236
c627d613
AT
237 if (s->count == 0)
238 return(s);
239
240 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
241 if (!s->sums) out_of_memory("receive_sums");
242
243 for (i=0;i<s->count;i++) {
244 s->sums[i].sum1 = read_int(f);
43a481dc 245 read_buf(f,s->sums[i].sum2,csum_length);
c627d613
AT
246
247 s->sums[i].offset = offset;
248 s->sums[i].i = i;
249
250 if (i == s->count-1 && s->remainder != 0) {
251 s->sums[i].len = s->remainder;
252 } else {
253 s->sums[i].len = s->n;
254 }
255 offset += s->sums[i].len;
256
257 if (verbose > 3)
9486289c 258 rprintf(FINFO,"chunk[%d] len=%d offset=%d sum1=%08x\n",
c627d613
AT
259 i,s->sums[i].len,(int)s->sums[i].offset,s->sums[i].sum1);
260 }
261
262 s->flength = offset;
263
264 return s;
265}
266
267
bcacc18b 268static int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st,
7b8356d0 269 int report)
c627d613
AT
270{
271 int updated = 0;
bcacc18b 272 STRUCT_STAT st2;
c627d613 273
7b8356d0 274 if (dry_run) return 0;
c627d613
AT
275
276 if (!st) {
82306bf6 277 if (link_stat(fname,&st2) != 0) {
9486289c 278 rprintf(FERROR,"stat %s : %s\n",fname,strerror(errno));
7b8356d0 279 return 0;
c627d613
AT
280 }
281 st = &st2;
282 }
283
7bec6a5c
AT
284 if (preserve_times && !S_ISLNK(st->st_mode) &&
285 st->st_mtime != file->modtime) {
c627d613
AT
286 updated = 1;
287 if (set_modtime(fname,file->modtime) != 0) {
9486289c 288 rprintf(FERROR,"failed to set times on %s : %s\n",
c627d613 289 fname,strerror(errno));
7b8356d0 290 return 0;
c627d613
AT
291 }
292 }
293
294#ifdef HAVE_CHMOD
7bec6a5c
AT
295 if (preserve_perms && !S_ISLNK(st->st_mode) &&
296 st->st_mode != file->mode) {
c627d613 297 updated = 1;
7308bd66 298 if (do_chmod(fname,file->mode) != 0) {
9486289c 299 rprintf(FERROR,"failed to set permissions on %s : %s\n",
c627d613 300 fname,strerror(errno));
7b8356d0 301 return 0;
c627d613
AT
302 }
303 }
304#endif
305
7b8356d0 306 if ((am_root && preserve_uid && st->st_uid != file->uid) ||
c627d613 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);
532 write_flush(f_out);
533
534 close(fd);
1cdc8b50 535 if (buf) unmap_file(buf);
c627d613
AT
536
537 free_sums(s);
538}
539
540
541
9e31c482 542static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname)
c627d613
AT
543{
544 int i,n,remainder,len,count;
bcacc18b
AT
545 OFF_T offset = 0;
546 OFF_T offset2;
70d794dc 547 char *data;
ebb0a6f6
AT
548 static char file_sum1[MD4_SUM_LENGTH];
549 static char file_sum2[MD4_SUM_LENGTH];
9e31c482 550 char *map=NULL;
c627d613
AT
551
552 count = read_int(f_in);
553 n = read_int(f_in);
554 remainder = read_int(f_in);
555
9e31c482
AT
556 sum_init();
557
70d794dc 558 for (i=recv_token(f_in,&data); i != 0; i=recv_token(f_in,&data)) {
c627d613
AT
559 if (i > 0) {
560 if (verbose > 3)
9486289c 561 rprintf(FINFO,"data recv %d at %d\n",i,(int)offset);
c627d613 562
9e31c482
AT
563 sum_update(data,i);
564
d867229b 565 if (fd != -1 && write_file(fd,data,i) != i) {
9486289c 566 rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
34ccb63e 567 exit_cleanup(1);
c627d613
AT
568 }
569 offset += i;
570 } else {
571 i = -(i+1);
572 offset2 = i*n;
573 len = n;
574 if (i == count-1 && remainder != 0)
575 len = remainder;
576
577 if (verbose > 3)
9486289c 578 rprintf(FINFO,"chunk[%d] of size %d at %d offset=%d\n",
c627d613
AT
579 i,len,(int)offset2,(int)offset);
580
9e31c482
AT
581 map = map_ptr(buf,offset2,len);
582
861c20b4 583 see_token(map, len);
9e31c482
AT
584 sum_update(map,len);
585
d867229b 586 if (fd != -1 && write_file(fd,map,len) != len) {
9486289c 587 rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
34ccb63e 588 exit_cleanup(1);
c627d613
AT
589 }
590 offset += len;
591 }
592 }
7bec6a5c 593
7b8356d0 594 if (fd != -1 && offset > 0 && sparse_end(fd) != 0) {
9486289c 595 rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
34ccb63e 596 exit_cleanup(1);
7bec6a5c 597 }
9e31c482
AT
598
599 sum_end(file_sum1);
600
601 if (remote_version >= 14) {
ebb0a6f6 602 read_buf(f_in,file_sum2,MD4_SUM_LENGTH);
9e31c482 603 if (verbose > 2)
9486289c 604 rprintf(FINFO,"got file_sum\n");
7b8356d0 605 if (fd != -1 && memcmp(file_sum1,file_sum2,MD4_SUM_LENGTH) != 0)
9e31c482
AT
606 return 0;
607 }
608 return 1;
c627d613
AT
609}
610
611
612static void delete_one(struct file_struct *f)
613{
614 if (!S_ISDIR(f->mode)) {
31e12522 615 if (do_unlink(f_name(f)) != 0) {
9486289c 616 rprintf(FERROR,"unlink %s : %s\n",f_name(f),strerror(errno));
c627d613 617 } else if (verbose) {
9486289c 618 rprintf(FINFO,"deleting %s\n",f_name(f));
c627d613
AT
619 }
620 } else {
31e12522 621 if (do_rmdir(f_name(f)) != 0) {
98ae8c3e 622 if (errno != ENOTEMPTY && errno != EEXIST)
9486289c 623 rprintf(FERROR,"rmdir %s : %s\n",f_name(f),strerror(errno));
c627d613 624 } else if (verbose) {
9486289c 625 rprintf(FINFO,"deleting directory %s\n",f_name(f));
c627d613
AT
626 }
627 }
628}
629
630
3b3a2fbc 631
3333ffbd
AT
632static struct delete_list {
633 dev_t dev;
634 ino_t inode;
635} *delete_list;
636static int dlist_len, dlist_alloc_len;
3b3a2fbc 637
3333ffbd
AT
638static void add_delete_entry(struct file_struct *file)
639{
640 if (dlist_len == dlist_alloc_len) {
641 dlist_alloc_len += 1024;
642 if (!delete_list) {
643 delete_list = (struct delete_list *)malloc(sizeof(delete_list[0])*dlist_alloc_len);
644 } else {
645 delete_list = (struct delete_list *)realloc(delete_list, sizeof(delete_list[0])*dlist_alloc_len);
646 }
647 if (!delete_list) out_of_memory("add_delete_entry");
3b3a2fbc
AT
648 }
649
3333ffbd
AT
650 delete_list[dlist_len].dev = file->dev;
651 delete_list[dlist_len].inode = file->inode;
652 dlist_len++;
0a25de67 653
3333ffbd 654 if (verbose > 3)
9486289c 655 rprintf(FINFO,"added %s to delete list\n", f_name(file));
3333ffbd 656}
0a25de67 657
3333ffbd
AT
658/* yuck! This function wouldn't have been necessary if I had the sorting
659 algorithm right. Unfortunately fixing the sorting algorithm would introduce
660 a backward incompatibility as file list indexes are sent over the link.
661*/
662static int delete_already_done(struct file_list *flist,int j)
663{
664 int i;
bcacc18b 665 STRUCT_STAT st;
3b3a2fbc 666
3333ffbd 667 if (link_stat(f_name(flist->files[j]), &st)) return 1;
3b3a2fbc 668
3333ffbd
AT
669 for (i=0;i<dlist_len;i++) {
670 if (st.st_ino == delete_list[i].inode &&
671 st.st_dev == delete_list[i].dev)
672 return 1;
3b3a2fbc
AT
673 }
674
3b3a2fbc
AT
675 return 0;
676}
677
678
e92338c8
AT
679/* this deletes any files on the receiving side that are not present
680 on the sending side. For version 1.6.4 I have changed the behaviour
681 to match more closely what most people seem to expect of this option */
c627d613
AT
682static void delete_files(struct file_list *flist)
683{
3333ffbd
AT
684 struct file_list *local_file_list;
685 int i, j;
686 char *name;
4fe159a8 687
3333ffbd
AT
688 if (cvs_exclude)
689 add_cvs_excludes();
6ba9279f 690
3333ffbd 691 if (io_error) {
9486289c 692 rprintf(FINFO,"IO error encountered - skipping file deletion\n");
3333ffbd
AT
693 return;
694 }
3b3a2fbc 695
3333ffbd
AT
696 for (j=0;j<flist->count;j++) {
697 if (!S_ISDIR(flist->files[j]->mode) ||
698 !(flist->files[j]->flags & FLAG_DELETE)) continue;
3b3a2fbc 699
3333ffbd 700 if (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;
714 if (S_ISDIR(local_file_list->files[i]->mode))
715 add_delete_entry(local_file_list->files[i]);
716 if (-1 == flist_find(flist,local_file_list->files[i])) {
717 delete_one(local_file_list->files[i]);
718 }
719 }
720 flist_free(local_file_list);
721 free(name);
722 }
c627d613
AT
723}
724
3a6a366f 725static char *cleanup_fname;
c627d613 726
34ccb63e 727void exit_cleanup(int code)
c627d613 728{
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
AT
773 write_int(f_gen,-1);
774 write_flush(f_gen);
775 continue;
776 }
777 break;
778 }
c627d613 779
3ec4dd97
AT
780 file = flist->files[i];
781 fname = f_name(file);
c627d613
AT
782
783 if (local_name)
784 fname = local_name;
785
786 if (dry_run) {
787 if (!am_server && verbose)
788 printf("%s\n",fname);
789 continue;
790 }
791
792 if (verbose > 2)
9486289c 793 rprintf(FINFO,"recv_files(%s)\n",fname);
c627d613
AT
794
795 /* open the file */
ac1eb754 796 fd1 = open(fname,O_RDONLY);
c627d613 797
bcacc18b 798 if (fd1 != -1 && do_fstat(fd1,&st) != 0) {
9486289c 799 rprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
7b8356d0 800 receive_data(f_in,NULL,-1,NULL);
c627d613 801 close(fd1);
7b8356d0 802 continue;
c627d613
AT
803 }
804
ac1eb754 805 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
9486289c 806 rprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
7b8356d0 807 receive_data(f_in,NULL,-1,NULL);
c627d613 808 close(fd1);
7b8356d0 809 continue;
c627d613
AT
810 }
811
ac1eb754 812 if (fd1 != -1 && st.st_size > 0) {
c627d613 813 buf = map_file(fd1,st.st_size);
9e31c482 814 if (verbose > 2)
9486289c 815 rprintf(FINFO,"recv mapped %s of size %d\n",fname,(int)st.st_size);
c627d613
AT
816 } else {
817 buf = NULL;
818 }
819
c627d613 820 /* open tmp file */
950ab32d
AT
821 if (tmpdir) {
822 char *f;
823 f = strrchr(fname,'/');
824 if (f == NULL)
825 f = fname;
826 else
827 f++;
d4ebe7a7
AT
828 if (strlen(tmpdir)+strlen(f)+10 > MAXPATHLEN) {
829 rprintf(FERROR,"filename too long\n");
830 if (buf) unmap_file(buf);
831 close(fd1);
832 continue;
833 }
834 sprintf(fnametmp,"%s/.%s.XXXXXX",tmpdir,f);
950ab32d 835 } else {
eb697c99
AT
836 char *f = strrchr(fname,'/');
837
d4ebe7a7
AT
838 if (strlen(fname)+9 > MAXPATHLEN) {
839 rprintf(FERROR,"filename too long\n");
840 if (buf) unmap_file(buf);
841 close(fd1);
842 continue;
843 }
844
eb697c99
AT
845 if (f) {
846 *f = 0;
847 sprintf(fnametmp,"%s/.%s.XXXXXX",fname,f+1);
848 *f = '/';
849 } else {
850 sprintf(fnametmp,".%s.XXXXXX",fname);
851 }
950ab32d 852 }
1b2d733a 853 if (NULL == do_mktemp(fnametmp)) {
9486289c 854 rprintf(FERROR,"mktemp %s failed\n",fnametmp);
7b8356d0
AT
855 receive_data(f_in,buf,-1,NULL);
856 if (buf) unmap_file(buf);
857 close(fd1);
858 continue;
c627d613 859 }
31e12522 860 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
fee64929 861 if (fd2 == -1 && relative_paths && errno == ENOENT &&
6574b4f7 862 create_directory_path(fnametmp) == 0) {
31e12522 863 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
6574b4f7 864 }
c627d613 865 if (fd2 == -1) {
9486289c 866 rprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
7b8356d0
AT
867 receive_data(f_in,buf,-1,NULL);
868 if (buf) unmap_file(buf);
869 close(fd1);
870 continue;
c627d613
AT
871 }
872
873 cleanup_fname = fnametmp;
874
875 if (!am_server && verbose)
876 printf("%s\n",fname);
877
878 /* recv file data */
9e31c482 879 recv_ok = receive_data(f_in,buf,fd2,fname);
c627d613 880
3ec4dd97 881 if (buf) unmap_file(buf);
981791bd 882 if (fd1 != -1) {
981791bd
AT
883 close(fd1);
884 }
c627d613
AT
885 close(fd2);
886
887 if (verbose > 2)
9486289c 888 rprintf(FINFO,"renaming %s to %s\n",fnametmp,fname);
c627d613
AT
889
890 if (make_backups) {
891 char fnamebak[MAXPATHLEN];
13a1f792 892 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
9486289c 893 rprintf(FERROR,"backup filename too long\n");
13a1f792
AT
894 continue;
895 }
c627d613 896 sprintf(fnamebak,"%s%s",fname,backup_suffix);
1b2d733a 897 if (do_rename(fname,fnamebak) != 0 && errno != ENOENT) {
9486289c 898 rprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
7b8356d0 899 continue;
c627d613
AT
900 }
901 }
902
903 /* move tmp file over real file */
1b2d733a 904 if (do_rename(fnametmp,fname) != 0) {
950ab32d
AT
905 if (errno == EXDEV) {
906 /* rename failed on cross-filesystem link.
907 Copy the file instead. */
13dc412d 908 if (copy_file(fnametmp,fname, file->mode)) {
9486289c 909 rprintf(FERROR,"copy %s -> %s : %s\n",
950ab32d 910 fnametmp,fname,strerror(errno));
13dc412d
AT
911 } else {
912 set_perms(fname,file,NULL,0);
913 }
31e12522 914 do_unlink(fnametmp);
950ab32d 915 } else {
9486289c 916 rprintf(FERROR,"rename %s -> %s : %s\n",
950ab32d 917 fnametmp,fname,strerror(errno));
31e12522 918 do_unlink(fnametmp);
950ab32d 919 }
13dc412d
AT
920 } else {
921 set_perms(fname,file,NULL,0);
c627d613
AT
922 }
923
924 cleanup_fname = NULL;
925
9e31c482
AT
926
927 if (!recv_ok) {
e7ebc36c 928 if (csum_length == SUM_LENGTH) {
9486289c 929 rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
e7ebc36c
AT
930 fname);
931 } else {
932 if (verbose > 1)
9486289c 933 rprintf(FINFO,"redoing %s(%d)\n",fname,i);
e7ebc36c
AT
934 write_int(f_gen,i);
935 }
9e31c482 936 }
c627d613
AT
937 }
938
7c596906
AT
939 if (preserve_hard_links)
940 do_hard_links(flist);
941
7b8356d0
AT
942 /* now we need to fix any directory permissions that were
943 modified during the transfer */
7c596906 944 for (i = 0; i < flist->count; i++) {
3ec4dd97
AT
945 struct file_struct *file = flist->files[i];
946 if (!file->basename || !S_ISDIR(file->mode)) continue;
947 recv_generator(f_name(file),flist,i,-1);
7b8356d0 948 }
7b8356d0 949
c627d613 950 if (verbose > 2)
9486289c 951 rprintf(FINFO,"recv_files finished\n");
c627d613
AT
952
953 return 0;
954}
955
956
957
71c46176 958void send_files(struct file_list *flist,int f_out,int f_in)
c627d613
AT
959{
960 int fd;
961 struct sum_struct *s;
c6e7fcb4 962 struct map_struct *buf;
bcacc18b 963 STRUCT_STAT st;
c627d613 964 char fname[MAXPATHLEN];
c627d613 965 int i;
dc5ddbcc 966 struct file_struct *file;
c6e7fcb4 967 int phase = 0;
7796395a 968 int offset=0;
c627d613
AT
969
970 if (verbose > 2)
9486289c 971 rprintf(FINFO,"send_files starting\n");
c627d613 972
720b47f2
AT
973 setup_nonblocking(f_in,f_out);
974
e7ebc36c
AT
975 while (1) {
976 i = read_int(f_in);
977 if (i == -1) {
978 if (phase==0 && remote_version >= 13) {
979 phase++;
980 csum_length = SUM_LENGTH;
981 write_int(f_out,-1);
982 write_flush(f_out);
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
AT
1000 }
1001 strcat(fname,"/");
7796395a 1002 offset = strlen(file->basedir)+1;
e7ebc36c
AT
1003 }
1004 strncat(fname,f_name(file),MAXPATHLEN-strlen(fname));
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);
1064 write_flush(f_out);
1065
1066 if (buf) unmap_file(buf);
1067 close(fd);
1068
1069 free_sums(s);
1070
1071 if (verbose > 2)
9486289c 1072 rprintf(FINFO,"sender finished %s\n",fname);
e7ebc36c 1073 }
c627d613 1074
dc5ddbcc 1075 if (verbose > 2)
9486289c 1076 rprintf(FINFO,"send files finished\n");
dc5ddbcc 1077
c627d613
AT
1078 match_report();
1079
1080 write_int(f_out,-1);
1081 write_flush(f_out);
c627d613
AT
1082}
1083
1084
1085
c6e7fcb4 1086void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
c627d613
AT
1087{
1088 int i;
9e31c482 1089 int phase=0;
c627d613
AT
1090
1091 if (verbose > 2)
9486289c 1092 rprintf(FINFO,"generator starting pid=%d count=%d\n",
c627d613
AT
1093 (int)getpid(),flist->count);
1094
1095 for (i = 0; i < flist->count; i++) {
3ec4dd97 1096 struct file_struct *file = flist->files[i];
7b8356d0 1097 mode_t saved_mode = file->mode;
3ec4dd97 1098 if (!file->basename) continue;
7b8356d0
AT
1099
1100 /* we need to ensure that any directories we create have writeable
1101 permissions initially so that we can create the files within
1102 them. This is then fixed after the files are transferred */
1103 if (!am_root && S_ISDIR(file->mode)) {
1104 file->mode |= S_IWUSR; /* user write */
c627d613 1105 }
7b8356d0 1106
3ec4dd97 1107 recv_generator(local_name?local_name:f_name(file),
c627d613 1108 flist,i,f);
7b8356d0
AT
1109
1110 file->mode = saved_mode;
c627d613 1111 }
c6e7fcb4 1112
9e31c482
AT
1113 phase++;
1114 csum_length = SUM_LENGTH;
1115 ignore_times=1;
1116
1117 if (verbose > 2)
9486289c 1118 rprintf(FINFO,"generate_files phase=%d\n",phase);
9e31c482 1119
c627d613
AT
1120 write_int(f,-1);
1121 write_flush(f);
c6e7fcb4 1122
6ba9279f
AT
1123 /* we expect to just sit around now, so don't exit on a timeout. If we
1124 really get a timeout then the other process should exit */
1125 io_timeout = 0;
1126
c6e7fcb4 1127 if (remote_version >= 13) {
7b8356d0
AT
1128 /* in newer versions of the protocol the files can cycle through
1129 the system more than once to catch initial checksum errors */
c6e7fcb4 1130 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
3ec4dd97
AT
1131 struct file_struct *file = flist->files[i];
1132 recv_generator(local_name?local_name:f_name(file),
c6e7fcb4
AT
1133 flist,i,f);
1134 }
1135
9e31c482
AT
1136 phase++;
1137 if (verbose > 2)
9486289c 1138 rprintf(FINFO,"generate_files phase=%d\n",phase);
9e31c482 1139
c6e7fcb4
AT
1140 write_int(f,-1);
1141 write_flush(f);
1142 }
1143
1144
c627d613 1145 if (verbose > 2)
9486289c 1146 rprintf(FINFO,"generator wrote %ld\n",(long)write_total());
c627d613 1147}
dc5ddbcc
AT
1148
1149