X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/4fe159a81d1f0c39aaa7f05dbb33b36d231e7c80..34ccb63e71367fb1f93530f60147ef6e4ac4e3e4:/main.c diff --git a/main.c b/main.c index 0af90e58..92103fc7 100644 --- a/main.c +++ b/main.c @@ -44,6 +44,7 @@ int ignore_times=0; int delete_mode=0; int one_file_system=0; int remote_version=0; +extern int csum_length; int am_server = 0; static int sender = 0; @@ -88,6 +89,7 @@ static void server_options(char **args,int *argc) int ac = *argc; static char argstr[50]; static char bsize[30]; + static char slength[30]; int i, x; args[ac++] = "--server"; @@ -135,6 +137,11 @@ static void server_options(char **args,int *argc) sprintf(bsize,"-B%d",block_size); args[ac++] = bsize; } + + if (csum_length != SUM_LENGTH) { + sprintf(slength,"--csum-length=%d",csum_length); + args[ac++] = slength; + } if (delete_mode) args[ac++] = "--delete"; @@ -216,13 +223,13 @@ static char *get_local_name(struct file_list *flist,char *name) if (S_ISDIR(st.st_mode)) { if (chdir(name) != 0) { fprintf(stderr,"chdir %s : %s\n",name,strerror(errno)); - exit(1); + exit_cleanup(1); } return NULL; } if (flist->count > 1) { fprintf(stderr,"ERROR: destination must be a directory when copying more than 1 file\n"); - exit(1); + exit_cleanup(1); } return name; } @@ -235,14 +242,14 @@ static char *get_local_name(struct file_list *flist,char *name) if (mkdir(name,0777) != 0) { fprintf(stderr,"mkdir %s : %s\n",name,strerror(errno)); - exit(1); + exit_cleanup(1); } else { fprintf(am_server?stderr:stdout,"created directory %s\n",name); } if (chdir(name) != 0) { fprintf(stderr,"chdir %s : %s\n",name,strerror(errno)); - exit(1); + exit_cleanup(1); } return NULL; @@ -262,7 +269,7 @@ void do_server_sender(int argc,char *argv[]) if (chdir(dir) != 0) { fprintf(stderr,"chdir %s: %s\n",dir,strerror(errno)); - exit(1); + exit_cleanup(1); } argc--; argv++; @@ -283,7 +290,7 @@ void do_server_sender(int argc,char *argv[]) flist = send_file_list(STDOUT_FILENO,recurse,argc,argv); send_files(flist,STDOUT_FILENO,STDIN_FILENO); report(STDOUT_FILENO); - exit(0); + exit_cleanup(0); } @@ -304,7 +311,7 @@ void do_server_recv(int argc,char *argv[]) argv++; if (chdir(dir) != 0) { fprintf(stderr,"chdir %s : %s\n",dir,strerror(errno)); - exit(1); + exit_cleanup(1); } } @@ -314,7 +321,7 @@ void do_server_recv(int argc,char *argv[]) flist = recv_file_list(STDIN_FILENO); if (!flist || flist->count == 0) { fprintf(stderr,"nothing to do\n"); - exit(1); + exit_cleanup(1); } if (argc > 0) { @@ -329,13 +336,13 @@ void do_server_recv(int argc,char *argv[]) recv_files(STDIN_FILENO,flist,local_name); if (verbose > 2) fprintf(stderr,"receiver read %d\n",read_total()); - exit(0); + exit_cleanup(0); } generate_files(STDOUT_FILENO,flist,local_name); waitpid(pid, &status, 0); - exit(status); + exit_cleanup(status); } @@ -369,6 +376,7 @@ static void usage(FILE *f) fprintf(f," --exclude FILE exclude file FILE\n"); fprintf(f," --exclude-from FILE exclude files listed in FILE\n"); fprintf(f," --suffix SUFFIX override backup suffix\n"); + fprintf(f," --csum-length LENGTH set the checksum length\n"); fprintf(f," --version print version number\n"); fprintf(f,"\n"); @@ -377,7 +385,7 @@ static void usage(FILE *f) } enum {OPT_VERSION,OPT_SUFFIX,OPT_SENDER,OPT_SERVER,OPT_EXCLUDE, - OPT_EXCLUDE_FROM,OPT_DELETE,OPT_RSYNC_PATH}; + OPT_EXCLUDE_FROM,OPT_DELETE,OPT_RSYNC_PATH,OPT_CSUM_LENGTH}; static char *short_options = "oblpguDCtcahvrIxne:B:"; @@ -389,6 +397,7 @@ static struct option long_options[] = { {"exclude", 1, 0, OPT_EXCLUDE}, {"exclude-from",1, 0, OPT_EXCLUDE_FROM}, {"rsync-path", 1, 0, OPT_RSYNC_PATH}, + {"csum-length", 1, 0, OPT_CSUM_LENGTH}, {"one-file-system",0, 0, 'x'}, {"ignore-times",0, 0, 'I'}, {"help", 0, 0, 'h'}, @@ -427,6 +436,8 @@ int main(int argc,char *argv[]) starttime = time(NULL); + checksum_init(); + while ((opt = getopt_long(argc, argv, short_options, long_options, &option_index)) != -1) { @@ -435,7 +446,7 @@ int main(int argc,char *argv[]) case OPT_VERSION: printf("rsync version %s protocol version %d\n", VERSION,PROTOCOL_VERSION); - exit(0); + exit_cleanup(0); case OPT_SUFFIX: backup_suffix = optarg; @@ -445,6 +456,11 @@ int main(int argc,char *argv[]) rsync_path = optarg; break; + case OPT_CSUM_LENGTH: + csum_length = atoi(optarg); + csum_length = MIN(csum_length,SUM_LENGTH); + break; + case 'I': ignore_times = 1; break; @@ -467,7 +483,7 @@ int main(int argc,char *argv[]) case 'h': usage(stdout); - exit(0); + exit_cleanup(0); case 'b': make_backups=1; @@ -500,7 +516,7 @@ int main(int argc,char *argv[]) preserve_uid=1; } else { fprintf(stderr,"-o only allowed for root\n"); - exit(1); + exit_cleanup(1); } break; @@ -513,7 +529,7 @@ int main(int argc,char *argv[]) preserve_devices=1; } else { fprintf(stderr,"-D only allowed for root\n"); - exit(1); + exit_cleanup(1); } break; @@ -550,7 +566,7 @@ int main(int argc,char *argv[]) case OPT_SENDER: if (!am_server) { usage(stderr); - exit(1); + exit_cleanup(1); } sender = 1; break; @@ -569,7 +585,7 @@ int main(int argc,char *argv[]) default: fprintf(stderr,"bad option -%c\n",opt); - exit(1); + exit_cleanup(1); } } @@ -583,10 +599,10 @@ int main(int argc,char *argv[]) if (am_server) { remote_version = read_int(STDIN_FILENO); - if (remote_version < MIN_PROTOCOL_VERSION) { - fprintf(stderr,"protocol version mismatch %d %d\n", - remote_version,PROTOCOL_VERSION); - exit(1); + if (remote_version < MIN_PROTOCOL_VERSION || + remote_version > MAX_PROTOCOL_VERSION) { + fprintf(stderr,"protocol version mismatch - is your shell clean?\n"); + exit_cleanup(1); } write_int(STDOUT_FILENO,PROTOCOL_VERSION); write_flush(STDOUT_FILENO); @@ -601,12 +617,12 @@ int main(int argc,char *argv[]) } else { do_server_recv(argc,argv); } - exit(0); + exit_cleanup(0); } if (argc < 2) { usage(stderr); - exit(1); + exit_cleanup(1); } p = strchr(argv[0],':'); @@ -660,7 +676,7 @@ int main(int argc,char *argv[]) if (!sender && argc != 1) { usage(stderr); - exit(1); + exit_cleanup(1); } pid = do_cmd(shell_cmd,shell_machine,shell_user,shell_path,&f_in,&f_out); @@ -669,9 +685,10 @@ int main(int argc,char *argv[]) write_flush(f_out); { remote_version = read_int(f_in); - if (remote_version < MIN_PROTOCOL_VERSION) { - fprintf(stderr,"protocol version mismatch\n"); - exit(1); + if (remote_version < MIN_PROTOCOL_VERSION || + remote_version > MAX_PROTOCOL_VERSION) { + fprintf(stderr,"protocol version mismatch - is your shell clean?\n"); + exit_cleanup(1); } } @@ -694,7 +711,7 @@ int main(int argc,char *argv[]) fprintf(stderr,"waiting on %d\n",pid); waitpid(pid, &status, 0); report(-1); - exit(status); + exit_cleanup(status); } send_exclude_list(f_out); @@ -702,7 +719,7 @@ int main(int argc,char *argv[]) flist = recv_file_list(f_in); if (!flist || flist->count == 0) { fprintf(stderr,"nothing to do\n"); - exit(0); + exit_cleanup(0); } local_name = get_local_name(flist,argv[0]); @@ -711,7 +728,7 @@ int main(int argc,char *argv[]) recv_files(f_in,flist,local_name); if (verbose > 1) fprintf(stderr,"receiver read %d\n",read_total()); - exit(0); + exit_cleanup(0); } generate_files(f_out,flist,local_name);