started to add some 64 bit file offset support - not complete yet
[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;
c627d613
AT
52
53/*
54 free a sums struct
55 */
56static void free_sums(struct sum_struct *s)
57{
58 if (s->sums) free(s->sums);
59 free(s);
60}
61
62
63
64/*
65 send a sums struct down a fd
66 */
67static void send_sums(struct sum_struct *s,int f_out)
68{
69 int i;
70
71 /* tell the other guy how many we are going to be doing and how many
72 bytes there are in the last chunk */
73 write_int(f_out,s?s->count:0);
74 write_int(f_out,s?s->n:block_size);
75 write_int(f_out,s?s->remainder:0);
76 if (s)
77 for (i=0;i<s->count;i++) {
78 write_int(f_out,s->sums[i].sum1);
43a481dc 79 write_buf(f_out,s->sums[i].sum2,csum_length);
c627d613
AT
80 }
81 write_flush(f_out);
82}
83
84
85/*
86 generate a stream of signatures/checksums that describe a buffer
87
88 generate approximately one checksum every n bytes
89 */
c6e7fcb4 90static struct sum_struct *generate_sums(struct map_struct *buf,off_t len,int n)
c627d613
AT
91{
92 int i;
93 struct sum_struct *s;
94 int count;
95 int block_len = n;
96 int remainder = (len%block_len);
97 off_t offset = 0;
98
99 count = (len+(block_len-1))/block_len;
100
101 s = (struct sum_struct *)malloc(sizeof(*s));
102 if (!s) out_of_memory("generate_sums");
103
104 s->count = count;
105 s->remainder = remainder;
106 s->n = n;
107 s->flength = len;
108
109 if (count==0) {
110 s->sums = NULL;
111 return s;
112 }
113
114 if (verbose > 3)
dc5ddbcc 115 fprintf(FERROR,"count=%d rem=%d n=%d flength=%d\n",
c627d613
AT
116 s->count,s->remainder,s->n,(int)s->flength);
117
118 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
119 if (!s->sums) out_of_memory("generate_sums");
120
121 for (i=0;i<count;i++) {
122 int n1 = MIN(len,n);
d9bea2dd 123 char *map = map_ptr(buf,offset,n1);
c627d613 124
d9bea2dd
AT
125 s->sums[i].sum1 = get_checksum1(map,n1);
126 get_checksum2(map,n1,s->sums[i].sum2);
c627d613
AT
127
128 s->sums[i].offset = offset;
129 s->sums[i].len = n1;
130 s->sums[i].i = i;
131
132 if (verbose > 3)
dc5ddbcc 133 fprintf(FERROR,"chunk[%d] offset=%d len=%d sum1=%08x\n",
c627d613
AT
134 i,(int)s->sums[i].offset,s->sums[i].len,s->sums[i].sum1);
135
136 len -= n1;
c627d613
AT
137 offset += n1;
138 }
139
140 return s;
141}
142
143
144/*
145 receive the checksums for a buffer
146 */
147static struct sum_struct *receive_sums(int f)
148{
149 struct sum_struct *s;
150 int i;
151 off_t offset = 0;
c627d613
AT
152
153 s = (struct sum_struct *)malloc(sizeof(*s));
154 if (!s) out_of_memory("receive_sums");
155
156 s->count = read_int(f);
157 s->n = read_int(f);
158 s->remainder = read_int(f);
159 s->sums = NULL;
160
161 if (verbose > 3)
dc5ddbcc 162 fprintf(FERROR,"count=%d n=%d rem=%d\n",
c627d613
AT
163 s->count,s->n,s->remainder);
164
c627d613
AT
165 if (s->count == 0)
166 return(s);
167
168 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
169 if (!s->sums) out_of_memory("receive_sums");
170
171 for (i=0;i<s->count;i++) {
172 s->sums[i].sum1 = read_int(f);
43a481dc 173 read_buf(f,s->sums[i].sum2,csum_length);
c627d613
AT
174
175 s->sums[i].offset = offset;
176 s->sums[i].i = i;
177
178 if (i == s->count-1 && s->remainder != 0) {
179 s->sums[i].len = s->remainder;
180 } else {
181 s->sums[i].len = s->n;
182 }
183 offset += s->sums[i].len;
184
185 if (verbose > 3)
dc5ddbcc 186 fprintf(FERROR,"chunk[%d] len=%d offset=%d sum1=%08x\n",
c627d613
AT
187 i,s->sums[i].len,(int)s->sums[i].offset,s->sums[i].sum1);
188 }
189
190 s->flength = offset;
191
192 return s;
193}
194
195
7b8356d0
AT
196static int set_perms(char *fname,struct file_struct *file,struct stat *st,
197 int report)
c627d613
AT
198{
199 int updated = 0;
200 struct stat st2;
201
7b8356d0 202 if (dry_run) return 0;
c627d613
AT
203
204 if (!st) {
82306bf6 205 if (link_stat(fname,&st2) != 0) {
dc5ddbcc 206 fprintf(FERROR,"stat %s : %s\n",fname,strerror(errno));
7b8356d0 207 return 0;
c627d613
AT
208 }
209 st = &st2;
210 }
211
7bec6a5c
AT
212 if (preserve_times && !S_ISLNK(st->st_mode) &&
213 st->st_mtime != file->modtime) {
c627d613
AT
214 updated = 1;
215 if (set_modtime(fname,file->modtime) != 0) {
dc5ddbcc 216 fprintf(FERROR,"failed to set times on %s : %s\n",
c627d613 217 fname,strerror(errno));
7b8356d0 218 return 0;
c627d613
AT
219 }
220 }
221
222#ifdef HAVE_CHMOD
7bec6a5c
AT
223 if (preserve_perms && !S_ISLNK(st->st_mode) &&
224 st->st_mode != file->mode) {
c627d613
AT
225 updated = 1;
226 if (chmod(fname,file->mode) != 0) {
dc5ddbcc 227 fprintf(FERROR,"failed to set permissions on %s : %s\n",
c627d613 228 fname,strerror(errno));
7b8356d0 229 return 0;
c627d613
AT
230 }
231 }
232#endif
233
7b8356d0 234 if ((am_root && preserve_uid && st->st_uid != file->uid) ||
c627d613
AT
235 (preserve_gid && st->st_gid != file->gid)) {
236 updated = 1;
8bf73749
AT
237 if (lchown(fname,
238 (am_root&&preserve_uid)?file->uid:-1,
239 preserve_gid?file->gid:-1) != 0) {
c627d613 240 if (verbose>1 || preserve_uid)
dc5ddbcc 241 fprintf(FERROR,"chown %s : %s\n",fname,strerror(errno));
7b8356d0 242 return updated;
c627d613
AT
243 }
244 }
245
246 if (verbose > 1 && report) {
247 if (updated)
dc5ddbcc 248 fprintf(FINFO,"%s\n",fname);
c627d613 249 else
dc5ddbcc 250 fprintf(FINFO,"%s is uptodate\n",fname);
c627d613 251 }
7b8356d0 252 return updated;
c627d613
AT
253}
254
255
964ca2ec
AT
256/* choose whether to skip a particular file */
257static int skip_file(char *fname,
258 struct file_struct *file, struct stat *st)
259{
260 if (st->st_size != file->length) {
261 return 0;
262 }
263
264 /* if always checksum is set then we use the checksum instead
265 of the file time to determine whether to sync */
266 if (always_checksum && S_ISREG(st->st_mode)) {
267 char sum[MD4_SUM_LENGTH];
268 file_checksum(fname,sum,st->st_size);
269 return (memcmp(sum,file->sum,csum_length) == 0);
270 }
271
272 if (ignore_times) {
273 return 0;
274 }
275
276 return (st->st_mtime == file->modtime);
277}
278
279
3ba62a83
AT
280/* use a larger block size for really big files */
281int adapt_block_size(struct file_struct *file, int bsize)
282{
283 int ret = file->length / (10000); /* rough heuristic */
284 ret = ret & ~15; /* multiple of 16 */
285 if (ret < bsize) ret = bsize;
1aa71c8d 286 if (ret > CHUNK_SIZE/2) ret = CHUNK_SIZE/2;
3ba62a83
AT
287 return ret;
288}
289
c627d613
AT
290void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
291{
292 int fd;
293 struct stat st;
c6e7fcb4 294 struct map_struct *buf;
c627d613 295 struct sum_struct *s;
c627d613 296 int statret;
3ec4dd97 297 struct file_struct *file = flist->files[i];
c627d613
AT
298
299 if (verbose > 2)
9e31c482 300 fprintf(FERROR,"recv_generator(%s,%d)\n",fname,i);
c627d613 301
82306bf6 302 statret = link_stat(fname,&st);
c627d613 303
7b8356d0
AT
304 if (S_ISDIR(file->mode)) {
305 if (dry_run) return;
306 if (statret == 0 && !S_ISDIR(st.st_mode)) {
307 if (unlink(fname) != 0) {
308 fprintf(FERROR,"unlink %s : %s\n",fname,strerror(errno));
309 return;
310 }
311 statret = -1;
312 }
6574b4f7
AT
313 if (statret != 0 && mkdir(fname,file->mode) != 0 && errno != EEXIST) {
314 if (!(relative_paths && errno==ENOENT &&
315 create_directory_path(fname)==0 &&
316 mkdir(fname,file->mode)==0)) {
317 fprintf(FERROR,"mkdir %s : %s (2)\n",
318 fname,strerror(errno));
319 }
320 }
7b8356d0
AT
321 if (set_perms(fname,file,NULL,0) && verbose)
322 fprintf(FINFO,"%s/\n",fname);
323 return;
324 }
325
dc5ddbcc 326 if (preserve_links && S_ISLNK(file->mode)) {
cbbe4892 327#if SUPPORT_LINKS
c627d613
AT
328 char lnk[MAXPATHLEN];
329 int l;
330 if (statret == 0) {
331 l = readlink(fname,lnk,MAXPATHLEN-1);
332 if (l > 0) {
333 lnk[l] = 0;
dc5ddbcc
AT
334 if (strcmp(lnk,file->link) == 0) {
335 set_perms(fname,file,&st,1);
c627d613
AT
336 return;
337 }
338 }
339 }
340 if (!dry_run) unlink(fname);
dc5ddbcc
AT
341 if (!dry_run && symlink(file->link,fname) != 0) {
342 fprintf(FERROR,"link %s -> %s : %s\n",
343 fname,file->link,strerror(errno));
c627d613 344 } else {
dc5ddbcc 345 set_perms(fname,file,NULL,0);
c627d613 346 if (verbose)
dc5ddbcc
AT
347 fprintf(FINFO,"%s -> %s\n",
348 fname,file->link);
c627d613 349 }
cbbe4892 350#endif
c627d613
AT
351 return;
352 }
c627d613
AT
353
354#ifdef HAVE_MKNOD
7b8356d0 355 if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
c627d613 356 if (statret != 0 ||
dc5ddbcc
AT
357 st.st_mode != file->mode ||
358 st.st_rdev != file->rdev) {
c627d613
AT
359 if (!dry_run) unlink(fname);
360 if (verbose > 2)
dc5ddbcc
AT
361 fprintf(FERROR,"mknod(%s,0%o,0x%x)\n",
362 fname,(int)file->mode,(int)file->rdev);
c627d613 363 if (!dry_run &&
dc5ddbcc
AT
364 mknod(fname,file->mode,file->rdev) != 0) {
365 fprintf(FERROR,"mknod %s : %s\n",fname,strerror(errno));
c627d613 366 } else {
dc5ddbcc 367 set_perms(fname,file,NULL,0);
c627d613 368 if (verbose)
dc5ddbcc 369 fprintf(FINFO,"%s\n",fname);
c627d613
AT
370 }
371 } else {
dc5ddbcc 372 set_perms(fname,file,&st,1);
c627d613
AT
373 }
374 return;
375 }
376#endif
377
dc5ddbcc
AT
378 if (preserve_hard_links && check_hard_link(file)) {
379 if (verbose > 1)
3ec4dd97 380 fprintf(FINFO,"%s is a hard link\n",f_name(file));
dc5ddbcc
AT
381 return;
382 }
383
384 if (!S_ISREG(file->mode)) {
385 fprintf(FERROR,"skipping non-regular file %s\n",fname);
c627d613
AT
386 return;
387 }
388
389 if (statret == -1) {
390 if (errno == ENOENT) {
391 write_int(f_out,i);
392 if (!dry_run) send_sums(NULL,f_out);
393 } else {
394 if (verbose > 1)
dc5ddbcc 395 fprintf(FERROR,"recv_generator failed to open %s\n",fname);
c627d613
AT
396 }
397 return;
398 }
399
400 if (!S_ISREG(st.st_mode)) {
7b8356d0
AT
401 /* its not a regular file on the receiving end, but it is on the
402 sending end. If its a directory then skip it (too dangerous to
403 do a recursive deletion??) otherwise try to unlink it */
404 if (S_ISDIR(st.st_mode)) {
405 fprintf(FERROR,"ERROR: %s is a directory\n",fname);
406 return;
407 }
408 if (unlink(fname) != 0) {
409 fprintf(FERROR,"%s : not a regular file (generator)\n",fname);
410 return;
411 }
412
413 /* now pretend the file didn't exist */
414 write_int(f_out,i);
415 if (!dry_run) send_sums(NULL,f_out);
c627d613
AT
416 return;
417 }
418
6bbbc08b 419 if (update_only && st.st_mtime > file->modtime) {
c627d613 420 if (verbose > 1)
dc5ddbcc 421 fprintf(FERROR,"%s is newer\n",fname);
c627d613
AT
422 return;
423 }
424
964ca2ec 425 if (skip_file(fname, file, &st)) {
dc5ddbcc 426 set_perms(fname,file,&st,1);
c627d613
AT
427 return;
428 }
429
430 if (dry_run) {
431 write_int(f_out,i);
432 return;
433 }
434
82306bf6
AT
435 if (whole_file) {
436 write_int(f_out,i);
437 send_sums(NULL,f_out);
438 return;
439 }
440
c627d613
AT
441 /* open the file */
442 fd = open(fname,O_RDONLY);
443
444 if (fd == -1) {
dc5ddbcc 445 fprintf(FERROR,"failed to open %s : %s\n",fname,strerror(errno));
f3644f1f 446 fprintf(FERROR,"skipping %s\n",fname);
c627d613
AT
447 return;
448 }
449
450 if (st.st_size > 0) {
451 buf = map_file(fd,st.st_size);
c627d613
AT
452 } else {
453 buf = NULL;
454 }
455
456 if (verbose > 3)
9e31c482 457 fprintf(FERROR,"gen mapped %s of size %d\n",fname,(int)st.st_size);
c627d613 458
3ba62a83 459 s = generate_sums(buf,st.st_size,adapt_block_size(file, block_size));
c627d613 460
9e31c482
AT
461 if (verbose > 2)
462 fprintf(FERROR,"sending sums for %d\n",i);
463
c627d613
AT
464 write_int(f_out,i);
465 send_sums(s,f_out);
466 write_flush(f_out);
467
468 close(fd);
1cdc8b50 469 if (buf) unmap_file(buf);
c627d613
AT
470
471 free_sums(s);
472}
473
474
475
9e31c482 476static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname)
c627d613
AT
477{
478 int i,n,remainder,len,count;
479 off_t offset = 0;
480 off_t offset2;
70d794dc 481 char *data;
ebb0a6f6
AT
482 static char file_sum1[MD4_SUM_LENGTH];
483 static char file_sum2[MD4_SUM_LENGTH];
9e31c482 484 char *map=NULL;
c627d613
AT
485
486 count = read_int(f_in);
487 n = read_int(f_in);
488 remainder = read_int(f_in);
489
9e31c482
AT
490 sum_init();
491
70d794dc 492 for (i=recv_token(f_in,&data); i != 0; i=recv_token(f_in,&data)) {
c627d613
AT
493 if (i > 0) {
494 if (verbose > 3)
dc5ddbcc 495 fprintf(FERROR,"data recv %d at %d\n",i,(int)offset);
c627d613 496
9e31c482
AT
497 sum_update(data,i);
498
7b8356d0 499 if (fd != -1 && write_sparse(fd,data,i) != i) {
dc5ddbcc 500 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
34ccb63e 501 exit_cleanup(1);
c627d613
AT
502 }
503 offset += i;
504 } else {
505 i = -(i+1);
506 offset2 = i*n;
507 len = n;
508 if (i == count-1 && remainder != 0)
509 len = remainder;
510
511 if (verbose > 3)
dc5ddbcc 512 fprintf(FERROR,"chunk[%d] of size %d at %d offset=%d\n",
c627d613
AT
513 i,len,(int)offset2,(int)offset);
514
9e31c482
AT
515 map = map_ptr(buf,offset2,len);
516
861c20b4 517 see_token(map, len);
9e31c482
AT
518 sum_update(map,len);
519
7b8356d0 520 if (fd != -1 && write_sparse(fd,map,len) != len) {
dc5ddbcc 521 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
34ccb63e 522 exit_cleanup(1);
c627d613
AT
523 }
524 offset += len;
525 }
526 }
7bec6a5c 527
7b8356d0 528 if (fd != -1 && offset > 0 && sparse_end(fd) != 0) {
dc5ddbcc 529 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
34ccb63e 530 exit_cleanup(1);
7bec6a5c 531 }
9e31c482
AT
532
533 sum_end(file_sum1);
534
535 if (remote_version >= 14) {
ebb0a6f6 536 read_buf(f_in,file_sum2,MD4_SUM_LENGTH);
9e31c482
AT
537 if (verbose > 2)
538 fprintf(FERROR,"got file_sum\n");
7b8356d0 539 if (fd != -1 && memcmp(file_sum1,file_sum2,MD4_SUM_LENGTH) != 0)
9e31c482
AT
540 return 0;
541 }
542 return 1;
c627d613
AT
543}
544
545
546static void delete_one(struct file_struct *f)
547{
548 if (!S_ISDIR(f->mode)) {
3ec4dd97
AT
549 if (!dry_run && unlink(f_name(f)) != 0) {
550 fprintf(FERROR,"unlink %s : %s\n",f_name(f),strerror(errno));
c627d613 551 } else if (verbose) {
3ec4dd97 552 fprintf(FERROR,"deleting %s\n",f_name(f));
c627d613
AT
553 }
554 } else {
3ec4dd97 555 if (!dry_run && rmdir(f_name(f)) != 0) {
c627d613 556 if (errno != ENOTEMPTY)
3ec4dd97 557 fprintf(FERROR,"rmdir %s : %s\n",f_name(f),strerror(errno));
c627d613 558 } else if (verbose) {
3ec4dd97 559 fprintf(FERROR,"deleting directory %s\n",f_name(f));
c627d613
AT
560 }
561 }
562}
563
564
3b3a2fbc
AT
565/* yuck! This function wouldn't have been necessary if I had the sorting
566 algorithm right. Unfortunately fixing the sorting algorithm would introduce
567 a backward incompatibility as file list indexes are sent over the link.
568
569 The aim is to see if a directory has already had the deletion algorithm applied
570 to it (due to recursion), and if so to skip it. The bisection is to
571 prevent this being an n^2 algorithm */
572static int delete_already_done(struct file_list *flist,int j)
573{
574 int low=0,high=j-1;
575 char *name;
576 char *p;
577
578 if (j == 0) return 0;
579
3ec4dd97 580 name = strdup(f_name(flist->files[j]));
3b3a2fbc
AT
581
582 if (!name) {
583 fprintf(FERROR,"out of memory in delete_already_done");
584 exit_cleanup(1);
585 }
586
587 p = strrchr(name,'/');
588 if (!p) {
589 free(name);
590 return 0;
591 }
592 *p = 0;
593
594 while (low != high) {
595 int mid = (low+high)/2;
3ec4dd97 596 int ret = strcmp(f_name(flist->files[flist_up(flist, mid)]),name);
3b3a2fbc
AT
597 if (ret == 0) {
598 free(name);
599 return 1;
600 }
601 if (ret > 0) {
602 high=mid;
603 } else {
604 low=mid+1;
605 }
606 }
607
608 low = flist_up(flist, low);
609
3ec4dd97 610 if (strcmp(f_name(flist->files[low]),name) == 0) {
3b3a2fbc
AT
611 free(name);
612 return 1;
613 }
614
615 free(name);
616 return 0;
617}
618
619
e92338c8
AT
620/* this deletes any files on the receiving side that are not present
621 on the sending side. For version 1.6.4 I have changed the behaviour
622 to match more closely what most people seem to expect of this option */
c627d613
AT
623static void delete_files(struct file_list *flist)
624{
625 struct file_list *local_file_list;
e92338c8 626 int i, j;
c627d613 627
4fe159a8 628 if (cvs_exclude)
79fbb6f5 629 add_cvs_excludes();
4fe159a8 630
e92338c8 631 for (j=0;j<flist->count;j++) {
3ec4dd97 632 char *name = f_name(flist->files[j]);
3b3a2fbc 633
3ec4dd97 634 if (!S_ISDIR(flist->files[j]->mode)) continue;
3b3a2fbc
AT
635
636 if (delete_already_done(flist, j)) continue;
637
638 if (!(local_file_list = send_file_list(-1,1,&name)))
d966ee25 639 continue;
3b3a2fbc 640
e92338c8 641 if (verbose > 1)
3b3a2fbc 642 fprintf(FINFO,"deleting in %s\n", name);
e92338c8
AT
643
644 for (i=local_file_list->count-1;i>=0;i--) {
3ec4dd97
AT
645 if (!local_file_list->files[i]->basename) continue;
646 if (-1 == flist_find(flist,local_file_list->files[i])) {
647 delete_one(local_file_list->files[i]);
e92338c8
AT
648 }
649 }
3ec4dd97 650 flist_free(local_file_list);
c627d613
AT
651 }
652}
653
654static char *cleanup_fname = NULL;
655
34ccb63e 656void exit_cleanup(int code)
c627d613 657{
82306bf6
AT
658 if (cleanup_fname)
659 unlink(cleanup_fname);
660 signal(SIGUSR1, SIG_IGN);
661 if (code) {
3ba62a83 662 kill_all(SIGUSR1);
82306bf6
AT
663 }
664 exit(code);
34ccb63e
AT
665}
666
667void sig_int(void)
668{
669 exit_cleanup(1);
c627d613
AT
670}
671
672
c6e7fcb4 673int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
c627d613
AT
674{
675 int fd1,fd2;
676 struct stat st;
677 char *fname;
678 char fnametmp[MAXPATHLEN];
c6e7fcb4 679 struct map_struct *buf;
c627d613 680 int i;
dc5ddbcc 681 struct file_struct *file;
c6e7fcb4 682 int phase=0;
9e31c482 683 int recv_ok;
c627d613 684
981791bd 685 if (verbose > 2) {
dc5ddbcc 686 fprintf(FERROR,"recv_files(%d) starting\n",flist->count);
981791bd 687 }
c627d613
AT
688
689 if (recurse && delete_mode && !local_name && flist->count>0) {
690 delete_files(flist);
691 }
692
693 while (1)
9e31c482 694 {
c627d613 695 i = read_int(f_in);
c6e7fcb4
AT
696 if (i == -1) {
697 if (phase==0 && remote_version >= 13) {
698 phase++;
9e31c482
AT
699 csum_length = SUM_LENGTH;
700 if (verbose > 2)
701 fprintf(FERROR,"recv_files phase=%d\n",phase);
c6e7fcb4
AT
702 write_int(f_gen,-1);
703 write_flush(f_gen);
704 continue;
705 }
706 break;
707 }
c627d613 708
3ec4dd97
AT
709 file = flist->files[i];
710 fname = f_name(file);
c627d613
AT
711
712 if (local_name)
713 fname = local_name;
714
715 if (dry_run) {
716 if (!am_server && verbose)
717 printf("%s\n",fname);
718 continue;
719 }
720
721 if (verbose > 2)
dc5ddbcc 722 fprintf(FERROR,"recv_files(%s)\n",fname);
c627d613
AT
723
724 /* open the file */
ac1eb754 725 fd1 = open(fname,O_RDONLY);
c627d613 726
ac1eb754 727 if (fd1 != -1 && fstat(fd1,&st) != 0) {
dc5ddbcc 728 fprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
7b8356d0 729 receive_data(f_in,NULL,-1,NULL);
c627d613 730 close(fd1);
7b8356d0 731 continue;
c627d613
AT
732 }
733
ac1eb754 734 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
7b8356d0
AT
735 fprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
736 receive_data(f_in,NULL,-1,NULL);
c627d613 737 close(fd1);
7b8356d0 738 continue;
c627d613
AT
739 }
740
ac1eb754 741 if (fd1 != -1 && st.st_size > 0) {
c627d613 742 buf = map_file(fd1,st.st_size);
9e31c482
AT
743 if (verbose > 2)
744 fprintf(FERROR,"recv mapped %s of size %d\n",fname,(int)st.st_size);
c627d613
AT
745 } else {
746 buf = NULL;
747 }
748
c627d613 749 /* open tmp file */
13a1f792
AT
750 if (strlen(fname) > (MAXPATHLEN-8)) {
751 fprintf(FERROR,"filename too long\n");
3ec4dd97 752 if (buf) unmap_file(buf);
fee64929 753 close(fd1);
13a1f792
AT
754 continue;
755 }
950ab32d
AT
756 if (tmpdir) {
757 char *f;
758 f = strrchr(fname,'/');
759 if (f == NULL)
760 f = fname;
761 else
762 f++;
763 sprintf(fnametmp,"%s/%s.XXXXXX",tmpdir,f);
764 } else {
765 sprintf(fnametmp,"%s.XXXXXX",fname);
766 }
c627d613 767 if (NULL == mktemp(fnametmp)) {
dc5ddbcc 768 fprintf(FERROR,"mktemp %s failed\n",fnametmp);
7b8356d0
AT
769 receive_data(f_in,buf,-1,NULL);
770 if (buf) unmap_file(buf);
771 close(fd1);
772 continue;
c627d613 773 }
950ab32d 774 fd2 = open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
fee64929 775 if (fd2 == -1 && relative_paths && errno == ENOENT &&
6574b4f7 776 create_directory_path(fnametmp) == 0) {
950ab32d 777 fd2 = open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
6574b4f7 778 }
c627d613 779 if (fd2 == -1) {
dc5ddbcc 780 fprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
7b8356d0
AT
781 receive_data(f_in,buf,-1,NULL);
782 if (buf) unmap_file(buf);
783 close(fd1);
784 continue;
c627d613
AT
785 }
786
787 cleanup_fname = fnametmp;
788
789 if (!am_server && verbose)
790 printf("%s\n",fname);
791
792 /* recv file data */
9e31c482 793 recv_ok = receive_data(f_in,buf,fd2,fname);
c627d613 794
3ec4dd97 795 if (buf) unmap_file(buf);
981791bd 796 if (fd1 != -1) {
981791bd
AT
797 close(fd1);
798 }
c627d613
AT
799 close(fd2);
800
801 if (verbose > 2)
dc5ddbcc 802 fprintf(FERROR,"renaming %s to %s\n",fnametmp,fname);
c627d613
AT
803
804 if (make_backups) {
805 char fnamebak[MAXPATHLEN];
13a1f792
AT
806 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
807 fprintf(FERROR,"backup filename too long\n");
808 continue;
809 }
c627d613 810 sprintf(fnamebak,"%s%s",fname,backup_suffix);
ac1eb754 811 if (rename(fname,fnamebak) != 0 && errno != ENOENT) {
dc5ddbcc 812 fprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
7b8356d0 813 continue;
c627d613
AT
814 }
815 }
816
817 /* move tmp file over real file */
818 if (rename(fnametmp,fname) != 0) {
950ab32d
AT
819 if (errno == EXDEV) {
820 /* rename failed on cross-filesystem link.
821 Copy the file instead. */
13dc412d 822 if (copy_file(fnametmp,fname, file->mode)) {
950ab32d
AT
823 fprintf(FERROR,"copy %s -> %s : %s\n",
824 fnametmp,fname,strerror(errno));
13dc412d
AT
825 } else {
826 set_perms(fname,file,NULL,0);
827 }
950ab32d
AT
828 unlink(fnametmp);
829 } else {
830 fprintf(FERROR,"rename %s -> %s : %s\n",
831 fnametmp,fname,strerror(errno));
832 unlink(fnametmp);
833 }
13dc412d
AT
834 } else {
835 set_perms(fname,file,NULL,0);
c627d613
AT
836 }
837
838 cleanup_fname = NULL;
839
9e31c482
AT
840
841 if (!recv_ok) {
e7ebc36c
AT
842 if (csum_length == SUM_LENGTH) {
843 fprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
844 fname);
845 } else {
846 if (verbose > 1)
847 fprintf(FERROR,"redoing %s(%d)\n",fname,i);
848 write_int(f_gen,i);
849 }
9e31c482 850 }
c627d613
AT
851 }
852
7c596906
AT
853 if (preserve_hard_links)
854 do_hard_links(flist);
855
7b8356d0
AT
856 /* now we need to fix any directory permissions that were
857 modified during the transfer */
7c596906 858 for (i = 0; i < flist->count; i++) {
3ec4dd97
AT
859 struct file_struct *file = flist->files[i];
860 if (!file->basename || !S_ISDIR(file->mode)) continue;
861 recv_generator(f_name(file),flist,i,-1);
7b8356d0 862 }
7b8356d0 863
c627d613 864 if (verbose > 2)
dc5ddbcc 865 fprintf(FERROR,"recv_files finished\n");
c627d613
AT
866
867 return 0;
868}
869
870
871
872off_t send_files(struct file_list *flist,int f_out,int f_in)
873{
874 int fd;
875 struct sum_struct *s;
c6e7fcb4 876 struct map_struct *buf;
c627d613
AT
877 struct stat st;
878 char fname[MAXPATHLEN];
879 off_t total=0;
880 int i;
dc5ddbcc 881 struct file_struct *file;
c6e7fcb4 882 int phase = 0;
c627d613
AT
883
884 if (verbose > 2)
dc5ddbcc 885 fprintf(FERROR,"send_files starting\n");
c627d613 886
720b47f2
AT
887 setup_nonblocking(f_in,f_out);
888
e7ebc36c
AT
889 while (1) {
890 i = read_int(f_in);
891 if (i == -1) {
892 if (phase==0 && remote_version >= 13) {
893 phase++;
894 csum_length = SUM_LENGTH;
895 write_int(f_out,-1);
896 write_flush(f_out);
897 if (verbose > 2)
898 fprintf(FERROR,"send_files phase=%d\n",phase);
899 continue;
900 }
901 break;
902 }
c627d613 903
e7ebc36c
AT
904 file = flist->files[i];
905
906 fname[0] = 0;
907 if (file->basedir) {
908 strncpy(fname,file->basedir,MAXPATHLEN-1);
909 fname[MAXPATHLEN-1] = 0;
910 if (strlen(fname) == MAXPATHLEN-1) {
911 fprintf(FERROR, "send_files failed on long-named directory %s\n",
912 fname);
913 return -1;
914 }
915 strcat(fname,"/");
916 }
917 strncat(fname,f_name(file),MAXPATHLEN-strlen(fname));
918
919 if (verbose > 2)
920 fprintf(FERROR,"send_files(%d,%s)\n",i,fname);
921
922 if (dry_run) {
923 if (!am_server && verbose)
924 printf("%s\n",fname);
925 write_int(f_out,i);
926 continue;
927 }
c627d613 928
e7ebc36c
AT
929 s = receive_sums(f_in);
930 if (!s) {
931 fprintf(FERROR,"receive_sums failed\n");
932 return -1;
933 }
934
935 fd = open(fname,O_RDONLY);
936 if (fd == -1) {
937 fprintf(FERROR,"send_files failed to open %s: %s\n",
938 fname,strerror(errno));
0b910560 939 free_sums(s);
e7ebc36c
AT
940 continue;
941 }
942
943 /* map the local file */
944 if (fstat(fd,&st) != 0) {
945 fprintf(FERROR,"fstat failed : %s\n",strerror(errno));
0b910560 946 free_sums(s);
e7ebc36c
AT
947 close(fd);
948 return -1;
949 }
950
951 if (st.st_size > 0) {
952 buf = map_file(fd,st.st_size);
953 } else {
954 buf = NULL;
955 }
956
957 if (verbose > 2)
958 fprintf(FERROR,"send_files mapped %s of size %d\n",
959 fname,(int)st.st_size);
960
961 write_int(f_out,i);
962
963 write_int(f_out,s->count);
964 write_int(f_out,s->n);
965 write_int(f_out,s->remainder);
966
967 if (verbose > 2)
968 fprintf(FERROR,"calling match_sums %s\n",fname);
969
970 if (!am_server && verbose)
971 printf("%s\n",fname);
972
973 match_sums(f_out,s,buf,st.st_size);
974 write_flush(f_out);
975
976 if (buf) unmap_file(buf);
977 close(fd);
978
979 free_sums(s);
980
981 if (verbose > 2)
982 fprintf(FERROR,"sender finished %s\n",fname);
983
984 total += st.st_size;
985 }
c627d613 986
dc5ddbcc 987 if (verbose > 2)
e7ebc36c 988 fprintf(FERROR,"send files finished\n");
dc5ddbcc 989
c627d613
AT
990 match_report();
991
992 write_int(f_out,-1);
993 write_flush(f_out);
994
995 return total;
996}
997
998
999
c6e7fcb4 1000void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
c627d613
AT
1001{
1002 int i;
9e31c482 1003 int phase=0;
c627d613
AT
1004
1005 if (verbose > 2)
dc5ddbcc 1006 fprintf(FERROR,"generator starting pid=%d count=%d\n",
c627d613
AT
1007 (int)getpid(),flist->count);
1008
1009 for (i = 0; i < flist->count; i++) {
3ec4dd97 1010 struct file_struct *file = flist->files[i];
7b8356d0 1011 mode_t saved_mode = file->mode;
3ec4dd97 1012 if (!file->basename) continue;
7b8356d0
AT
1013
1014 /* we need to ensure that any directories we create have writeable
1015 permissions initially so that we can create the files within
1016 them. This is then fixed after the files are transferred */
1017 if (!am_root && S_ISDIR(file->mode)) {
1018 file->mode |= S_IWUSR; /* user write */
c627d613 1019 }
7b8356d0 1020
3ec4dd97 1021 recv_generator(local_name?local_name:f_name(file),
c627d613 1022 flist,i,f);
7b8356d0
AT
1023
1024 file->mode = saved_mode;
c627d613 1025 }
c6e7fcb4 1026
9e31c482
AT
1027 phase++;
1028 csum_length = SUM_LENGTH;
1029 ignore_times=1;
1030
1031 if (verbose > 2)
1032 fprintf(FERROR,"generate_files phase=%d\n",phase);
1033
c627d613
AT
1034 write_int(f,-1);
1035 write_flush(f);
c6e7fcb4
AT
1036
1037 if (remote_version >= 13) {
7b8356d0
AT
1038 /* in newer versions of the protocol the files can cycle through
1039 the system more than once to catch initial checksum errors */
c6e7fcb4 1040 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
3ec4dd97
AT
1041 struct file_struct *file = flist->files[i];
1042 recv_generator(local_name?local_name:f_name(file),
c6e7fcb4
AT
1043 flist,i,f);
1044 }
1045
9e31c482
AT
1046 phase++;
1047 if (verbose > 2)
1048 fprintf(FERROR,"generate_files phase=%d\n",phase);
1049
c6e7fcb4
AT
1050 write_int(f,-1);
1051 write_flush(f);
1052 }
1053
1054
c627d613 1055 if (verbose > 2)
dc5ddbcc 1056 fprintf(FERROR,"generator wrote %d\n",write_total());
c627d613 1057}
dc5ddbcc
AT
1058
1059