for systems with a broken select use u_sleep() to ensure the write
[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
c627d613
AT
280void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
281{
282 int fd;
283 struct stat st;
c6e7fcb4 284 struct map_struct *buf;
c627d613 285 struct sum_struct *s;
c627d613 286 int statret;
3ec4dd97 287 struct file_struct *file = flist->files[i];
c627d613
AT
288
289 if (verbose > 2)
9e31c482 290 fprintf(FERROR,"recv_generator(%s,%d)\n",fname,i);
c627d613 291
82306bf6 292 statret = link_stat(fname,&st);
c627d613 293
7b8356d0
AT
294 if (S_ISDIR(file->mode)) {
295 if (dry_run) return;
296 if (statret == 0 && !S_ISDIR(st.st_mode)) {
297 if (unlink(fname) != 0) {
298 fprintf(FERROR,"unlink %s : %s\n",fname,strerror(errno));
299 return;
300 }
301 statret = -1;
302 }
6574b4f7
AT
303 if (statret != 0 && mkdir(fname,file->mode) != 0 && errno != EEXIST) {
304 if (!(relative_paths && errno==ENOENT &&
305 create_directory_path(fname)==0 &&
306 mkdir(fname,file->mode)==0)) {
307 fprintf(FERROR,"mkdir %s : %s (2)\n",
308 fname,strerror(errno));
309 }
310 }
7b8356d0
AT
311 if (set_perms(fname,file,NULL,0) && verbose)
312 fprintf(FINFO,"%s/\n",fname);
313 return;
314 }
315
dc5ddbcc 316 if (preserve_links && S_ISLNK(file->mode)) {
cbbe4892 317#if SUPPORT_LINKS
c627d613
AT
318 char lnk[MAXPATHLEN];
319 int l;
320 if (statret == 0) {
321 l = readlink(fname,lnk,MAXPATHLEN-1);
322 if (l > 0) {
323 lnk[l] = 0;
dc5ddbcc
AT
324 if (strcmp(lnk,file->link) == 0) {
325 set_perms(fname,file,&st,1);
c627d613
AT
326 return;
327 }
328 }
329 }
330 if (!dry_run) unlink(fname);
dc5ddbcc
AT
331 if (!dry_run && symlink(file->link,fname) != 0) {
332 fprintf(FERROR,"link %s -> %s : %s\n",
333 fname,file->link,strerror(errno));
c627d613 334 } else {
dc5ddbcc 335 set_perms(fname,file,NULL,0);
c627d613 336 if (verbose)
dc5ddbcc
AT
337 fprintf(FINFO,"%s -> %s\n",
338 fname,file->link);
c627d613 339 }
cbbe4892 340#endif
c627d613
AT
341 return;
342 }
c627d613
AT
343
344#ifdef HAVE_MKNOD
7b8356d0 345 if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
c627d613 346 if (statret != 0 ||
dc5ddbcc
AT
347 st.st_mode != file->mode ||
348 st.st_rdev != file->rdev) {
c627d613
AT
349 if (!dry_run) unlink(fname);
350 if (verbose > 2)
dc5ddbcc
AT
351 fprintf(FERROR,"mknod(%s,0%o,0x%x)\n",
352 fname,(int)file->mode,(int)file->rdev);
c627d613 353 if (!dry_run &&
dc5ddbcc
AT
354 mknod(fname,file->mode,file->rdev) != 0) {
355 fprintf(FERROR,"mknod %s : %s\n",fname,strerror(errno));
c627d613 356 } else {
dc5ddbcc 357 set_perms(fname,file,NULL,0);
c627d613 358 if (verbose)
dc5ddbcc 359 fprintf(FINFO,"%s\n",fname);
c627d613
AT
360 }
361 } else {
dc5ddbcc 362 set_perms(fname,file,&st,1);
c627d613
AT
363 }
364 return;
365 }
366#endif
367
dc5ddbcc
AT
368 if (preserve_hard_links && check_hard_link(file)) {
369 if (verbose > 1)
3ec4dd97 370 fprintf(FINFO,"%s is a hard link\n",f_name(file));
dc5ddbcc
AT
371 return;
372 }
373
374 if (!S_ISREG(file->mode)) {
375 fprintf(FERROR,"skipping non-regular file %s\n",fname);
c627d613
AT
376 return;
377 }
378
379 if (statret == -1) {
380 if (errno == ENOENT) {
381 write_int(f_out,i);
382 if (!dry_run) send_sums(NULL,f_out);
383 } else {
384 if (verbose > 1)
dc5ddbcc 385 fprintf(FERROR,"recv_generator failed to open %s\n",fname);
c627d613
AT
386 }
387 return;
388 }
389
390 if (!S_ISREG(st.st_mode)) {
7b8356d0
AT
391 /* its not a regular file on the receiving end, but it is on the
392 sending end. If its a directory then skip it (too dangerous to
393 do a recursive deletion??) otherwise try to unlink it */
394 if (S_ISDIR(st.st_mode)) {
395 fprintf(FERROR,"ERROR: %s is a directory\n",fname);
396 return;
397 }
398 if (unlink(fname) != 0) {
399 fprintf(FERROR,"%s : not a regular file (generator)\n",fname);
400 return;
401 }
402
403 /* now pretend the file didn't exist */
404 write_int(f_out,i);
405 if (!dry_run) send_sums(NULL,f_out);
c627d613
AT
406 return;
407 }
408
6bbbc08b 409 if (update_only && st.st_mtime > file->modtime) {
c627d613 410 if (verbose > 1)
dc5ddbcc 411 fprintf(FERROR,"%s is newer\n",fname);
c627d613
AT
412 return;
413 }
414
964ca2ec 415 if (skip_file(fname, file, &st)) {
dc5ddbcc 416 set_perms(fname,file,&st,1);
c627d613
AT
417 return;
418 }
419
420 if (dry_run) {
421 write_int(f_out,i);
422 return;
423 }
424
82306bf6
AT
425 if (whole_file) {
426 write_int(f_out,i);
427 send_sums(NULL,f_out);
428 return;
429 }
430
c627d613
AT
431 /* open the file */
432 fd = open(fname,O_RDONLY);
433
434 if (fd == -1) {
dc5ddbcc 435 fprintf(FERROR,"failed to open %s : %s\n",fname,strerror(errno));
f3644f1f 436 fprintf(FERROR,"skipping %s\n",fname);
c627d613
AT
437 return;
438 }
439
440 if (st.st_size > 0) {
441 buf = map_file(fd,st.st_size);
c627d613
AT
442 } else {
443 buf = NULL;
444 }
445
446 if (verbose > 3)
9e31c482 447 fprintf(FERROR,"gen mapped %s of size %d\n",fname,(int)st.st_size);
c627d613
AT
448
449 s = generate_sums(buf,st.st_size,block_size);
450
9e31c482
AT
451 if (verbose > 2)
452 fprintf(FERROR,"sending sums for %d\n",i);
453
c627d613
AT
454 write_int(f_out,i);
455 send_sums(s,f_out);
456 write_flush(f_out);
457
458 close(fd);
1cdc8b50 459 if (buf) unmap_file(buf);
c627d613
AT
460
461 free_sums(s);
462}
463
464
465
9e31c482 466static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname)
c627d613
AT
467{
468 int i,n,remainder,len,count;
469 off_t offset = 0;
470 off_t offset2;
70d794dc 471 char *data;
ebb0a6f6
AT
472 static char file_sum1[MD4_SUM_LENGTH];
473 static char file_sum2[MD4_SUM_LENGTH];
9e31c482 474 char *map=NULL;
c627d613
AT
475
476 count = read_int(f_in);
477 n = read_int(f_in);
478 remainder = read_int(f_in);
479
9e31c482
AT
480 sum_init();
481
70d794dc 482 for (i=recv_token(f_in,&data); i != 0; i=recv_token(f_in,&data)) {
c627d613
AT
483 if (i > 0) {
484 if (verbose > 3)
dc5ddbcc 485 fprintf(FERROR,"data recv %d at %d\n",i,(int)offset);
c627d613 486
9e31c482
AT
487 sum_update(data,i);
488
7b8356d0 489 if (fd != -1 && write_sparse(fd,data,i) != i) {
dc5ddbcc 490 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
34ccb63e 491 exit_cleanup(1);
c627d613
AT
492 }
493 offset += i;
494 } else {
495 i = -(i+1);
496 offset2 = i*n;
497 len = n;
498 if (i == count-1 && remainder != 0)
499 len = remainder;
500
501 if (verbose > 3)
dc5ddbcc 502 fprintf(FERROR,"chunk[%d] of size %d at %d offset=%d\n",
c627d613
AT
503 i,len,(int)offset2,(int)offset);
504
9e31c482
AT
505 map = map_ptr(buf,offset2,len);
506
861c20b4 507 see_token(map, len);
9e31c482
AT
508 sum_update(map,len);
509
7b8356d0 510 if (fd != -1 && write_sparse(fd,map,len) != len) {
dc5ddbcc 511 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
34ccb63e 512 exit_cleanup(1);
c627d613
AT
513 }
514 offset += len;
515 }
516 }
7bec6a5c 517
7b8356d0 518 if (fd != -1 && offset > 0 && sparse_end(fd) != 0) {
dc5ddbcc 519 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
34ccb63e 520 exit_cleanup(1);
7bec6a5c 521 }
9e31c482
AT
522
523 sum_end(file_sum1);
524
525 if (remote_version >= 14) {
ebb0a6f6 526 read_buf(f_in,file_sum2,MD4_SUM_LENGTH);
9e31c482
AT
527 if (verbose > 2)
528 fprintf(FERROR,"got file_sum\n");
7b8356d0 529 if (fd != -1 && memcmp(file_sum1,file_sum2,MD4_SUM_LENGTH) != 0)
9e31c482
AT
530 return 0;
531 }
532 return 1;
c627d613
AT
533}
534
535
536static void delete_one(struct file_struct *f)
537{
538 if (!S_ISDIR(f->mode)) {
3ec4dd97
AT
539 if (!dry_run && unlink(f_name(f)) != 0) {
540 fprintf(FERROR,"unlink %s : %s\n",f_name(f),strerror(errno));
c627d613 541 } else if (verbose) {
3ec4dd97 542 fprintf(FERROR,"deleting %s\n",f_name(f));
c627d613
AT
543 }
544 } else {
3ec4dd97 545 if (!dry_run && rmdir(f_name(f)) != 0) {
c627d613 546 if (errno != ENOTEMPTY)
3ec4dd97 547 fprintf(FERROR,"rmdir %s : %s\n",f_name(f),strerror(errno));
c627d613 548 } else if (verbose) {
3ec4dd97 549 fprintf(FERROR,"deleting directory %s\n",f_name(f));
c627d613
AT
550 }
551 }
552}
553
554
3b3a2fbc
AT
555/* yuck! This function wouldn't have been necessary if I had the sorting
556 algorithm right. Unfortunately fixing the sorting algorithm would introduce
557 a backward incompatibility as file list indexes are sent over the link.
558
559 The aim is to see if a directory has already had the deletion algorithm applied
560 to it (due to recursion), and if so to skip it. The bisection is to
561 prevent this being an n^2 algorithm */
562static int delete_already_done(struct file_list *flist,int j)
563{
564 int low=0,high=j-1;
565 char *name;
566 char *p;
567
568 if (j == 0) return 0;
569
3ec4dd97 570 name = strdup(f_name(flist->files[j]));
3b3a2fbc
AT
571
572 if (!name) {
573 fprintf(FERROR,"out of memory in delete_already_done");
574 exit_cleanup(1);
575 }
576
577 p = strrchr(name,'/');
578 if (!p) {
579 free(name);
580 return 0;
581 }
582 *p = 0;
583
584 while (low != high) {
585 int mid = (low+high)/2;
3ec4dd97 586 int ret = strcmp(f_name(flist->files[flist_up(flist, mid)]),name);
3b3a2fbc
AT
587 if (ret == 0) {
588 free(name);
589 return 1;
590 }
591 if (ret > 0) {
592 high=mid;
593 } else {
594 low=mid+1;
595 }
596 }
597
598 low = flist_up(flist, low);
599
3ec4dd97 600 if (strcmp(f_name(flist->files[low]),name) == 0) {
3b3a2fbc
AT
601 free(name);
602 return 1;
603 }
604
605 free(name);
606 return 0;
607}
608
609
e92338c8
AT
610/* this deletes any files on the receiving side that are not present
611 on the sending side. For version 1.6.4 I have changed the behaviour
612 to match more closely what most people seem to expect of this option */
c627d613
AT
613static void delete_files(struct file_list *flist)
614{
615 struct file_list *local_file_list;
e92338c8 616 int i, j;
c627d613 617
4fe159a8 618 if (cvs_exclude)
79fbb6f5 619 add_cvs_excludes();
4fe159a8 620
e92338c8 621 for (j=0;j<flist->count;j++) {
3ec4dd97 622 char *name = f_name(flist->files[j]);
3b3a2fbc 623
3ec4dd97 624 if (!S_ISDIR(flist->files[j]->mode)) continue;
3b3a2fbc
AT
625
626 if (delete_already_done(flist, j)) continue;
627
628 if (!(local_file_list = send_file_list(-1,1,&name)))
d966ee25 629 continue;
3b3a2fbc 630
e92338c8 631 if (verbose > 1)
3b3a2fbc 632 fprintf(FINFO,"deleting in %s\n", name);
e92338c8
AT
633
634 for (i=local_file_list->count-1;i>=0;i--) {
3ec4dd97
AT
635 if (!local_file_list->files[i]->basename) continue;
636 if (-1 == flist_find(flist,local_file_list->files[i])) {
637 delete_one(local_file_list->files[i]);
e92338c8
AT
638 }
639 }
3ec4dd97 640 flist_free(local_file_list);
c627d613
AT
641 }
642}
643
644static char *cleanup_fname = NULL;
645
34ccb63e 646void exit_cleanup(int code)
c627d613 647{
82306bf6
AT
648 if (cleanup_fname)
649 unlink(cleanup_fname);
650 signal(SIGUSR1, SIG_IGN);
651 if (code) {
652#ifdef GETPGRP_VOID
653 kill(-getpgrp(), SIGUSR1);
654#else
655 kill(-getpgrp(getpid()), SIGUSR1);
656#endif
657 }
658 exit(code);
34ccb63e
AT
659}
660
661void sig_int(void)
662{
663 exit_cleanup(1);
c627d613
AT
664}
665
666
c6e7fcb4 667int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
c627d613
AT
668{
669 int fd1,fd2;
670 struct stat st;
671 char *fname;
672 char fnametmp[MAXPATHLEN];
c6e7fcb4 673 struct map_struct *buf;
c627d613 674 int i;
dc5ddbcc 675 struct file_struct *file;
c6e7fcb4 676 int phase=0;
9e31c482 677 int recv_ok;
c627d613 678
981791bd 679 if (verbose > 2) {
dc5ddbcc 680 fprintf(FERROR,"recv_files(%d) starting\n",flist->count);
981791bd 681 }
c627d613
AT
682
683 if (recurse && delete_mode && !local_name && flist->count>0) {
684 delete_files(flist);
685 }
686
687 while (1)
9e31c482 688 {
c627d613 689 i = read_int(f_in);
c6e7fcb4
AT
690 if (i == -1) {
691 if (phase==0 && remote_version >= 13) {
692 phase++;
9e31c482
AT
693 csum_length = SUM_LENGTH;
694 if (verbose > 2)
695 fprintf(FERROR,"recv_files phase=%d\n",phase);
c6e7fcb4
AT
696 write_int(f_gen,-1);
697 write_flush(f_gen);
698 continue;
699 }
700 break;
701 }
c627d613 702
3ec4dd97
AT
703 file = flist->files[i];
704 fname = f_name(file);
c627d613
AT
705
706 if (local_name)
707 fname = local_name;
708
709 if (dry_run) {
710 if (!am_server && verbose)
711 printf("%s\n",fname);
712 continue;
713 }
714
715 if (verbose > 2)
dc5ddbcc 716 fprintf(FERROR,"recv_files(%s)\n",fname);
c627d613
AT
717
718 /* open the file */
ac1eb754 719 fd1 = open(fname,O_RDONLY);
c627d613 720
ac1eb754 721 if (fd1 != -1 && fstat(fd1,&st) != 0) {
dc5ddbcc 722 fprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
7b8356d0 723 receive_data(f_in,NULL,-1,NULL);
c627d613 724 close(fd1);
7b8356d0 725 continue;
c627d613
AT
726 }
727
ac1eb754 728 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
7b8356d0
AT
729 fprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
730 receive_data(f_in,NULL,-1,NULL);
c627d613 731 close(fd1);
7b8356d0 732 continue;
c627d613
AT
733 }
734
ac1eb754 735 if (fd1 != -1 && st.st_size > 0) {
c627d613 736 buf = map_file(fd1,st.st_size);
9e31c482
AT
737 if (verbose > 2)
738 fprintf(FERROR,"recv mapped %s of size %d\n",fname,(int)st.st_size);
c627d613
AT
739 } else {
740 buf = NULL;
741 }
742
c627d613 743 /* open tmp file */
13a1f792
AT
744 if (strlen(fname) > (MAXPATHLEN-8)) {
745 fprintf(FERROR,"filename too long\n");
3ec4dd97 746 if (buf) unmap_file(buf);
fee64929 747 close(fd1);
13a1f792
AT
748 continue;
749 }
950ab32d
AT
750 if (tmpdir) {
751 char *f;
752 f = strrchr(fname,'/');
753 if (f == NULL)
754 f = fname;
755 else
756 f++;
757 sprintf(fnametmp,"%s/%s.XXXXXX",tmpdir,f);
758 } else {
759 sprintf(fnametmp,"%s.XXXXXX",fname);
760 }
c627d613 761 if (NULL == mktemp(fnametmp)) {
dc5ddbcc 762 fprintf(FERROR,"mktemp %s failed\n",fnametmp);
7b8356d0
AT
763 receive_data(f_in,buf,-1,NULL);
764 if (buf) unmap_file(buf);
765 close(fd1);
766 continue;
c627d613 767 }
950ab32d 768 fd2 = open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
fee64929 769 if (fd2 == -1 && relative_paths && errno == ENOENT &&
6574b4f7 770 create_directory_path(fnametmp) == 0) {
950ab32d 771 fd2 = open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
6574b4f7 772 }
c627d613 773 if (fd2 == -1) {
dc5ddbcc 774 fprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
7b8356d0
AT
775 receive_data(f_in,buf,-1,NULL);
776 if (buf) unmap_file(buf);
777 close(fd1);
778 continue;
c627d613
AT
779 }
780
781 cleanup_fname = fnametmp;
782
783 if (!am_server && verbose)
784 printf("%s\n",fname);
785
786 /* recv file data */
9e31c482 787 recv_ok = receive_data(f_in,buf,fd2,fname);
c627d613 788
3ec4dd97 789 if (buf) unmap_file(buf);
981791bd 790 if (fd1 != -1) {
981791bd
AT
791 close(fd1);
792 }
c627d613
AT
793 close(fd2);
794
795 if (verbose > 2)
dc5ddbcc 796 fprintf(FERROR,"renaming %s to %s\n",fnametmp,fname);
c627d613
AT
797
798 if (make_backups) {
799 char fnamebak[MAXPATHLEN];
13a1f792
AT
800 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
801 fprintf(FERROR,"backup filename too long\n");
802 continue;
803 }
c627d613 804 sprintf(fnamebak,"%s%s",fname,backup_suffix);
ac1eb754 805 if (rename(fname,fnamebak) != 0 && errno != ENOENT) {
dc5ddbcc 806 fprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
7b8356d0 807 continue;
c627d613
AT
808 }
809 }
810
811 /* move tmp file over real file */
812 if (rename(fnametmp,fname) != 0) {
950ab32d
AT
813 if (errno == EXDEV) {
814 /* rename failed on cross-filesystem link.
815 Copy the file instead. */
13dc412d 816 if (copy_file(fnametmp,fname, file->mode)) {
950ab32d
AT
817 fprintf(FERROR,"copy %s -> %s : %s\n",
818 fnametmp,fname,strerror(errno));
13dc412d
AT
819 } else {
820 set_perms(fname,file,NULL,0);
821 }
950ab32d
AT
822 unlink(fnametmp);
823 } else {
824 fprintf(FERROR,"rename %s -> %s : %s\n",
825 fnametmp,fname,strerror(errno));
826 unlink(fnametmp);
827 }
13dc412d
AT
828 } else {
829 set_perms(fname,file,NULL,0);
c627d613
AT
830 }
831
832 cleanup_fname = NULL;
833
9e31c482
AT
834
835 if (!recv_ok) {
836 if (verbose > 1)
837 fprintf(FERROR,"redoing %s(%d)\n",fname,i);
52296954
AT
838 if (csum_length == SUM_LENGTH)
839 fprintf(FERROR,"ERROR: file corruption in %s\n",fname);
9e31c482
AT
840 write_int(f_gen,i);
841 }
c627d613
AT
842 }
843
7c596906
AT
844 if (preserve_hard_links)
845 do_hard_links(flist);
846
7b8356d0
AT
847 /* now we need to fix any directory permissions that were
848 modified during the transfer */
7c596906 849 for (i = 0; i < flist->count; i++) {
3ec4dd97
AT
850 struct file_struct *file = flist->files[i];
851 if (!file->basename || !S_ISDIR(file->mode)) continue;
852 recv_generator(f_name(file),flist,i,-1);
7b8356d0 853 }
7b8356d0 854
c627d613 855 if (verbose > 2)
dc5ddbcc 856 fprintf(FERROR,"recv_files finished\n");
c627d613
AT
857
858 return 0;
859}
860
861
862
863off_t send_files(struct file_list *flist,int f_out,int f_in)
864{
865 int fd;
866 struct sum_struct *s;
c6e7fcb4 867 struct map_struct *buf;
c627d613
AT
868 struct stat st;
869 char fname[MAXPATHLEN];
870 off_t total=0;
871 int i;
dc5ddbcc 872 struct file_struct *file;
c6e7fcb4 873 int phase = 0;
c627d613
AT
874
875 if (verbose > 2)
dc5ddbcc 876 fprintf(FERROR,"send_files starting\n");
c627d613 877
720b47f2
AT
878 setup_nonblocking(f_in,f_out);
879
c627d613
AT
880 while (1)
881 {
882 i = read_int(f_in);
c6e7fcb4
AT
883 if (i == -1) {
884 if (phase==0 && remote_version >= 13) {
885 phase++;
9e31c482 886 csum_length = SUM_LENGTH;
c6e7fcb4
AT
887 write_int(f_out,-1);
888 write_flush(f_out);
9e31c482
AT
889 if (verbose > 2)
890 fprintf(FERROR,"send_files phase=%d\n",phase);
c6e7fcb4
AT
891 continue;
892 }
893 break;
894 }
c627d613 895
3ec4dd97 896 file = flist->files[i];
dc5ddbcc 897
c627d613 898 fname[0] = 0;
3ec4dd97
AT
899 if (file->basedir) {
900 strncpy(fname,file->basedir,MAXPATHLEN-1);
901 fname[MAXPATHLEN-1] = 0;
902 if (strlen(fname) == MAXPATHLEN-1) {
903 fprintf(FERROR, "send_files failed on long-named directory %s\n",
904 fname);
905 return -1;
906 }
907 strcat(fname,"/");
c627d613 908 }
3ec4dd97 909 strncat(fname,f_name(file),MAXPATHLEN-strlen(fname));
c627d613
AT
910
911 if (verbose > 2)
dc5ddbcc 912 fprintf(FERROR,"send_files(%d,%s)\n",i,fname);
c627d613
AT
913
914 if (dry_run) {
915 if (!am_server && verbose)
916 printf("%s\n",fname);
917 write_int(f_out,i);
918 continue;
919 }
920
921 s = receive_sums(f_in);
922 if (!s) {
dc5ddbcc 923 fprintf(FERROR,"receive_sums failed\n");
c627d613
AT
924 return -1;
925 }
926
927 fd = open(fname,O_RDONLY);
928 if (fd == -1) {
dc5ddbcc 929 fprintf(FERROR,"send_files failed to open %s: %s\n",
c627d613
AT
930 fname,strerror(errno));
931 continue;
932 }
933
934 /* map the local file */
935 if (fstat(fd,&st) != 0) {
dc5ddbcc 936 fprintf(FERROR,"fstat failed : %s\n",strerror(errno));
fee64929 937 close(fd);
c627d613
AT
938 return -1;
939 }
940
941 if (st.st_size > 0) {
942 buf = map_file(fd,st.st_size);
c627d613
AT
943 } else {
944 buf = NULL;
945 }
946
947 if (verbose > 2)
dc5ddbcc 948 fprintf(FERROR,"send_files mapped %s of size %d\n",
c627d613
AT
949 fname,(int)st.st_size);
950
951 write_int(f_out,i);
952
953 write_int(f_out,s->count);
954 write_int(f_out,s->n);
955 write_int(f_out,s->remainder);
956
957 if (verbose > 2)
dc5ddbcc 958 fprintf(FERROR,"calling match_sums %s\n",fname);
c627d613
AT
959
960 if (!am_server && verbose)
961 printf("%s\n",fname);
962
720b47f2 963 match_sums(f_out,s,buf,st.st_size);
c627d613
AT
964 write_flush(f_out);
965
1cdc8b50 966 if (buf) unmap_file(buf);
c627d613
AT
967 close(fd);
968
969 free_sums(s);
970
971 if (verbose > 2)
dc5ddbcc 972 fprintf(FERROR,"sender finished %s\n",fname);
c627d613
AT
973
974 total += st.st_size;
975 }
976
dc5ddbcc
AT
977 if (verbose > 2)
978 fprintf(FERROR,"send files finished\n");
979
c627d613
AT
980 match_report();
981
982 write_int(f_out,-1);
983 write_flush(f_out);
984
985 return total;
986}
987
988
989
c6e7fcb4 990void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
c627d613
AT
991{
992 int i;
9e31c482 993 int phase=0;
c627d613
AT
994
995 if (verbose > 2)
dc5ddbcc 996 fprintf(FERROR,"generator starting pid=%d count=%d\n",
c627d613
AT
997 (int)getpid(),flist->count);
998
999 for (i = 0; i < flist->count; i++) {
3ec4dd97 1000 struct file_struct *file = flist->files[i];
7b8356d0 1001 mode_t saved_mode = file->mode;
3ec4dd97 1002 if (!file->basename) continue;
7b8356d0
AT
1003
1004 /* we need to ensure that any directories we create have writeable
1005 permissions initially so that we can create the files within
1006 them. This is then fixed after the files are transferred */
1007 if (!am_root && S_ISDIR(file->mode)) {
1008 file->mode |= S_IWUSR; /* user write */
c627d613 1009 }
7b8356d0 1010
3ec4dd97 1011 recv_generator(local_name?local_name:f_name(file),
c627d613 1012 flist,i,f);
7b8356d0
AT
1013
1014 file->mode = saved_mode;
c627d613 1015 }
c6e7fcb4 1016
9e31c482
AT
1017 phase++;
1018 csum_length = SUM_LENGTH;
1019 ignore_times=1;
1020
1021 if (verbose > 2)
1022 fprintf(FERROR,"generate_files phase=%d\n",phase);
1023
c627d613
AT
1024 write_int(f,-1);
1025 write_flush(f);
c6e7fcb4
AT
1026
1027 if (remote_version >= 13) {
7b8356d0
AT
1028 /* in newer versions of the protocol the files can cycle through
1029 the system more than once to catch initial checksum errors */
c6e7fcb4 1030 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
3ec4dd97
AT
1031 struct file_struct *file = flist->files[i];
1032 recv_generator(local_name?local_name:f_name(file),
c6e7fcb4
AT
1033 flist,i,f);
1034 }
1035
9e31c482
AT
1036 phase++;
1037 if (verbose > 2)
1038 fprintf(FERROR,"generate_files phase=%d\n",phase);
1039
c6e7fcb4
AT
1040 write_int(f,-1);
1041 write_flush(f);
1042 }
1043
1044
c627d613 1045 if (verbose > 2)
dc5ddbcc 1046 fprintf(FERROR,"generator wrote %d\n",write_total());
c627d613 1047}
dc5ddbcc
AT
1048
1049