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