Here is a diff which should allow applying batch updates remotely ( as apposed to copying the batch files to the remote server and running rsync there ). Eg rsync --write-batch=test src dst1::dst rsync --read-batch=test dst2::dst Oli Dewdney diff -E -B -c -r rsync-2.5.6/flist.c rsync-2.5.6-remotebatch/flist.c *** rsync-2.5.6/flist.c Sat Jan 18 18:00:23 2003 --- rsync-2.5.6-remotebatch/flist.c Wed Jul 23 11:27:45 2003 *************** *** 1038,1043 **** --- 1038,1058 ---- return flist; } + void send_batch_file_list( int f, struct file_list *flist ) + { + int n; + for (n = 0; n < flist->count; n++ ) { + send_file_entry(flist->files[n], f, 0); + } + send_file_entry(NULL, f, 0); + if (f != -1 && remote_version >= 15) { + send_uid_list(f); + } + if (f != -1 && remote_version >= 17 && !read_batch) { /* dw-added readbatch */ + extern int module_id; + write_int(f, lp_ignore_errors(module_id) ? 0 : io_error); + } + } struct file_list *recv_file_list(int f) { diff -E -B -c -r rsync-2.5.6/main.c rsync-2.5.6-remotebatch/main.c *** rsync-2.5.6/main.c Tue Jan 28 05:05:53 2003 --- rsync-2.5.6-remotebatch/main.c Wed Jul 23 15:55:18 2003 *************** *** 263,270 **** } if (local_server) { - if (read_batch) - create_flist_from_batch(); /* sets batch_flist */ ret = local_child(argc, args, f_in, f_out, child_main); } else { ret = piped_child(args,f_in,f_out); --- 263,268 ---- *************** *** 505,515 **** if (delete_mode && !delete_excluded) recv_exclude_list(f_in); ! ! if (read_batch) ! flist = batch_flist; ! else ! flist = recv_file_list(f_in); if (!flist) { rprintf(FERROR,"server_recv: recv_file_list error\n"); exit_cleanup(RERR_FILESELECT); --- 503,509 ---- if (delete_mode && !delete_excluded) recv_exclude_list(f_in); ! flist = recv_file_list(f_in); if (!flist) { rprintf(FERROR,"server_recv: recv_file_list error\n"); exit_cleanup(RERR_FILESELECT); *************** *** 602,607 **** --- 597,610 ---- send_exclude_list(f_out); if (!read_batch) /* dw -- don't write to pipe */ flist = send_file_list(f_out,argc,argv); + else { + if (remote_version < 27) { + rprintf(FERROR,"Version Error for remote batch\n"); + exit_cleanup(RERR_FILESELECT); + } + flist = create_flist_from_batch(); /* sets batch_flist */ + send_batch_file_list( f_out, flist ); + } if (verbose > 3) rprintf(FINFO,"file list sent\n"); *************** *** 712,717 **** --- 715,721 ---- if ((rc = copy_argv(argv))) return rc; + if (!read_batch) { /* rsync:// always uses rsync server over direct socket connection */ if (strncasecmp(URL_PREFIX, argv[0], strlen(URL_PREFIX)) == 0) { char *host, *path; *************** *** 732,739 **** return start_socket_client(host, path, argc-1, argv+1); } ! if (!read_batch) { ! p = find_colon(argv[0]); if (p) { if (p[1] == ':') { /* double colon */ --- 736,742 ---- return start_socket_client(host, path, argc-1, argv+1); } ! p = find_colon(argv[0]); if (p) { if (p[1] == ':') { /* double colon */ *************** *** 808,816 **** } argc--; } ! } else { am_sender = 1; ! local_server = 1; shell_path = argv[argc-1]; } --- 811,857 ---- } argc--; } ! } else { /* read_batch */ am_sender = 1; ! ! if (argc > 1) { ! usage(FERROR); ! exit_cleanup(RERR_SYNTAX); ! } ! ! if (strncasecmp(URL_PREFIX, argv[0], strlen(URL_PREFIX)) =0) { ! char *host, *path; ! ! host = argv[0] + strlen(URL_PREFIX); ! p = strchr(host,'/'); ! if (p) { ! *p = 0; ! path = p+1; ! } else { ! path = ""; ! } ! p = strchr(host,':'); ! if (p) { ! rsync_port = atoi(p+1); ! *p = 0; ! } ! return start_socket_client(host, path, argc-1, argv+1); ! } ! p = find_colon(argv[0]); ! ! if (p) { ! if (p[1] == ':') { /* double colon */ ! *p = 0; ! if (!shell_cmd) { ! return start_socket_client(argv[0], p+2, ! argc-1, argv+1); ! } ! } ! p++; ! daemon_over_rsh = 1; ! } ! else ! local_server = 1; shell_path = argv[argc-1]; } diff -E -B -c -r rsync-2.5.6/proto.h rsync-2.5.6-remotebatch/proto.h *** rsync-2.5.6/proto.h Mon Jan 27 03:35:09 2003 --- rsync-2.5.6-remotebatch/proto.h Wed Jul 23 11:27:53 2003 *************** *** 31,37 **** void sum_init(void); void sum_update(char *p, int len); void sum_end(char *sum); ! void close_all(void); void _exit_cleanup(int code, const char *file, int line); void cleanup_disable(void); void cleanup_set(char *fnametmp, char *fname, struct file_struct *file, --- 31,37 ---- void sum_init(void); void sum_update(char *p, int len); void sum_end(char *sum); ! void close_all(); void _exit_cleanup(int code, const char *file, int line); void cleanup_disable(void); void cleanup_set(char *fnametmp, char *fname, struct file_struct *file, *************** *** 84,89 **** --- 84,90 ---- void send_file_name(int f, struct file_list *flist, char *fname, int recursive, unsigned base_flags); struct file_list *send_file_list(int f, int argc, char *argv[]); + void send_batch_file_list( int f, struct file_list *flist ); struct file_list *recv_file_list(int f); int file_compare(struct file_struct **f1, struct file_struct **f2); int flist_find(struct file_list *flist, struct file_struct *f); diff -E -B -c -r rsync-2.5.6/rsync.h rsync-2.5.6-remotebatch/rsync.h *** rsync-2.5.6/rsync.h Sun Jan 26 20:11:16 2003 --- rsync-2.5.6-remotebatch/rsync.h Wed Jul 23 10:52:41 2003 *************** *** 50,56 **** #define SAME_TIME (1<<7) /* update this if you make incompatible changes */ ! #define PROTOCOL_VERSION 26 /* We refuse to interoperate with versions that are not in this range. * Note that we assume we'll work with later versions: the onus is on --- 50,56 ---- #define SAME_TIME (1<<7) /* update this if you make incompatible changes */ ! #define PROTOCOL_VERSION 27 /* We refuse to interoperate with versions that are not in this range. * Note that we assume we'll work with later versions: the onus is on