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;
56 static void free_sums(struct sum_struct *s)
58 if (s->sums) free(s->sums);
64 * delete a file or directory. If force_delet is set then delete
67 static int delete_file(char *fname)
72 extern int force_delete;
76 if (do_unlink(fname) == 0 || errno == ENOENT) return 0;
79 ret = lstat(fname, &st);
81 ret = stat(fname, &st);
84 fprintf(FERROR,"stat(%s) : %s\n", fname, strerror(errno));
88 if (!S_ISDIR(st.st_mode)) {
89 fprintf(FERROR,"unlink(%s) : %s\n", fname, strerror(errno));
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));
99 /* now we do a recsursive delete on the directory ... */
102 fprintf(FERROR,"opendir(%s): %s\n",
103 fname,strerror(errno));
107 for (di=readdir(d); di; di=readdir(d)) {
108 if (strcmp(di->d_name,".")==0 ||
109 strcmp(di->d_name,"..")==0)
111 strncpy(buf, fname, (MAXPATHLEN-strlen(di->d_name))-2);
113 strcat(buf, di->d_name);
114 buf[MAXPATHLEN-1] = 0;
116 fprintf(FINFO,"deleting %s\n", buf);
117 if (delete_file(buf) != 0) {
125 if (do_rmdir(fname) != 0) {
126 fprintf(FERROR,"rmdir(%s) : %s\n", fname, strerror(errno));
134 send a sums struct down a fd
136 static void send_sums(struct sum_struct *s,int f_out)
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);
146 for (i=0;i<s->count;i++) {
147 write_int(f_out,s->sums[i].sum1);
148 write_buf(f_out,s->sums[i].sum2,csum_length);
155 generate a stream of signatures/checksums that describe a buffer
157 generate approximately one checksum every n bytes
159 static struct sum_struct *generate_sums(struct map_struct *buf,off_t len,int n)
162 struct sum_struct *s;
165 int remainder = (len%block_len);
168 count = (len+(block_len-1))/block_len;
170 s = (struct sum_struct *)malloc(sizeof(*s));
171 if (!s) out_of_memory("generate_sums");
174 s->remainder = remainder;
184 fprintf(FERROR,"count=%d rem=%d n=%d flength=%d\n",
185 s->count,s->remainder,s->n,(int)s->flength);
187 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
188 if (!s->sums) out_of_memory("generate_sums");
190 for (i=0;i<count;i++) {
192 char *map = map_ptr(buf,offset,n1);
194 s->sums[i].sum1 = get_checksum1(map,n1);
195 get_checksum2(map,n1,s->sums[i].sum2);
197 s->sums[i].offset = offset;
202 fprintf(FERROR,"chunk[%d] offset=%d len=%d sum1=%08x\n",
203 i,(int)s->sums[i].offset,s->sums[i].len,s->sums[i].sum1);
214 receive the checksums for a buffer
216 static struct sum_struct *receive_sums(int f)
218 struct sum_struct *s;
222 s = (struct sum_struct *)malloc(sizeof(*s));
223 if (!s) out_of_memory("receive_sums");
225 s->count = read_int(f);
227 s->remainder = read_int(f);
231 fprintf(FERROR,"count=%d n=%d rem=%d\n",
232 s->count,s->n,s->remainder);
237 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
238 if (!s->sums) out_of_memory("receive_sums");
240 for (i=0;i<s->count;i++) {
241 s->sums[i].sum1 = read_int(f);
242 read_buf(f,s->sums[i].sum2,csum_length);
244 s->sums[i].offset = offset;
247 if (i == s->count-1 && s->remainder != 0) {
248 s->sums[i].len = s->remainder;
250 s->sums[i].len = s->n;
252 offset += s->sums[i].len;
255 fprintf(FERROR,"chunk[%d] len=%d offset=%d sum1=%08x\n",
256 i,s->sums[i].len,(int)s->sums[i].offset,s->sums[i].sum1);
265 static int set_perms(char *fname,struct file_struct *file,struct stat *st,
271 if (dry_run) return 0;
274 if (link_stat(fname,&st2) != 0) {
275 fprintf(FERROR,"stat %s : %s\n",fname,strerror(errno));
281 if (preserve_times && !S_ISLNK(st->st_mode) &&
282 st->st_mtime != file->modtime) {
284 if (set_modtime(fname,file->modtime) != 0) {
285 fprintf(FERROR,"failed to set times on %s : %s\n",
286 fname,strerror(errno));
292 if (preserve_perms && !S_ISLNK(st->st_mode) &&
293 st->st_mode != file->mode) {
295 if (do_chmod(fname,file->mode) != 0) {
296 fprintf(FERROR,"failed to set permissions on %s : %s\n",
297 fname,strerror(errno));
303 if ((am_root && preserve_uid && st->st_uid != file->uid) ||
304 (preserve_gid && st->st_gid != file->gid)) {
306 (am_root&&preserve_uid)?file->uid:-1,
307 preserve_gid?file->gid:-1) != 0) {
308 if (preserve_uid && st->st_uid != file->uid)
310 if (verbose>1 || preserve_uid)
311 fprintf(FERROR,"chown %s : %s\n",
312 fname,strerror(errno));
318 if (verbose > 1 && report) {
320 fprintf(FINFO,"%s\n",fname);
322 fprintf(FINFO,"%s is uptodate\n",fname);
328 /* choose whether to skip a particular file */
329 static int skip_file(char *fname,
330 struct file_struct *file, struct stat *st)
332 if (st->st_size != file->length) {
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);
348 return (st->st_mtime == file->modtime);
352 /* use a larger block size for really big files */
353 int adapt_block_size(struct file_struct *file, int bsize)
355 int ret = file->length / (10000); /* rough heuristic */
356 ret = ret & ~15; /* multiple of 16 */
357 if (ret < bsize) ret = bsize;
358 if (ret > CHUNK_SIZE/2) ret = CHUNK_SIZE/2;
362 void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
366 struct map_struct *buf;
367 struct sum_struct *s;
369 struct file_struct *file = flist->files[i];
372 fprintf(FERROR,"recv_generator(%s,%d)\n",fname,i);
374 statret = link_stat(fname,&st);
376 if (S_ISDIR(file->mode)) {
378 if (statret == 0 && !S_ISDIR(st.st_mode)) {
379 if (do_unlink(fname) != 0) {
380 fprintf(FERROR,"unlink %s : %s\n",fname,strerror(errno));
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));
393 if (set_perms(fname,file,NULL,0) && verbose)
394 fprintf(FINFO,"%s/\n",fname);
398 if (preserve_links && S_ISLNK(file->mode)) {
400 char lnk[MAXPATHLEN];
403 l = readlink(fname,lnk,MAXPATHLEN-1);
406 if (strcmp(lnk,file->link) == 0) {
407 set_perms(fname,file,&st,1);
413 if (do_symlink(file->link,fname) != 0) {
414 fprintf(FERROR,"link %s -> %s : %s\n",
415 fname,file->link,strerror(errno));
417 set_perms(fname,file,NULL,0);
419 fprintf(FINFO,"%s -> %s\n",
427 if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
429 st.st_mode != file->mode ||
430 st.st_rdev != file->rdev) {
433 fprintf(FERROR,"mknod(%s,0%o,0x%x)\n",
434 fname,(int)file->mode,(int)file->rdev);
435 if (do_mknod(fname,file->mode,file->rdev) != 0) {
436 fprintf(FERROR,"mknod %s : %s\n",fname,strerror(errno));
438 set_perms(fname,file,NULL,0);
440 fprintf(FINFO,"%s\n",fname);
443 set_perms(fname,file,&st,1);
449 if (preserve_hard_links && check_hard_link(file)) {
451 fprintf(FINFO,"%s is a hard link\n",f_name(file));
455 if (!S_ISREG(file->mode)) {
456 fprintf(FERROR,"skipping non-regular file %s\n",fname);
461 if (errno == ENOENT) {
463 if (!dry_run) send_sums(NULL,f_out);
466 fprintf(FERROR,"recv_generator failed to open %s\n",fname);
471 if (!S_ISREG(st.st_mode)) {
472 if (delete_file(fname) != 0) {
476 /* now pretend the file didn't exist */
478 if (!dry_run) send_sums(NULL,f_out);
482 if (update_only && st.st_mtime > file->modtime) {
484 fprintf(FERROR,"%s is newer\n",fname);
488 if (skip_file(fname, file, &st)) {
489 set_perms(fname,file,&st,1);
500 send_sums(NULL,f_out);
505 fd = open(fname,O_RDONLY);
508 fprintf(FERROR,"failed to open %s : %s\n",fname,strerror(errno));
509 fprintf(FERROR,"skipping %s\n",fname);
513 if (st.st_size > 0) {
514 buf = map_file(fd,st.st_size);
520 fprintf(FERROR,"gen mapped %s of size %d\n",fname,(int)st.st_size);
522 s = generate_sums(buf,st.st_size,adapt_block_size(file, block_size));
525 fprintf(FERROR,"sending sums for %d\n",i);
532 if (buf) unmap_file(buf);
539 static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname)
541 int i,n,remainder,len,count;
545 static char file_sum1[MD4_SUM_LENGTH];
546 static char file_sum2[MD4_SUM_LENGTH];
549 count = read_int(f_in);
551 remainder = read_int(f_in);
555 for (i=recv_token(f_in,&data); i != 0; i=recv_token(f_in,&data)) {
558 fprintf(FERROR,"data recv %d at %d\n",i,(int)offset);
562 if (fd != -1 && write_sparse(fd,data,i) != i) {
563 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
571 if (i == count-1 && remainder != 0)
575 fprintf(FERROR,"chunk[%d] of size %d at %d offset=%d\n",
576 i,len,(int)offset2,(int)offset);
578 map = map_ptr(buf,offset2,len);
583 if (fd != -1 && write_sparse(fd,map,len) != len) {
584 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
591 if (fd != -1 && offset > 0 && sparse_end(fd) != 0) {
592 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
598 if (remote_version >= 14) {
599 read_buf(f_in,file_sum2,MD4_SUM_LENGTH);
601 fprintf(FERROR,"got file_sum\n");
602 if (fd != -1 && memcmp(file_sum1,file_sum2,MD4_SUM_LENGTH) != 0)
609 static void delete_one(struct file_struct *f)
611 if (!S_ISDIR(f->mode)) {
612 if (do_unlink(f_name(f)) != 0) {
613 fprintf(FERROR,"unlink %s : %s\n",f_name(f),strerror(errno));
614 } else if (verbose) {
615 fprintf(FERROR,"deleting %s\n",f_name(f));
618 if (do_rmdir(f_name(f)) != 0) {
619 if (errno != ENOTEMPTY)
620 fprintf(FERROR,"rmdir %s : %s\n",f_name(f),strerror(errno));
621 } else if (verbose) {
622 fprintf(FERROR,"deleting directory %s\n",f_name(f));
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.
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 */
635 static int delete_already_done(struct file_list *flist,int j)
641 if (j == 0) return 0;
643 name = strdup(f_name(flist->files[j]));
646 fprintf(FERROR,"out of memory in delete_already_done");
650 p = strrchr(name,'/');
657 while (low != high) {
658 int mid = (low+high)/2;
659 int ret = strcmp(f_name(flist->files[flist_up(flist, mid)]),name);
671 low = flist_up(flist, low);
673 if (strcmp(f_name(flist->files[low]),name) == 0) {
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 */
686 static void delete_files(struct file_list *flist)
688 struct file_list *local_file_list;
694 for (j=0;j<flist->count;j++) {
695 char *name = f_name(flist->files[j]);
697 if (!S_ISDIR(flist->files[j]->mode)) continue;
699 if (delete_already_done(flist, j)) continue;
701 if (!(local_file_list = send_file_list(-1,1,&name)))
705 fprintf(FINFO,"deleting in %s\n", name);
707 for (i=local_file_list->count-1;i>=0;i--) {
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]);
713 flist_free(local_file_list);
717 static char *cleanup_fname;
719 void exit_cleanup(int code)
722 do_unlink(cleanup_fname);
723 signal(SIGUSR1, SIG_IGN);
736 int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
741 char fnametmp[MAXPATHLEN];
742 struct map_struct *buf;
744 struct file_struct *file;
749 fprintf(FERROR,"recv_files(%d) starting\n",flist->count);
752 if (recurse && delete_mode && !local_name && flist->count>0) {
760 if (phase==0 && remote_version >= 13) {
762 csum_length = SUM_LENGTH;
764 fprintf(FERROR,"recv_files phase=%d\n",phase);
772 file = flist->files[i];
773 fname = f_name(file);
779 if (!am_server && verbose)
780 printf("%s\n",fname);
785 fprintf(FERROR,"recv_files(%s)\n",fname);
788 fd1 = open(fname,O_RDONLY);
790 if (fd1 != -1 && fstat(fd1,&st) != 0) {
791 fprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
792 receive_data(f_in,NULL,-1,NULL);
797 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
798 fprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
799 receive_data(f_in,NULL,-1,NULL);
804 if (fd1 != -1 && st.st_size > 0) {
805 buf = map_file(fd1,st.st_size);
807 fprintf(FERROR,"recv mapped %s of size %d\n",fname,(int)st.st_size);
813 if (strlen(fname) > (MAXPATHLEN-8)) {
814 fprintf(FERROR,"filename too long\n");
815 if (buf) unmap_file(buf);
821 f = strrchr(fname,'/');
826 sprintf(fnametmp,"%s/%s.XXXXXX",tmpdir,f);
828 sprintf(fnametmp,"%s.XXXXXX",fname);
830 if (NULL == mktemp(fnametmp)) {
831 fprintf(FERROR,"mktemp %s failed\n",fnametmp);
832 receive_data(f_in,buf,-1,NULL);
833 if (buf) unmap_file(buf);
837 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
838 if (fd2 == -1 && relative_paths && errno == ENOENT &&
839 create_directory_path(fnametmp) == 0) {
840 fd2 = do_open(fnametmp,O_WRONLY|O_CREAT|O_EXCL,file->mode);
843 fprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
844 receive_data(f_in,buf,-1,NULL);
845 if (buf) unmap_file(buf);
850 cleanup_fname = fnametmp;
852 if (!am_server && verbose)
853 printf("%s\n",fname);
856 recv_ok = receive_data(f_in,buf,fd2,fname);
858 if (buf) unmap_file(buf);
865 fprintf(FERROR,"renaming %s to %s\n",fnametmp,fname);
868 char fnamebak[MAXPATHLEN];
869 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
870 fprintf(FERROR,"backup filename too long\n");
873 sprintf(fnamebak,"%s%s",fname,backup_suffix);
874 if (rename(fname,fnamebak) != 0 && errno != ENOENT) {
875 fprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
880 /* move tmp file over real file */
881 if (rename(fnametmp,fname) != 0) {
882 if (errno == EXDEV) {
883 /* rename failed on cross-filesystem link.
884 Copy the file instead. */
885 if (copy_file(fnametmp,fname, file->mode)) {
886 fprintf(FERROR,"copy %s -> %s : %s\n",
887 fnametmp,fname,strerror(errno));
889 set_perms(fname,file,NULL,0);
893 fprintf(FERROR,"rename %s -> %s : %s\n",
894 fnametmp,fname,strerror(errno));
898 set_perms(fname,file,NULL,0);
901 cleanup_fname = NULL;
905 if (csum_length == SUM_LENGTH) {
906 fprintf(FERROR,"ERROR: file corruption in %s. File changed during transfer?\n",
910 fprintf(FERROR,"redoing %s(%d)\n",fname,i);
916 if (preserve_hard_links)
917 do_hard_links(flist);
919 /* now we need to fix any directory permissions that were
920 modified during the transfer */
921 for (i = 0; i < flist->count; i++) {
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);
928 fprintf(FERROR,"recv_files finished\n");
935 void send_files(struct file_list *flist,int f_out,int f_in)
938 struct sum_struct *s;
939 struct map_struct *buf;
941 char fname[MAXPATHLEN];
943 struct file_struct *file;
948 fprintf(FERROR,"send_files starting\n");
950 setup_nonblocking(f_in,f_out);
955 if (phase==0 && remote_version >= 13) {
957 csum_length = SUM_LENGTH;
961 fprintf(FERROR,"send_files phase=%d\n",phase);
967 file = flist->files[i];
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",
979 offset = strlen(file->basedir)+1;
981 strncat(fname,f_name(file),MAXPATHLEN-strlen(fname));
984 fprintf(FERROR,"send_files(%d,%s)\n",i,fname);
987 if (!am_server && verbose)
988 printf("%s\n",fname);
993 s = receive_sums(f_in);
995 fprintf(FERROR,"receive_sums failed\n");
999 fd = open(fname,O_RDONLY);
1001 fprintf(FERROR,"send_files failed to open %s: %s\n",
1002 fname,strerror(errno));
1007 /* map the local file */
1008 if (fstat(fd,&st) != 0) {
1009 fprintf(FERROR,"fstat failed : %s\n",strerror(errno));
1015 if (st.st_size > 0) {
1016 buf = map_file(fd,st.st_size);
1022 fprintf(FERROR,"send_files mapped %s of size %d\n",
1023 fname,(int)st.st_size);
1027 write_int(f_out,s->count);
1028 write_int(f_out,s->n);
1029 write_int(f_out,s->remainder);
1032 fprintf(FERROR,"calling match_sums %s\n",fname);
1034 if (!am_server && verbose)
1035 printf("%s\n",fname+offset);
1037 match_sums(f_out,s,buf,st.st_size);
1040 if (buf) unmap_file(buf);
1046 fprintf(FERROR,"sender finished %s\n",fname);
1050 fprintf(FERROR,"send files finished\n");
1054 write_int(f_out,-1);
1060 void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
1066 fprintf(FERROR,"generator starting pid=%d count=%d\n",
1067 (int)getpid(),flist->count);
1069 for (i = 0; i < flist->count; i++) {
1070 struct file_struct *file = flist->files[i];
1071 mode_t saved_mode = file->mode;
1072 if (!file->basename) continue;
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 */
1081 recv_generator(local_name?local_name:f_name(file),
1084 file->mode = saved_mode;
1088 csum_length = SUM_LENGTH;
1092 fprintf(FERROR,"generate_files phase=%d\n",phase);
1097 if (remote_version >= 13) {
1098 /* in newer versions of the protocol the files can cycle through
1099 the system more than once to catch initial checksum errors */
1100 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
1101 struct file_struct *file = flist->files[i];
1102 recv_generator(local_name?local_name:f_name(file),
1108 fprintf(FERROR,"generate_files phase=%d\n",phase);
1116 fprintf(FERROR,"generator wrote %ld\n",(long)write_total());