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
-- 
To unsubscribe or change options: http://lists.samba.org/mailman/listinfo/rsync
Before posting, read: http://www.catb.org/~esr/faqs/smart-questions.html

Reply via email to