2 Copyright (C) Andrew Tridgell 1996
3 Copyright (C) Paul Mackerras 1996
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.
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.
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.
22 extern int csum_length;
26 extern int always_checksum;
27 extern time_t starttime;
29 extern int remote_version;
31 extern char *backup_suffix;
34 extern int whole_file;
35 extern int block_size;
36 extern int update_only;
37 extern int make_backups;
38 extern int preserve_links;
39 extern int preserve_hard_links;
40 extern int preserve_perms;
41 extern int preserve_devices;
42 extern int preserve_uid;
43 extern int preserve_gid;
44 extern int preserve_times;
46 extern int ignore_times;
48 extern int delete_mode;
49 extern int cvs_exclude;
51 extern int relative_paths;
52 extern int io_timeout;
54 extern struct stats stats;
59 static void free_sums(struct sum_struct *s)
61 if (s->sums) free(s->sums);
67 * delete a file or directory. If force_delet is set then delete
70 static int delete_file(char *fname)
75 extern int force_delete;
80 if (do_unlink(fname) == 0 || errno == ENOENT) return 0;
83 ret = do_lstat(fname, &st);
85 ret = do_stat(fname, &st);
88 rprintf(FERROR,"stat(%s) : %s\n", fname, strerror(errno));
92 if (!S_ISDIR(st.st_mode)) {
93 rprintf(FERROR,"unlink(%s) : %s\n", fname, strerror(errno));
97 if (do_rmdir(fname) == 0 || errno == ENOENT) return 0;
98 if (!force_delete || !recurse ||
99 (errno != ENOTEMPTY && errno != EEXIST)) {
100 rprintf(FERROR,"rmdir(%s) : %s\n", fname, strerror(errno));
104 /* now we do a recsursive delete on the directory ... */
107 rprintf(FERROR,"opendir(%s): %s\n",
108 fname,strerror(errno));
112 for (di=readdir(d); di; di=readdir(d)) {
113 char *dname = d_name(di);
114 if (strcmp(dname,".")==0 ||
115 strcmp(dname,"..")==0)
117 slprintf(buf, sizeof(buf)-1, "%s/%s", fname, dname);
119 rprintf(FINFO,"deleting %s\n", buf);
120 if (delete_file(buf) != 0) {
128 if (do_rmdir(fname) != 0) {
129 rprintf(FERROR,"rmdir(%s) : %s\n", fname, strerror(errno));
137 send a sums struct down a fd
139 static void send_sums(struct sum_struct *s,int f_out)
143 /* tell the other guy how many we are going to be doing and how many
144 bytes there are in the last chunk */
145 write_int(f_out,s?s->count:0);
146 write_int(f_out,s?s->n:block_size);
147 write_int(f_out,s?s->remainder:0);
149 for (i=0;i<s->count;i++) {
150 write_int(f_out,s->sums[i].sum1);
151 write_buf(f_out,s->sums[i].sum2,csum_length);
157 generate a stream of signatures/checksums that describe a buffer
159 generate approximately one checksum every n bytes
161 static struct sum_struct *generate_sums(struct map_struct *buf,OFF_T len,int n)
164 struct sum_struct *s;
167 int remainder = (len%block_len);
170 count = (len+(block_len-1))/block_len;
172 s = (struct sum_struct *)malloc(sizeof(*s));
173 if (!s) out_of_memory("generate_sums");
176 s->remainder = remainder;
186 rprintf(FINFO,"count=%d rem=%d n=%d flength=%d\n",
187 s->count,s->remainder,s->n,(int)s->flength);
189 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
190 if (!s->sums) out_of_memory("generate_sums");
192 for (i=0;i<count;i++) {
194 char *map = map_ptr(buf,offset,n1);
196 s->sums[i].sum1 = get_checksum1(map,n1);
197 get_checksum2(map,n1,s->sums[i].sum2);
199 s->sums[i].offset = offset;
204 rprintf(FINFO,"chunk[%d] offset=%d len=%d sum1=%08x\n",
205 i,(int)s->sums[i].offset,s->sums[i].len,s->sums[i].sum1);
216 receive the checksums for a buffer
218 static struct sum_struct *receive_sums(int f)
220 struct sum_struct *s;
224 s = (struct sum_struct *)malloc(sizeof(*s));
225 if (!s) out_of_memory("receive_sums");
227 s->count = read_int(f);
229 s->remainder = read_int(f);
233 rprintf(FINFO,"count=%d n=%d rem=%d\n",
234 s->count,s->n,s->remainder);
239 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
240 if (!s->sums) out_of_memory("receive_sums");
242 for (i=0;i<s->count;i++) {
243 s->sums[i].sum1 = read_int(f);
244 read_buf(f,s->sums[i].sum2,csum_length);
246 s->sums[i].offset = offset;
249 if (i == s->count-1 && s->remainder != 0) {
250 s->sums[i].len = s->remainder;
252 s->sums[i].len = s->n;
254 offset += s->sums[i].len;
257 rprintf(FINFO,"chunk[%d] len=%d offset=%d sum1=%08x\n",
258 i,s->sums[i].len,(int)s->sums[i].offset,s->sums[i].sum1);
267 static int set_perms(char *fname,struct file_struct *file,STRUCT_STAT *st,
272 extern int am_daemon;
274 if (dry_run) return 0;
277 if (link_stat(fname,&st2) != 0) {
278 rprintf(FERROR,"stat %s : %s\n",fname,strerror(errno));
284 if (preserve_times && !S_ISLNK(st->st_mode) &&
285 st->st_mtime != file->modtime) {
287 if (set_modtime(fname,file->modtime) != 0) {
288 rprintf(FERROR,"failed to set times on %s : %s\n",
289 fname,strerror(errno));
294 if ((am_root || !am_daemon) &&
295 ((am_root && preserve_uid && st->st_uid != file->uid) ||
296 (preserve_gid && st->st_gid != file->gid))) {
298 (am_root&&preserve_uid)?file->uid:-1,
299 preserve_gid?file->gid:-1) != 0) {
300 if (preserve_uid && st->st_uid != file->uid)
302 if (verbose>1 || preserve_uid) {
303 rprintf(FERROR,"chown %s : %s\n",
304 fname,strerror(errno));
313 if (preserve_perms && !S_ISLNK(st->st_mode) &&
314 (st->st_mode != file->mode ||
315 (updated && (file->mode & ~ACCESSPERMS)))) {
317 if (do_chmod(fname,file->mode) != 0) {
318 rprintf(FERROR,"failed to set permissions on %s : %s\n",
319 fname,strerror(errno));
325 if (verbose > 1 && report) {
327 rprintf(FINFO,"%s\n",fname);
329 rprintf(FINFO,"%s is uptodate\n",fname);
335 /* choose whether to skip a particular file */
336 static int skip_file(char *fname,
337 struct file_struct *file, STRUCT_STAT *st)
339 if (st->st_size != file->length) {
343 /* if always checksum is set then we use the checksum instead
344 of the file time to determine whether to sync */
345 if (always_checksum && S_ISREG(st->st_mode)) {
346 char sum[MD4_SUM_LENGTH];
347 file_checksum(fname,sum,st->st_size);
348 return (memcmp(sum,file->sum,csum_length) == 0);
355 return (st->st_mtime == file->modtime);
359 /* use a larger block size for really big files */
360 int adapt_block_size(struct file_struct *file, int bsize)
364 if (bsize != BLOCK_SIZE) return bsize;
366 ret = file->length / (10000); /* rough heuristic */
367 ret = ret & ~15; /* multiple of 16 */
368 if (ret < bsize) ret = bsize;
369 if (ret > CHUNK_SIZE/2) ret = CHUNK_SIZE/2;
373 void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
377 struct map_struct *buf;
378 struct sum_struct *s;
380 struct file_struct *file = flist->files[i];
383 rprintf(FINFO,"recv_generator(%s,%d)\n",fname,i);
385 statret = link_stat(fname,&st);
387 if (S_ISDIR(file->mode)) {
389 if (statret == 0 && !S_ISDIR(st.st_mode)) {
390 if (do_unlink(fname) != 0) {
391 rprintf(FERROR,"unlink %s : %s\n",fname,strerror(errno));
396 if (statret != 0 && do_mkdir(fname,file->mode) != 0 && errno != EEXIST) {
397 if (!(relative_paths && errno==ENOENT &&
398 create_directory_path(fname)==0 &&
399 do_mkdir(fname,file->mode)==0)) {
400 rprintf(FERROR,"mkdir %s : %s (2)\n",
401 fname,strerror(errno));
404 if (set_perms(fname,file,NULL,0) && verbose)
405 rprintf(FINFO,"%s/\n",fname);
409 if (preserve_links && S_ISLNK(file->mode)) {
411 char lnk[MAXPATHLEN];
414 l = readlink(fname,lnk,MAXPATHLEN-1);
417 if (strcmp(lnk,file->link) == 0) {
418 set_perms(fname,file,&st,1);
424 if (do_symlink(file->link,fname) != 0) {
425 rprintf(FERROR,"link %s -> %s : %s\n",
426 fname,file->link,strerror(errno));
428 set_perms(fname,file,NULL,0);
430 rprintf(FINFO,"%s -> %s\n",
438 if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
440 st.st_mode != file->mode ||
441 st.st_rdev != file->rdev) {
444 rprintf(FINFO,"mknod(%s,0%o,0x%x)\n",
445 fname,(int)file->mode,(int)file->rdev);
446 if (do_mknod(fname,file->mode,file->rdev) != 0) {
447 rprintf(FERROR,"mknod %s : %s\n",fname,strerror(errno));
449 set_perms(fname,file,NULL,0);
451 rprintf(FINFO,"%s\n",fname);
454 set_perms(fname,file,&st,1);
460 if (preserve_hard_links && check_hard_link(file)) {
462 rprintf(FINFO,"%s is a hard link\n",f_name(file));
466 if (!S_ISREG(file->mode)) {
467 rprintf(FINFO,"skipping non-regular file %s\n",fname);
472 if (errno == ENOENT) {
474 if (!dry_run) send_sums(NULL,f_out);
477 rprintf(FERROR,"recv_generator failed to open %s\n",fname);
482 if (!S_ISREG(st.st_mode)) {
483 if (delete_file(fname) != 0) {
487 /* now pretend the file didn't exist */
489 if (!dry_run) send_sums(NULL,f_out);
493 if (update_only && st.st_mtime > file->modtime) {
495 rprintf(FINFO,"%s is newer\n",fname);
499 if (skip_file(fname, file, &st)) {
500 set_perms(fname,file,&st,1);
511 send_sums(NULL,f_out);
516 fd = open(fname,O_RDONLY);
519 rprintf(FERROR,"failed to open %s : %s\n",fname,strerror(errno));
520 rprintf(FERROR,"skipping %s\n",fname);
524 if (st.st_size > 0) {
525 buf = map_file(fd,st.st_size);
531 rprintf(FINFO,"gen mapped %s of size %d\n",fname,(int)st.st_size);
533 s = generate_sums(buf,st.st_size,adapt_block_size(file, block_size));
536 rprintf(FINFO,"sending sums for %d\n",i);
542 if (buf) unmap_file(buf);
549 static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname)
551 int i,n,remainder,len,count;
555 static char file_sum1[MD4_SUM_LENGTH];
556 static char file_sum2[MD4_SUM_LENGTH];
559 count = read_int(f_in);
561 remainder = read_int(f_in);
565 for (i=recv_token(f_in,&data); i != 0; i=recv_token(f_in,&data)) {
568 rprintf(FINFO,"data recv %d at %d\n",i,(int)offset);
570 stats.literal_data += i;
573 if (fd != -1 && write_file(fd,data,i) != i) {
574 rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
582 if (i == count-1 && remainder != 0)
585 stats.matched_data += len;
588 rprintf(FINFO,"chunk[%d] of size %d at %d offset=%d\n",
589 i,len,(int)offset2,(int)offset);
591 map = map_ptr(buf,offset2,len);
596 if (fd != -1 && write_file(fd,map,len) != len) {
597 rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
604 if (fd != -1 && offset > 0 && sparse_end(fd) != 0) {
605 rprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
611 if (remote_version >= 14) {
612 read_buf(f_in,file_sum2,MD4_SUM_LENGTH);
614 rprintf(FINFO,"got file_sum\n");
615 if (fd != -1 && memcmp(file_sum1,file_sum2,MD4_SUM_LENGTH) != 0)
622 static void delete_one(struct file_struct *f)
624 if (!S_ISDIR(f->mode)) {
625 if (do_unlink(f_name(f)) != 0) {
626 rprintf(FERROR,"unlink %s : %s\n",f_name(f),strerror(errno));
627 } else if (verbose) {
628 rprintf(FINFO,"deleting %s\n",f_name(f));
631 if (do_rmdir(f_name(f)) != 0) {
632 if (errno != ENOTEMPTY && errno != EEXIST)
633 rprintf(FERROR,"rmdir %s : %s\n",f_name(f),strerror(errno));
634 } else if (verbose) {
635 rprintf(FINFO,"deleting directory %s\n",f_name(f));
642 static struct delete_list {
646 static int dlist_len, dlist_alloc_len;
648 static void add_delete_entry(struct file_struct *file)
650 if (dlist_len == dlist_alloc_len) {
651 dlist_alloc_len += 1024;
652 delete_list = (struct delete_list *)Realloc(delete_list, sizeof(delete_list[0])*dlist_alloc_len);
653 if (!delete_list) out_of_memory("add_delete_entry");
656 delete_list[dlist_len].dev = file->dev;
657 delete_list[dlist_len].inode = file->inode;
661 rprintf(FINFO,"added %s to delete list\n", f_name(file));
664 /* yuck! This function wouldn't have been necessary if I had the sorting
665 algorithm right. Unfortunately fixing the sorting algorithm would introduce
666 a backward incompatibility as file list indexes are sent over the link.
668 static int delete_already_done(struct file_list *flist,int j)
673 if (link_stat(f_name(flist->files[j]), &st)) return 1;
675 for (i=0;i<dlist_len;i++) {
676 if (st.st_ino == delete_list[i].inode &&
677 st.st_dev == delete_list[i].dev)
685 /* this deletes any files on the receiving side that are not present
686 on the sending side. For version 1.6.4 I have changed the behaviour
687 to match more closely what most people seem to expect of this option */
688 static void delete_files(struct file_list *flist)
690 struct file_list *local_file_list;
698 rprintf(FINFO,"IO error encountered - skipping file deletion\n");
702 for (j=0;j<flist->count;j++) {
703 if (!S_ISDIR(flist->files[j]->mode) ||
704 !(flist->files[j]->flags & FLAG_DELETE)) continue;
706 if (remote_version < 19 &&
707 delete_already_done(flist, j)) continue;
709 name = strdup(f_name(flist->files[j]));
711 if (!(local_file_list = send_file_list(-1,1,&name))) {
717 rprintf(FINFO,"deleting in %s\n", name);
719 for (i=local_file_list->count-1;i>=0;i--) {
720 if (!local_file_list->files[i]->basename) continue;
721 if (remote_version < 19 &&
722 S_ISDIR(local_file_list->files[i]->mode))
723 add_delete_entry(local_file_list->files[i]);
724 if (-1 == flist_find(flist,local_file_list->files[i])) {
725 delete_one(local_file_list->files[i]);
728 flist_free(local_file_list);
733 static char *cleanup_fname;
734 static char *cleanup_new_fname;
735 static struct file_struct *cleanup_file;
736 static void finish_transfer(char *fname, char *fnametmp, struct file_struct *file);
738 void exit_cleanup(int code)
740 extern int keep_partial;
742 if (cleanup_fname && keep_partial) {
743 finish_transfer(cleanup_new_fname, cleanup_fname, cleanup_file);
746 if (cleanup_fname && !keep_partial)
747 do_unlink(cleanup_fname);
748 signal(SIGUSR1, SIG_IGN);
763 static int get_tmpname(char *fnametmp, char *fname)
769 f = strrchr(fname,'/');
774 if (strlen(tmpdir)+strlen(f)+10 > MAXPATHLEN) {
775 rprintf(FERROR,"filename too long\n");
778 slprintf(fnametmp,MAXPATHLEN-1, "%s/.%s.XXXXXX",tmpdir,f);
782 f = strrchr(fname,'/');
784 if (strlen(fname)+9 > MAXPATHLEN) {
785 rprintf(FERROR,"filename too long\n");
791 slprintf(fnametmp,MAXPATHLEN-1,"%s/.%s.XXXXXX",
795 slprintf(fnametmp,MAXPATHLEN-1,".%s.XXXXXX",fname);
801 /* finish off a file transfer, renaming the file and setting the permissions
803 static void finish_transfer(char *fname, char *fnametmp, struct file_struct *file)
806 char fnamebak[MAXPATHLEN];
807 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
808 rprintf(FERROR,"backup filename too long\n");
811 slprintf(fnamebak,sizeof(fnamebak)-1,"%s%s",fname,backup_suffix);
812 if (do_rename(fname,fnamebak) != 0 && errno != ENOENT) {
813 rprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
818 /* move tmp file over real file */
819 if (do_rename(fnametmp,fname) != 0) {
820 if (errno == EXDEV) {
821 /* rename failed on cross-filesystem link.
822 Copy the file instead. */
823 if (copy_file(fnametmp,fname, file->mode)) {
824 rprintf(FERROR,"copy %s -> %s : %s\n",
825 fnametmp,fname,strerror(errno));
827 set_perms(fname,file,NULL,0);
831 rprintf(FERROR,"rename %s -> %s : %s\n",
832 fnametmp,fname,strerror(errno));
836 set_perms(fname,file,NULL,0);
841 int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
846 char fnametmp[MAXPATHLEN];
847 struct map_struct *buf;
849 struct file_struct *file;
854 rprintf(FINFO,"recv_files(%d) starting\n",flist->count);
857 if (recurse && delete_mode && !local_name && flist->count>0) {
862 cleanup_fname = NULL;
863 cleanup_new_fname = NULL;
867 if (phase==0 && remote_version >= 13) {
869 csum_length = SUM_LENGTH;
871 rprintf(FINFO,"recv_files phase=%d\n",phase);
878 if (i < 0 || i >= flist->count) {
879 rprintf(FERROR,"Invalid file index %d in recv_files (count=%d)\n",
884 file = flist->files[i];
885 fname = f_name(file);
887 stats.num_transferred_files++;
888 stats.total_transferred_size += file->length;
894 if (!am_server && verbose)
895 printf("%s\n",fname);
900 rprintf(FINFO,"recv_files(%s)\n",fname);
903 fd1 = open(fname,O_RDONLY);
905 if (fd1 != -1 && do_fstat(fd1,&st) != 0) {
906 rprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
907 receive_data(f_in,NULL,-1,NULL);
912 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
913 rprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
914 receive_data(f_in,NULL,-1,NULL);
919 if (fd1 != -1 && st.st_size > 0) {
920 buf = map_file(fd1,st.st_size);
922 rprintf(FINFO,"recv mapped %s of size %d\n",fname,(int)st.st_size);
927 if (!get_tmpname(fnametmp,fname)) {
928 if (buf) unmap_file(buf);
933 if (NULL == do_mktemp(fnametmp)) {
934 rprintf(FERROR,"mktemp %s failed\n",fnametmp);
935 receive_data(f_in,buf,-1,NULL);
936 if (buf) unmap_file(buf);
941 /* we initially set the perms without the
942 setuid/setgid bits to ensure that there is no race
943 condition. They are then correctly updated after
944 the lchown. Thanks to snabb@epipe.fi for pointing
946 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,
947 file->mode & ACCESSPERMS);
949 if (fd2 == -1 && relative_paths && errno == ENOENT &&
950 create_directory_path(fnametmp) == 0) {
951 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,
952 file->mode & ACCESSPERMS);
955 rprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
956 receive_data(f_in,buf,-1,NULL);
957 if (buf) unmap_file(buf);
962 cleanup_fname = fnametmp;
963 cleanup_new_fname = fname;
966 if (!am_server && verbose)
967 printf("%s\n",fname);
970 recv_ok = receive_data(f_in,buf,fd2,fname);
972 if (buf) unmap_file(buf);
979 rprintf(FINFO,"renaming %s to %s\n",fnametmp,fname);
981 finish_transfer(fname, fnametmp, file);
983 cleanup_fname = NULL;
984 cleanup_new_fname = NULL;
988 if (csum_length == SUM_LENGTH) {
989 rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
993 rprintf(FINFO,"redoing %s(%d)\n",fname,i);
999 if (preserve_hard_links)
1000 do_hard_links(flist);
1002 /* now we need to fix any directory permissions that were
1003 modified during the transfer */
1004 for (i = 0; i < flist->count; i++) {
1005 file = flist->files[i];
1006 if (!file->basename || !S_ISDIR(file->mode)) continue;
1007 recv_generator(f_name(file),flist,i,-1);
1011 rprintf(FINFO,"recv_files finished\n");
1018 void send_files(struct file_list *flist,int f_out,int f_in)
1021 struct sum_struct *s;
1022 struct map_struct *buf;
1024 char fname[MAXPATHLEN];
1026 struct file_struct *file;
1030 rprintf(FINFO,"send_files starting\n");
1032 setup_readbuffer(f_in);
1039 if (phase==0 && remote_version >= 13) {
1041 csum_length = SUM_LENGTH;
1042 write_int(f_out,-1);
1044 rprintf(FINFO,"send_files phase=%d\n",phase);
1050 if (i < 0 || i >= flist->count) {
1051 rprintf(FERROR,"Invalid file index %d (count=%d)\n",
1056 file = flist->files[i];
1058 stats.num_transferred_files++;
1059 stats.total_transferred_size += file->length;
1062 if (file->basedir) {
1063 strlcpy(fname,file->basedir,MAXPATHLEN-1);
1064 if (strlen(fname) == MAXPATHLEN-1) {
1066 rprintf(FERROR, "send_files failed on long-named directory %s\n",
1070 strlcat(fname,"/",MAXPATHLEN-1);
1071 offset = strlen(file->basedir)+1;
1073 strlcat(fname,f_name(file),MAXPATHLEN-strlen(fname));
1076 rprintf(FINFO,"send_files(%d,%s)\n",i,fname);
1079 if (!am_server && verbose)
1080 printf("%s\n",fname);
1085 s = receive_sums(f_in);
1088 rprintf(FERROR,"receive_sums failed\n");
1092 fd = open(fname,O_RDONLY);
1095 rprintf(FERROR,"send_files failed to open %s: %s\n",
1096 fname,strerror(errno));
1101 /* map the local file */
1102 if (do_fstat(fd,&st) != 0) {
1104 rprintf(FERROR,"fstat failed : %s\n",strerror(errno));
1110 if (st.st_size > 0) {
1111 buf = map_file(fd,st.st_size);
1117 rprintf(FINFO,"send_files mapped %s of size %d\n",
1118 fname,(int)st.st_size);
1122 write_int(f_out,s->count);
1123 write_int(f_out,s->n);
1124 write_int(f_out,s->remainder);
1127 rprintf(FINFO,"calling match_sums %s\n",fname);
1129 if (!am_server && verbose)
1130 printf("%s\n",fname+offset);
1132 match_sums(f_out,s,buf,st.st_size);
1134 if (buf) unmap_file(buf);
1140 rprintf(FINFO,"sender finished %s\n",fname);
1144 rprintf(FINFO,"send files finished\n");
1148 write_int(f_out,-1);
1153 void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
1159 rprintf(FINFO,"generator starting pid=%d count=%d\n",
1160 (int)getpid(),flist->count);
1162 for (i = 0; i < flist->count; i++) {
1163 struct file_struct *file = flist->files[i];
1164 mode_t saved_mode = file->mode;
1165 if (!file->basename) continue;
1167 /* we need to ensure that any directories we create have writeable
1168 permissions initially so that we can create the files within
1169 them. This is then fixed after the files are transferred */
1170 if (!am_root && S_ISDIR(file->mode)) {
1171 file->mode |= S_IWUSR; /* user write */
1174 recv_generator(local_name?local_name:f_name(file),
1177 file->mode = saved_mode;
1181 csum_length = SUM_LENGTH;
1185 rprintf(FINFO,"generate_files phase=%d\n",phase);
1189 /* we expect to just sit around now, so don't exit on a timeout. If we
1190 really get a timeout then the other process should exit */
1193 if (remote_version >= 13) {
1194 /* in newer versions of the protocol the files can cycle through
1195 the system more than once to catch initial checksum errors */
1196 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
1197 struct file_struct *file = flist->files[i];
1198 recv_generator(local_name?local_name:f_name(file),
1204 rprintf(FINFO,"generate_files phase=%d\n",phase);