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;
33 extern int whole_file;
34 extern int block_size;
35 extern int update_only;
36 extern int make_backups;
37 extern int preserve_links;
38 extern int preserve_hard_links;
39 extern int preserve_perms;
40 extern int preserve_devices;
41 extern int preserve_uid;
42 extern int preserve_gid;
43 extern int preserve_times;
45 extern int ignore_times;
47 extern int delete_mode;
48 extern int cvs_exclude;
50 extern int relative_paths;
55 static void free_sums(struct sum_struct *s)
57 if (s->sums) free(s->sums);
64 send a sums struct down a fd
66 static void send_sums(struct sum_struct *s,int f_out)
70 /* tell the other guy how many we are going to be doing and how many
71 bytes there are in the last chunk */
72 write_int(f_out,s?s->count:0);
73 write_int(f_out,s?s->n:block_size);
74 write_int(f_out,s?s->remainder:0);
76 for (i=0;i<s->count;i++) {
77 write_int(f_out,s->sums[i].sum1);
78 write_buf(f_out,s->sums[i].sum2,csum_length);
85 generate a stream of signatures/checksums that describe a buffer
87 generate approximately one checksum every n bytes
89 static struct sum_struct *generate_sums(struct map_struct *buf,off_t len,int n)
95 int remainder = (len%block_len);
98 count = (len+(block_len-1))/block_len;
100 s = (struct sum_struct *)malloc(sizeof(*s));
101 if (!s) out_of_memory("generate_sums");
104 s->remainder = remainder;
114 fprintf(FERROR,"count=%d rem=%d n=%d flength=%d\n",
115 s->count,s->remainder,s->n,(int)s->flength);
117 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
118 if (!s->sums) out_of_memory("generate_sums");
120 for (i=0;i<count;i++) {
122 char *map = map_ptr(buf,offset,n1);
124 s->sums[i].sum1 = get_checksum1(map,n1);
125 get_checksum2(map,n1,s->sums[i].sum2);
127 s->sums[i].offset = offset;
132 fprintf(FERROR,"chunk[%d] offset=%d len=%d sum1=%08x\n",
133 i,(int)s->sums[i].offset,s->sums[i].len,s->sums[i].sum1);
144 receive the checksums for a buffer
146 static struct sum_struct *receive_sums(int f)
148 struct sum_struct *s;
152 s = (struct sum_struct *)malloc(sizeof(*s));
153 if (!s) out_of_memory("receive_sums");
155 s->count = read_int(f);
157 s->remainder = read_int(f);
161 fprintf(FERROR,"count=%d n=%d rem=%d\n",
162 s->count,s->n,s->remainder);
167 s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
168 if (!s->sums) out_of_memory("receive_sums");
170 for (i=0;i<s->count;i++) {
171 s->sums[i].sum1 = read_int(f);
172 read_buf(f,s->sums[i].sum2,csum_length);
174 s->sums[i].offset = offset;
177 if (i == s->count-1 && s->remainder != 0) {
178 s->sums[i].len = s->remainder;
180 s->sums[i].len = s->n;
182 offset += s->sums[i].len;
185 fprintf(FERROR,"chunk[%d] len=%d offset=%d sum1=%08x\n",
186 i,s->sums[i].len,(int)s->sums[i].offset,s->sums[i].sum1);
195 static int set_perms(char *fname,struct file_struct *file,struct stat *st,
201 if (dry_run) return 0;
204 if (link_stat(fname,&st2) != 0) {
205 fprintf(FERROR,"stat %s : %s\n",fname,strerror(errno));
211 if (preserve_times && !S_ISLNK(st->st_mode) &&
212 st->st_mtime != file->modtime) {
214 if (set_modtime(fname,file->modtime) != 0) {
215 fprintf(FERROR,"failed to set times on %s : %s\n",
216 fname,strerror(errno));
222 if (preserve_perms && !S_ISLNK(st->st_mode) &&
223 st->st_mode != file->mode) {
225 if (chmod(fname,file->mode) != 0) {
226 fprintf(FERROR,"failed to set permissions on %s : %s\n",
227 fname,strerror(errno));
233 if ((am_root && preserve_uid && st->st_uid != file->uid) ||
234 (preserve_gid && st->st_gid != file->gid)) {
237 (am_root&&preserve_uid)?file->uid:-1,
238 preserve_gid?file->gid:-1) != 0) {
239 if (verbose>1 || preserve_uid)
240 fprintf(FERROR,"chown %s : %s\n",fname,strerror(errno));
245 if (verbose > 1 && report) {
247 fprintf(FINFO,"%s\n",fname);
249 fprintf(FINFO,"%s is uptodate\n",fname);
255 /* choose whether to skip a particular file */
256 static int skip_file(char *fname,
257 struct file_struct *file, struct stat *st)
259 if (st->st_size != file->length) {
263 /* if always checksum is set then we use the checksum instead
264 of the file time to determine whether to sync */
265 if (always_checksum && S_ISREG(st->st_mode)) {
266 char sum[MD4_SUM_LENGTH];
267 file_checksum(fname,sum,st->st_size);
268 return (memcmp(sum,file->sum,csum_length) == 0);
275 return (st->st_mtime == file->modtime);
279 void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
283 struct map_struct *buf;
284 struct sum_struct *s;
286 struct file_struct *file = &flist->files[i];
289 fprintf(FERROR,"recv_generator(%s,%d)\n",fname,i);
291 statret = link_stat(fname,&st);
293 if (S_ISDIR(file->mode)) {
295 if (statret == 0 && !S_ISDIR(st.st_mode)) {
296 if (unlink(fname) != 0) {
297 fprintf(FERROR,"unlink %s : %s\n",fname,strerror(errno));
302 if (statret != 0 && mkdir(fname,file->mode) != 0 && errno != EEXIST) {
303 if (!(relative_paths && errno==ENOENT &&
304 create_directory_path(fname)==0 &&
305 mkdir(fname,file->mode)==0)) {
306 fprintf(FERROR,"mkdir %s : %s (2)\n",
307 fname,strerror(errno));
310 if (set_perms(fname,file,NULL,0) && verbose)
311 fprintf(FINFO,"%s/\n",fname);
315 if (preserve_links && S_ISLNK(file->mode)) {
317 char lnk[MAXPATHLEN];
320 l = readlink(fname,lnk,MAXPATHLEN-1);
323 if (strcmp(lnk,file->link) == 0) {
324 set_perms(fname,file,&st,1);
329 if (!dry_run) unlink(fname);
330 if (!dry_run && symlink(file->link,fname) != 0) {
331 fprintf(FERROR,"link %s -> %s : %s\n",
332 fname,file->link,strerror(errno));
334 set_perms(fname,file,NULL,0);
336 fprintf(FINFO,"%s -> %s\n",
344 if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
346 st.st_mode != file->mode ||
347 st.st_rdev != file->rdev) {
348 if (!dry_run) unlink(fname);
350 fprintf(FERROR,"mknod(%s,0%o,0x%x)\n",
351 fname,(int)file->mode,(int)file->rdev);
353 mknod(fname,file->mode,file->rdev) != 0) {
354 fprintf(FERROR,"mknod %s : %s\n",fname,strerror(errno));
356 set_perms(fname,file,NULL,0);
358 fprintf(FINFO,"%s\n",fname);
361 set_perms(fname,file,&st,1);
367 if (preserve_hard_links && check_hard_link(file)) {
369 fprintf(FINFO,"%s is a hard link\n",file->name);
373 if (!S_ISREG(file->mode)) {
374 fprintf(FERROR,"skipping non-regular file %s\n",fname);
379 if (errno == ENOENT) {
381 if (!dry_run) send_sums(NULL,f_out);
384 fprintf(FERROR,"recv_generator failed to open %s\n",fname);
389 if (!S_ISREG(st.st_mode)) {
390 /* its not a regular file on the receiving end, but it is on the
391 sending end. If its a directory then skip it (too dangerous to
392 do a recursive deletion??) otherwise try to unlink it */
393 if (S_ISDIR(st.st_mode)) {
394 fprintf(FERROR,"ERROR: %s is a directory\n",fname);
397 if (unlink(fname) != 0) {
398 fprintf(FERROR,"%s : not a regular file (generator)\n",fname);
402 /* now pretend the file didn't exist */
404 if (!dry_run) send_sums(NULL,f_out);
408 if (update_only && st.st_mtime >= file->modtime) {
410 fprintf(FERROR,"%s is newer\n",fname);
414 if (skip_file(fname, file, &st)) {
415 set_perms(fname,file,&st,1);
426 send_sums(NULL,f_out);
431 fd = open(fname,O_RDONLY);
434 fprintf(FERROR,"failed to open %s : %s\n",fname,strerror(errno));
435 fprintf(FERROR,"skipping %s\n",fname);
439 if (st.st_size > 0) {
440 buf = map_file(fd,st.st_size);
446 fprintf(FERROR,"gen mapped %s of size %d\n",fname,(int)st.st_size);
448 s = generate_sums(buf,st.st_size,block_size);
451 fprintf(FERROR,"sending sums for %d\n",i);
458 if (buf) unmap_file(buf);
465 static int receive_data(int f_in,struct map_struct *buf,int fd,char *fname)
467 int i,n,remainder,len,count;
471 static char file_sum1[MD4_SUM_LENGTH];
472 static char file_sum2[MD4_SUM_LENGTH];
475 count = read_int(f_in);
477 remainder = read_int(f_in);
481 for (i=recv_token(f_in,&data); i != 0; i=recv_token(f_in,&data)) {
484 fprintf(FERROR,"data recv %d at %d\n",i,(int)offset);
488 if (fd != -1 && write_sparse(fd,data,i) != i) {
489 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
497 if (i == count-1 && remainder != 0)
501 fprintf(FERROR,"chunk[%d] of size %d at %d offset=%d\n",
502 i,len,(int)offset2,(int)offset);
504 map = map_ptr(buf,offset2,len);
509 if (fd != -1 && write_sparse(fd,map,len) != len) {
510 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
517 if (fd != -1 && offset > 0 && sparse_end(fd) != 0) {
518 fprintf(FERROR,"write failed on %s : %s\n",fname,strerror(errno));
524 if (remote_version >= 14) {
525 read_buf(f_in,file_sum2,MD4_SUM_LENGTH);
527 fprintf(FERROR,"got file_sum\n");
528 if (fd != -1 && memcmp(file_sum1,file_sum2,MD4_SUM_LENGTH) != 0)
535 static void delete_one(struct file_struct *f)
537 if (!S_ISDIR(f->mode)) {
538 if (!dry_run && unlink(f->name) != 0) {
539 fprintf(FERROR,"unlink %s : %s\n",f->name,strerror(errno));
540 } else if (verbose) {
541 fprintf(FERROR,"deleting %s\n",f->name);
544 if (!dry_run && rmdir(f->name) != 0) {
545 if (errno != ENOTEMPTY)
546 fprintf(FERROR,"rmdir %s : %s\n",f->name,strerror(errno));
547 } else if (verbose) {
548 fprintf(FERROR,"deleting directory %s\n",f->name);
554 /* this deletes any files on the receiving side that are not present
555 on the sending side. For version 1.6.4 I have changed the behaviour
556 to match more closely what most people seem to expect of this option */
557 static void delete_files(struct file_list *flist)
559 struct file_list *local_file_list;
561 char *last_name=NULL;
566 for (j=0;j<flist->count;j++) {
567 if (!S_ISDIR(flist->files[j].mode)) continue;
568 if (strcmp(flist->files[j].name,".")==0) continue;
570 flist->files[j].name[strlen(last_name)] == '/' &&
571 strncmp(flist->files[j].name,last_name, strlen(last_name))==0)
573 last_name = flist->files[j].name;
574 if (!(local_file_list = send_file_list(-1,1,&last_name)))
577 fprintf(FINFO,"deleting in %s\n", last_name);
579 for (i=local_file_list->count-1;i>=0;i--) {
580 if (!local_file_list->files[i].name) continue;
581 if (-1 == flist_find(flist,&local_file_list->files[i])) {
582 delete_one(&local_file_list->files[i]);
588 static char *cleanup_fname = NULL;
590 void exit_cleanup(int code)
593 unlink(cleanup_fname);
594 signal(SIGUSR1, SIG_IGN);
597 kill(-getpgrp(), SIGUSR1);
599 kill(-getpgrp(getpid()), SIGUSR1);
611 int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen)
616 char fnametmp[MAXPATHLEN];
617 struct map_struct *buf;
619 struct file_struct *file;
624 fprintf(FERROR,"recv_files(%d) starting\n",flist->count);
627 if (recurse && delete_mode && !local_name && flist->count>0) {
635 if (phase==0 && remote_version >= 13) {
637 csum_length = SUM_LENGTH;
639 fprintf(FERROR,"recv_files phase=%d\n",phase);
647 file = &flist->files[i];
654 if (!am_server && verbose)
655 printf("%s\n",fname);
660 fprintf(FERROR,"recv_files(%s)\n",fname);
663 fd1 = open(fname,O_RDONLY);
665 if (fd1 != -1 && fstat(fd1,&st) != 0) {
666 fprintf(FERROR,"fstat %s : %s\n",fname,strerror(errno));
667 receive_data(f_in,NULL,-1,NULL);
672 if (fd1 != -1 && !S_ISREG(st.st_mode)) {
673 fprintf(FERROR,"%s : not a regular file (recv_files)\n",fname);
674 receive_data(f_in,NULL,-1,NULL);
679 if (fd1 != -1 && st.st_size > 0) {
680 buf = map_file(fd1,st.st_size);
682 fprintf(FERROR,"recv mapped %s of size %d\n",fname,(int)st.st_size);
688 if (strlen(fname) > (MAXPATHLEN-8)) {
689 fprintf(FERROR,"filename too long\n");
693 sprintf(fnametmp,"%s.XXXXXX",fname);
694 if (NULL == mktemp(fnametmp)) {
695 fprintf(FERROR,"mktemp %s failed\n",fnametmp);
696 receive_data(f_in,buf,-1,NULL);
697 if (buf) unmap_file(buf);
701 fd2 = open(fnametmp,O_WRONLY|O_CREAT,file->mode);
702 if (fd2 == -1 && relative_paths && errno == ENOENT &&
703 create_directory_path(fnametmp) == 0) {
704 fd2 = open(fnametmp,O_WRONLY|O_CREAT,file->mode);
707 fprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
708 receive_data(f_in,buf,-1,NULL);
709 if (buf) unmap_file(buf);
714 cleanup_fname = fnametmp;
716 if (!am_server && verbose)
717 printf("%s\n",fname);
720 recv_ok = receive_data(f_in,buf,fd2,fname);
723 if (buf) unmap_file(buf);
729 fprintf(FERROR,"renaming %s to %s\n",fnametmp,fname);
732 char fnamebak[MAXPATHLEN];
733 if (strlen(fname) + strlen(backup_suffix) > (MAXPATHLEN-1)) {
734 fprintf(FERROR,"backup filename too long\n");
737 sprintf(fnamebak,"%s%s",fname,backup_suffix);
738 if (rename(fname,fnamebak) != 0 && errno != ENOENT) {
739 fprintf(FERROR,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
744 /* move tmp file over real file */
745 if (rename(fnametmp,fname) != 0) {
746 fprintf(FERROR,"rename %s -> %s : %s\n",
747 fnametmp,fname,strerror(errno));
751 cleanup_fname = NULL;
753 set_perms(fname,file,NULL,0);
757 fprintf(FERROR,"redoing %s(%d)\n",fname,i);
758 if (csum_length == SUM_LENGTH)
759 fprintf(FERROR,"ERROR: file corruption in %s\n",fname);
764 if (preserve_hard_links)
765 do_hard_links(flist);
767 /* now we need to fix any directory permissions that were
768 modified during the transfer */
769 for (i = 0; i < flist->count; i++) {
770 struct file_struct *file = &flist->files[i];
771 if (!file->name || !S_ISDIR(file->mode)) continue;
772 recv_generator(file->name,flist,i,-1);
776 fprintf(FERROR,"recv_files finished\n");
783 off_t send_files(struct file_list *flist,int f_out,int f_in)
786 struct sum_struct *s;
787 struct map_struct *buf;
789 char fname[MAXPATHLEN];
792 struct file_struct *file;
796 fprintf(FERROR,"send_files starting\n");
798 setup_nonblocking(f_in,f_out);
804 if (phase==0 && remote_version >= 13) {
806 csum_length = SUM_LENGTH;
810 fprintf(FERROR,"send_files phase=%d\n",phase);
816 file = &flist->files[i];
820 strncpy(fname,file->dir,MAXPATHLEN-1);
821 fname[MAXPATHLEN-1] = 0;
822 if (strlen(fname) == MAXPATHLEN-1) {
823 fprintf(FERROR, "send_files failed on long-named directory %s\n",
829 strncat(fname,file->name,MAXPATHLEN-strlen(fname));
832 fprintf(FERROR,"send_files(%d,%s)\n",i,fname);
835 if (!am_server && verbose)
836 printf("%s\n",fname);
841 s = receive_sums(f_in);
843 fprintf(FERROR,"receive_sums failed\n");
847 fd = open(fname,O_RDONLY);
849 fprintf(FERROR,"send_files failed to open %s: %s\n",
850 fname,strerror(errno));
854 /* map the local file */
855 if (fstat(fd,&st) != 0) {
856 fprintf(FERROR,"fstat failed : %s\n",strerror(errno));
861 if (st.st_size > 0) {
862 buf = map_file(fd,st.st_size);
868 fprintf(FERROR,"send_files mapped %s of size %d\n",
869 fname,(int)st.st_size);
873 write_int(f_out,s->count);
874 write_int(f_out,s->n);
875 write_int(f_out,s->remainder);
878 fprintf(FERROR,"calling match_sums %s\n",fname);
880 if (!am_server && verbose)
881 printf("%s\n",fname);
883 match_sums(f_out,s,buf,st.st_size);
886 if (buf) unmap_file(buf);
892 fprintf(FERROR,"sender finished %s\n",fname);
898 fprintf(FERROR,"send files finished\n");
910 void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
916 fprintf(FERROR,"generator starting pid=%d count=%d\n",
917 (int)getpid(),flist->count);
919 for (i = 0; i < flist->count; i++) {
920 struct file_struct *file = &flist->files[i];
921 mode_t saved_mode = file->mode;
922 if (!file->name) continue;
924 /* we need to ensure that any directories we create have writeable
925 permissions initially so that we can create the files within
926 them. This is then fixed after the files are transferred */
927 if (!am_root && S_ISDIR(file->mode)) {
928 file->mode |= S_IWUSR; /* user write */
931 recv_generator(local_name?local_name:file->name,
934 file->mode = saved_mode;
938 csum_length = SUM_LENGTH;
942 fprintf(FERROR,"generate_files phase=%d\n",phase);
947 if (remote_version >= 13) {
948 /* in newer versions of the protocol the files can cycle through
949 the system more than once to catch initial checksum errors */
950 for (i=read_int(f_recv); i != -1; i=read_int(f_recv)) {
951 struct file_struct *file = &flist->files[i];
952 recv_generator(local_name?local_name:file->name,
958 fprintf(FERROR,"generate_files phase=%d\n",phase);
966 fprintf(FERROR,"generator wrote %d\n",write_total());