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;
735 void exit_cleanup(int code)
739 do_unlink(cleanup_fname);
740 signal(SIGUSR1, SIG_IGN);
755 static int get_tmpname(char *fnametmp, char *fname)
761 f = strrchr(fname,'/');
766 if (strlen(tmpdir)+strlen(f)+10 > MAXPATHLEN) {
767 rprintf(FERROR,"filename too long\n");
770 slprintf(fnametmp,MAXPATHLEN-1, "%s/.%s.XXXXXX",tmpdir,f);
774 f = strrchr(fname,'/');
776 if (strlen(fname)+9 > MAXPATHLEN) {
777 rprintf(FERROR,"filename too long\n");
783 slprintf(fnametmp,MAXPATHLEN-1,"%s/.%s.XXXXXX",
787 slprintf(fnametmp,MAXPATHLEN-1,".%s.XXXXXX",fname);
793 int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
798 char fnametmp[MAXPATHLEN];
799 struct map_struct *buf;
801 struct file_struct *file;
806 rprintf(FINFO,"recv_files(%d) starting\n",flist->count);
809 if (recurse && delete_mode && !local_name && flist->count>0) {
816 if (phase==0 && remote_version >= 13) {
818 csum_length = SUM_LENGTH;
820 rprintf(FINFO,"recv_files phase=%d\n",phase);
827 if (i < 0 || i >= flist->count) {
828 rprintf(FERROR,"Invalid file index %d in recv_files (count=%d)\n",
833 file = flist->files[i];
834 fname = f_name(file);
836 stats.num_transferred_files++;
837 stats.total_transferred_size += file->length;
843 if (!am_server && verbose)
844 printf("%s\n",fname);
849 rprintf(FINFO,"recv_files(%s)\n",fname);
852 fd1 = open(fname,O_RDONLY);
854 if (fd1 != -1 && do_fstat(fd1,&st) != 0) {
855 rprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
856 receive_data(f_in,NULL,-1,NULL);
861 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
862 rprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
863 receive_data(f_in,NULL,-1,NULL);
868 if (fd1 != -1 && st.st_size > 0) {
869 buf = map_file(fd1,st.st_size);
871 rprintf(FINFO,"recv mapped %s of size %d\n",fname,(int)st.st_size);
876 if (!get_tmpname(fnametmp,fname)) {
877 if (buf) unmap_file(buf);
882 if (NULL == do_mktemp(fnametmp)) {
883 rprintf(FERROR,"mktemp %s failed\n",fnametmp);
884 receive_data(f_in,buf,-1,NULL);
885 if (buf) unmap_file(buf);
890 /* we initially set the perms without the
891 setuid/setgid bits to ensure that there is no race
892 condition. They are then correctly updated after
893 the lchown. Thanks to snabb@epipe.fi for pointing
895 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,
896 file->mode & ACCESSPERMS);
898 if (fd2 == -1 && relative_paths && errno == ENOENT &&
899 create_directory_path(fnametmp) == 0) {
900 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,
901 file->mode & ACCESSPERMS);
904 rprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
905 receive_data(f_in,buf,-1,NULL);
906 if (buf) unmap_file(buf);
911 cleanup_fname = fnametmp;
913 if (!am_server && verbose)
914 printf("%s\n",fname);
917 recv_ok = receive_data(f_in,buf,fd2,fname);
919 if (buf) unmap_file(buf);
926 rprintf(FINFO,"renaming %s to %s\n",fnametmp,fname);
929 char fnamebak[MAXPATHLEN];
930 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
931 rprintf(FERROR,"backup filename too long\n");
934 slprintf(fnamebak,sizeof(fnamebak)-1,"%s%s",fname,backup_suffix);
935 if (do_rename(fname,fnamebak) != 0 && errno != ENOENT) {
936 rprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
941 /* move tmp file over real file */
942 if (do_rename(fnametmp,fname) != 0) {
943 if (errno == EXDEV) {
944 /* rename failed on cross-filesystem link.
945 Copy the file instead. */
946 if (copy_file(fnametmp,fname, file->mode)) {
947 rprintf(FERROR,"copy %s -> %s : %s\n",
948 fnametmp,fname,strerror(errno));
950 set_perms(fname,file,NULL,0);
954 rprintf(FERROR,"rename %s -> %s : %s\n",
955 fnametmp,fname,strerror(errno));
959 set_perms(fname,file,NULL,0);
962 cleanup_fname = NULL;
966 if (csum_length == SUM_LENGTH) {
967 rprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
971 rprintf(FINFO,"redoing %s(%d)\n",fname,i);
977 if (preserve_hard_links)
978 do_hard_links(flist);
980 /* now we need to fix any directory permissions that were
981 modified during the transfer */
982 for (i = 0; i < flist->count; i++) {
983 file = flist->files[i];
984 if (!file->basename || !S_ISDIR(file->mode)) continue;
985 recv_generator(f_name(file),flist,i,-1);
989 rprintf(FINFO,"recv_files finished\n");
996 void send_files(struct file_list *flist,int f_out,int f_in)
999 struct sum_struct *s;
1000 struct map_struct *buf;
1002 char fname[MAXPATHLEN];
1004 struct file_struct *file;
1008 rprintf(FINFO,"send_files starting\n");
1010 setup_readbuffer(f_in);
1017 if (phase==0 && remote_version >= 13) {
1019 csum_length = SUM_LENGTH;
1020 write_int(f_out,-1);
1022 rprintf(FINFO,"send_files phase=%d\n",phase);
1028 if (i < 0 || i >= flist->count) {
1029 rprintf(FERROR,"Invalid file index %d (count=%d)\n",
1034 file = flist->files[i];
1036 stats.num_transferred_files++;
1037 stats.total_transferred_size += file->length;
1040 if (file->basedir) {
1041 strlcpy(fname,file->basedir,MAXPATHLEN-1);
1042 if (strlen(fname) == MAXPATHLEN-1) {
1044 rprintf(FERROR, "send_files failed on long-named directory %s\n",
1048 strlcat(fname,"/",MAXPATHLEN-1);
1049 offset = strlen(file->basedir)+1;
1051 strlcat(fname,f_name(file),MAXPATHLEN-strlen(fname));
1054 rprintf(FINFO,"send_files(%d,%s)\n",i,fname);
1057 if (!am_server && verbose)
1058 printf("%s\n",fname);
1063 s = receive_sums(f_in);
1066 rprintf(FERROR,"receive_sums failed\n");
1070 fd = open(fname,O_RDONLY);
1073 rprintf(FERROR,"send_files failed to open %s: %s\n",
1074 fname,strerror(errno));
1079 /* map the local file */
1080 if (do_fstat(fd,&st) != 0) {
1082 rprintf(FERROR,"fstat failed : %s\n",strerror(errno));
1088 if (st.st_size > 0) {
1089 buf = map_file(fd,st.st_size);
1095 rprintf(FINFO,"send_files mapped %s of size %d\n",
1096 fname,(int)st.st_size);
1100 write_int(f_out,s->count);
1101 write_int(f_out,s->n);
1102 write_int(f_out,s->remainder);
1105 rprintf(FINFO,"calling match_sums %s\n",fname);
1107 if (!am_server && verbose)
1108 printf("%s\n",fname+offset);
1110 match_sums(f_out,s,buf,st.st_size);
1112 if (buf) unmap_file(buf);
1118 rprintf(FINFO,"sender finished %s\n",fname);
1122 rprintf(FINFO,"send files finished\n");
1126 write_int(f_out,-1);
1131 void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
1137 rprintf(FINFO,"generator starting pid=%d count=%d\n",
1138 (int)getpid(),flist->count);
1140 for (i = 0; i < flist->count; i++) {
1141 struct file_struct *file = flist->files[i];
1142 mode_t saved_mode = file->mode;
1143 if (!file->basename) continue;
1145 /* we need to ensure that any directories we create have writeable
1146 permissions initially so that we can create the files within
1147 them. This is then fixed after the files are transferred */
1148 if (!am_root && S_ISDIR(file->mode)) {
1149 file->mode |= S_IWUSR; /* user write */
1152 recv_generator(local_name?local_name:f_name(file),
1155 file->mode = saved_mode;
1159 csum_length = SUM_LENGTH;
1163 rprintf(FINFO,"generate_files phase=%d\n",phase);
1167 /* we expect to just sit around now, so don't exit on a timeout. If we
1168 really get a timeout then the other process should exit */
1171 if (remote_version >= 13) {
1172 /* in newer versions of the protocol the files can cycle through
1173 the system more than once to catch initial checksum errors */
1174 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
1175 struct file_struct *file = flist->files[i];
1176 recv_generator(local_name?local_name:f_name(file),
1182 rprintf(FINFO,"generate_files phase=%d\n",phase);