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