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