Can someone tell me why this, and other patches on the list are failing 
for me.  I have a feeling I'm applying these diffs incorrectly for some 
reason.

Thanks
-jeremy

On Tue, 20 Nov 2001, JD Paul wrote:

> Hi --
> 
> I've made the changes to my code changes and the new diffs (against
> 2.4.6 again) are included below.
> 
> Syntax for running rsync server over a remote shell (e.g. ssh) is now:
> 
> rsync [options] -e ssh source [user@]host::module[/dest]
> rsync [options] -e ssh [user@]host::module[/source] dest
> 
> Cheers --
> 
>                                       JD
>                                       [EMAIL PROTECTED]
> 
> On Tue, 20 Nov 2001, JD Paul wrote:
> 
> > On Tue, 20 Nov 2001, Dave Dykstra wrote:
> > 
> > > I'm uncomfortable with adding yet another syntax.  I'd prefer just keying
> > > off the "-e" when the two colons are used.  Currently "-e" is ignored if
> > > you use two colons, so we don't need to worry about upward compatibility
> > > except from people who had no idea what they were doing.
> > > 
> > That's a very good point.  In my thinking about syntax, I was somewhat
> > misled by the standard practice at my site -- we habitually use
> > RSYNC_RSH=ssh in the environment instead of '-e ssh' (so I tend to
> > forget about that option).  
> > 
> > I'll get rid of the ':::' (as much as I'm fond of it) and re-submit
> > the diffs; that change won't take much.  It'll probably take more time
> > to modify the man page than the code...
> 
> 
> -----------------------------<cut here>------------------------------
> 
> Index: authenticate.c
> ===================================================================
> RCS file: /juno/repository/usr/local/pkg/rsync/authenticate.c,v
> retrieving revision 1.1.1.4
> retrieving revision 1.3
> diff -c -b -r1.1.1.4 -r1.3
> *** authenticate.c    2001/10/19 04:10:00     1.1.1.4
> --- authenticate.c    2001/10/24 22:00:38     1.3
> ***************
> *** 202,208 ****
>   
>      otherwise return username
>   */
> ! char *auth_server(int fd, int module, char *addr, char *leader)
>   {
>       char *users = lp_auth_users(module);
>       char challenge[16];
> --- 202,208 ----
>   
>      otherwise return username
>   */
> ! char *auth_server(int f_in, int f_out, int module, char *addr, char *leader)
>   {
>       char *users = lp_auth_users(module);
>       char challenge[16];
> ***************
> *** 221,229 ****
>       
>       base64_encode(challenge, 16, b64_challenge);
>   
> !     io_printf(fd,"%s%s\n", leader, b64_challenge);
>   
> !     if (!read_line(fd, line, sizeof(line)-1)) {
>               return NULL;
>       }
>   
> --- 221,229 ----
>       
>       base64_encode(challenge, 16, b64_challenge);
>   
> !     io_printf(f_out,"%s%s\n", leader, b64_challenge);
>   
> !     if (!read_line(f_in, line, sizeof(line)-1)) {
>               return NULL;
>       }
>   
> Index: clientserver.c
> ===================================================================
> RCS file: /juno/repository/usr/local/pkg/rsync/clientserver.c,v
> retrieving revision 1.1.1.4
> retrieving revision 1.5
> diff -c -b -r1.1.1.4 -r1.5
> *** clientserver.c    2001/10/19 04:09:27     1.1.1.4
> --- clientserver.c    2001/11/21 03:37:30     1.5
> ***************
> *** 29,48 ****
>   
>   int start_socket_client(char *host, char *path, int argc, char *argv[])
>   {
> !     int fd, i;
> !     char *sargs[MAX_ARGS];
> !     int sargc=0;
> !     char line[MAXPATHLEN];
>       char *p, *user=NULL;
> -     extern int remote_version;
> -     extern int am_sender;
>       extern struct in_addr socket_address;
> - 
> -     if (argc == 0 && !am_sender) {
> -             extern int list_only;
> -             list_only = 1;
> -     }
>   
>       if (*path == '/') {
>               rprintf(FERROR,"ERROR: The remote path must start with a module 
>name\n");
>               return -1;
> --- 29,42 ----
>   
>   int start_socket_client(char *host, char *path, int argc, char *argv[])
>   {
> !     int fd;
> !     int ret;
>       char *p, *user=NULL;
>       extern struct in_addr socket_address;
>   
> +     /* this is redundant with code in start_inband_exchange(), but
> +        this short-circuits a problem before we open a socket, and 
> +        the extra check won't hurt */
>       if (*path == '/') {
>               rprintf(FERROR,"ERROR: The remote path must start with a module 
>name\n");
>               return -1;
> ***************
> *** 55,68 ****
>               *p = 0;
>       }
>   
> -     if (!user) user = getenv("USER");
> -     if (!user) user = getenv("LOGNAME");
> - 
>       fd = open_socket_out(host, rsync_port, &socket_address);
>       if (fd == -1) {
>               exit_cleanup(RERR_SOCKETIO);
>       }
>       
>       server_options(sargs,&sargc);
>   
>       sargs[sargc++] = ".";
> --- 49,96 ----
>               *p = 0;
>       }
>   
>       fd = open_socket_out(host, rsync_port, &socket_address);
>       if (fd == -1) {
>               exit_cleanup(RERR_SOCKETIO);
>       }
>       
> +     ret = start_inband_exchange(user, path, fd, fd, argc, argv);
> + 
> +     return (ret < 0 ) ? ret : client_run(fd, fd, -1, argc, argv);
> + }
> + 
> + int start_inband_exchange(char *user, char *path, int f_in, int f_out, int argc, 
>char *argv[])
> + {
> +     int i;
> +     char *sargs[MAX_ARGS];
> +     int sargc = 0;
> +     char line[MAXPATHLEN];
> +     char *p;
> +     extern int remote_version;
> +     extern int am_sender;
> +     extern int daemon_over_rsh;
> +     extern char *remote_user;
> + 
> +     if (argc == 0 && !am_sender) {
> +             extern int list_only;
> +             list_only = 1;
> +     }
> + 
> +     if (*path == '/') {
> +             rprintf(FERROR,"ERROR: The remote path must start with a module 
>name\n");
> +             return -1;
> +     }
> + 
> +     if (!user) user = getenv("USER");
> +     if (!user) user = getenv("LOGNAME");
> +     if (!remote_user) {
> +             remote_user = user;
> +     }
> + 
> +     /* set daemon_over_rsh to false since we need to build the 
> +        true set of args passed through the rsh/ssh connection; 
> +        this is a no-op for direct-socket-connection mode */
> +     daemon_over_rsh = 0;
>       server_options(sargs,&sargc);
>   
>       sargs[sargc++] = ".";
> ***************
> *** 72,80 ****
>   
>       sargs[sargc] = NULL;
>   
> !     io_printf(fd,"@RSYNCD: %d\n", PROTOCOL_VERSION);
>   
> !     if (!read_line(fd, line, sizeof(line)-1)) {
>               return -1;
>       }
>   
> --- 100,108 ----
>   
>       sargs[sargc] = NULL;
>   
> !     io_printf(f_out,"@RSYNCD: %d\n", PROTOCOL_VERSION);
>   
> !     if (!read_line(f_in, line, sizeof(line)-1)) {
>               return -1;
>       }
>   
> ***************
> *** 84,99 ****
>   
>       p = strchr(path,'/');
>       if (p) *p = 0;
> !     io_printf(fd,"%s\n",path);
>       if (p) *p = '/';
>   
>       while (1) {
> !             if (!read_line(fd, line, sizeof(line)-1)) {
>                       return -1;
>               }
>   
>               if (strncmp(line,"@RSYNCD: AUTHREQD ",18) == 0) {
> !                     auth_client(fd, user, line+18);
>                       continue;
>               }
>   
> --- 112,127 ----
>   
>       p = strchr(path,'/');
>       if (p) *p = 0;
> !     io_printf(f_out,"%s\n",path);
>       if (p) *p = '/';
>   
>       while (1) {
> !             if (!read_line(f_in, line, sizeof(line)-1)) {
>                       return -1;
>               }
>   
>               if (strncmp(line,"@RSYNCD: AUTHREQD ",18) == 0) {
> !                     auth_client(f_out, remote_user, line+18);
>                       continue;
>               }
>   
> ***************
> *** 102,122 ****
>       }
>   
>       for (i=0;i<sargc;i++) {
> !             io_printf(fd,"%s\n", sargs[i]);
>       }
> !     io_printf(fd,"\n");
>   
>       if (remote_version < 23) {
>               if (remote_version == 22 || (remote_version > 17 && !am_sender))
> !                     io_start_multiplex_in(fd);
>       }
>   
> !     return client_run(fd, fd, -1, argc, argv);
> ! }
>   
>   
>   
> ! static int rsync_module(int fd, int i)
>   {
>       int argc=0;
>       char *argv[MAX_ARGS];
> --- 130,150 ----
>       }
>   
>       for (i=0;i<sargc;i++) {
> !             io_printf(f_out,"%s\n", sargs[i]);
>       }
> !     io_printf(f_out,"\n");
>   
>       if (remote_version < 23) {
>               if (remote_version == 22 || (remote_version > 17 && !am_sender))
> !                     io_start_multiplex_in(f_in);
>       }
>   
> !     return 0;
>   
> + }
>   
>   
> ! static int rsync_module(int f_in, int f_out, int i)
>   {
>       int argc=0;
>       char *argv[MAX_ARGS];
> ***************
> *** 125,170 ****
>       uid_t uid = (uid_t)-2;
>       gid_t gid = (gid_t)-2;
>       char *p;
> !     char *addr = client_addr(fd);
> !     char *host = client_name(fd);
>       char *name = lp_name(i);
>       int use_chroot = lp_use_chroot(i);
>       int start_glob=0;
>       int ret;
>       char *request=NULL;
>       extern int am_sender;
>       extern int remote_version;
>       extern int am_root;
>   
>       if (!allow_access(addr, host, lp_hosts_allow(i), lp_hosts_deny(i))) {
>               rprintf(FERROR,"rsync denied on module %s from %s (%s)\n",
> !                     name, client_name(fd), client_addr(fd));
> !             io_printf(fd,"@ERROR: access denied to %s from %s (%s)\n",
> !                       name, client_name(fd), client_addr(fd));
>               return -1;
>       }
>   
>       if (!claim_connection(lp_lock_file(i), lp_max_connections(i))) {
>               if (errno) {
>                       rprintf(FERROR,"failed to open lock file %s : %s\n",
>                               lp_lock_file(i), strerror(errno));
> !                     io_printf(fd,"@ERROR: failed to open lock file %s : %s\n",
>                                 lp_lock_file(i), strerror(errno));
>               } else {
>                       rprintf(FERROR,"max connections (%d) reached\n",
>                               lp_max_connections(i));
> !                     io_printf(fd,"@ERROR: max connections (%d) reached - try again 
>later\n", lp_max_connections(i));
>               }
>               return -1;
>       }
>   
>       
> !     auth_user = auth_server(fd, i, addr, "@RSYNCD: AUTHREQD ");
>   
>       if (!auth_user) {
>               rprintf(FERROR,"auth failed on module %s from %s (%s)\n",
> !                     name, client_name(fd), client_addr(fd));
> !             io_printf(fd,"@ERROR: auth failed on module %s\n",name);
>               return -1;              
>       }
>   
> --- 153,214 ----
>       uid_t uid = (uid_t)-2;
>       gid_t gid = (gid_t)-2;
>       char *p;
> !     char *addr;
> !     char *host;
>       char *name = lp_name(i);
>       int use_chroot = lp_use_chroot(i);
>       int start_glob=0;
>       int ret;
>       char *request=NULL;
>       extern int am_sender;
> +     extern int am_server;
> +     extern int am_daemon;
>       extern int remote_version;
>       extern int am_root;
>   
> +     if (is_a_socket(f_in)) {
> +             addr = client_addr(f_in);
> +             host = client_name(f_in);
> +     } else {
> +             char *ssh_client = getenv("SSH_CLIENT");
> +             addr = ssh_client ? ssh_client : "n/a";
> +             host = "remote shell connection";
> +     }
> + 
>       if (!allow_access(addr, host, lp_hosts_allow(i), lp_hosts_deny(i))) {
>               rprintf(FERROR,"rsync denied on module %s from %s (%s)\n",
> !                     name, host, addr);
> !             io_printf(f_out,"@ERROR: access denied to %s from %s (%s)\n",
> !                       name, host, addr);
>               return -1;
>       }
>   
> +     if (am_daemon && am_server) {
> +             rprintf(FINFO, "rsync allowed access on module %s from %s (%s)\n",
> +                     name, host, addr);
> +     }
> + 
>       if (!claim_connection(lp_lock_file(i), lp_max_connections(i))) {
>               if (errno) {
>                       rprintf(FERROR,"failed to open lock file %s : %s\n",
>                               lp_lock_file(i), strerror(errno));
> !                     io_printf(f_out,"@ERROR: failed to open lock file %s : %s\n",
>                                 lp_lock_file(i), strerror(errno));
>               } else {
>                       rprintf(FERROR,"max connections (%d) reached\n",
>                               lp_max_connections(i));
> !                     io_printf(f_out,"@ERROR: max connections (%d) reached - try 
>again later\n", lp_max_connections(i));
>               }
>               return -1;
>       }
>   
>       
> !     auth_user = auth_server(f_in, f_out, i, addr, "@RSYNCD: AUTHREQD ");
>   
>       if (!auth_user) {
>               rprintf(FERROR,"auth failed on module %s from %s (%s)\n",
> !                     name, host, addr);
> !             io_printf(f_out,"@ERROR: auth failed on module %s\n",name);
>               return -1;              
>       }
>   
> ***************
> *** 177,183 ****
>               if (!name_to_uid(p, &uid)) {
>                       if (!isdigit(*p)) {
>                               rprintf(FERROR,"Invalid uid %s\n", p);
> !                             io_printf(fd,"@ERROR: invalid uid\n");
>                               return -1;
>                       } 
>                       uid = atoi(p);
> --- 221,227 ----
>               if (!name_to_uid(p, &uid)) {
>                       if (!isdigit(*p)) {
>                               rprintf(FERROR,"Invalid uid %s\n", p);
> !                             io_printf(f_out,"@ERROR: invalid uid\n");
>                               return -1;
>                       } 
>                       uid = atoi(p);
> ***************
> *** 187,193 ****
>               if (!name_to_gid(p, &gid)) {
>                       if (!isdigit(*p)) {
>                               rprintf(FERROR,"Invalid gid %s\n", p);
> !                             io_printf(fd,"@ERROR: invalid gid\n");
>                               return -1;
>                       } 
>                       gid = atoi(p);
> --- 231,237 ----
>               if (!name_to_gid(p, &gid)) {
>                       if (!isdigit(*p)) {
>                               rprintf(FERROR,"Invalid gid %s\n", p);
> !                             io_printf(f_out,"@ERROR: invalid gid\n");
>                               return -1;
>                       } 
>                       gid = atoi(p);
> ***************
> *** 211,230 ****
>       if (use_chroot) {
>               if (chroot(lp_path(i))) {
>                       rprintf(FERROR,"chroot %s failed\n", lp_path(i));
> !                     io_printf(fd,"@ERROR: chroot failed\n");
>                       return -1;
>               }
>   
>               if (!push_dir("/", 0)) {
>                       rprintf(FERROR,"chdir %s failed\n", lp_path(i));
> !                     io_printf(fd,"@ERROR: chdir failed\n");
>                       return -1;
>               }
>   
>       } else {
>               if (!push_dir(lp_path(i), 0)) {
>                       rprintf(FERROR,"chdir %s failed\n", lp_path(i));
> !                     io_printf(fd,"@ERROR: chdir failed\n");
>                       return -1;
>               }
>               sanitize_paths = 1;
> --- 255,274 ----
>       if (use_chroot) {
>               if (chroot(lp_path(i))) {
>                       rprintf(FERROR,"chroot %s failed\n", lp_path(i));
> !                     io_printf(f_out,"@ERROR: chroot failed\n");
>                       return -1;
>               }
>   
>               if (!push_dir("/", 0)) {
>                       rprintf(FERROR,"chdir %s failed\n", lp_path(i));
> !                     io_printf(f_out,"@ERROR: chdir failed\n");
>                       return -1;
>               }
>   
>       } else {
>               if (!push_dir(lp_path(i), 0)) {
>                       rprintf(FERROR,"chdir %s failed\n", lp_path(i));
> !                     io_printf(f_out,"@ERROR: chdir failed\n");
>                       return -1;
>               }
>               sanitize_paths = 1;
> ***************
> *** 233,257 ****
>       if (am_root) {
>               if (setgid(gid)) {
>                       rprintf(FERROR,"setgid %d failed\n", gid);
> !                     io_printf(fd,"@ERROR: setgid failed\n");
>                       return -1;
>               }
>   
>               if (setuid(uid)) {
>                       rprintf(FERROR,"setuid %d failed\n", uid);
> !                     io_printf(fd,"@ERROR: setuid failed\n");
>                       return -1;
>               }
>   
>               am_root = (getuid() == 0);
>       }
>   
> !     io_printf(fd,"@RSYNCD: OK\n");
>   
>       argv[argc++] = "rsyncd";
>   
>       while (1) {
> !             if (!read_line(fd, line, sizeof(line)-1)) {
>                       return -1;
>               }
>   
> --- 277,301 ----
>       if (am_root) {
>               if (setgid(gid)) {
>                       rprintf(FERROR,"setgid %d failed\n", gid);
> !                     io_printf(f_out,"@ERROR: setgid failed\n");
>                       return -1;
>               }
>   
>               if (setuid(uid)) {
>                       rprintf(FERROR,"setuid %d failed\n", uid);
> !                     io_printf(f_out,"@ERROR: setuid failed\n");
>                       return -1;
>               }
>   
>               am_root = (getuid() == 0);
>       }
>   
> !     io_printf(f_out,"@RSYNCD: OK\n");
>   
>       argv[argc++] = "rsyncd";
>   
>       while (1) {
> !             if (!read_line(f_in, line, sizeof(line)-1)) {
>                       return -1;
>               }
>   
> ***************
> *** 322,328 ****
>   
>       if (remote_version < 23) {
>               if (remote_version == 22 || (remote_version > 17 && am_sender))
> !                     io_start_multiplex_out(fd);
>       }
>   
>       if (!ret) {
> --- 366,372 ----
>   
>       if (remote_version < 23) {
>               if (remote_version == 22 || (remote_version > 17 && am_sender))
> !                     io_start_multiplex_out(f_out);
>       }
>   
>       if (!ret) {
> ***************
> *** 334,340 ****
>               io_timeout = lp_timeout(i);
>       }
>   
> !     start_server(fd, fd, argc, argp);
>   
>       return 0;
>   }
> --- 378,384 ----
>               io_timeout = lp_timeout(i);
>       }
>   
> !     start_server(f_in, f_out, argc, argp);
>   
>       return 0;
>   }
> ***************
> *** 351,376 ****
>                   io_printf(fd, "%-15s\t%s\n", lp_name(i), lp_comment(i));
>   }
>   
> ! /* this is called when a socket connection is established to a client
>      and we want to start talking. The setup of the system is done from
>      here */
> ! static int start_daemon(int fd)
>   {
>       char line[200];
>       char *motd;
>       int i = -1;
>       extern char *config_file;
>       extern int remote_version;
>   
>       if (!lp_load(config_file, 0)) {
>               exit_cleanup(RERR_SYNTAX);
>       }
>   
> !     set_socket_options(fd,"SO_KEEPALIVE");
> !     set_socket_options(fd,lp_socket_options());
> !     set_nonblocking(fd);
>   
> !     io_printf(fd,"@RSYNCD: %d\n", PROTOCOL_VERSION);
>   
>       motd = lp_motd_file();
>       if (motd && *motd) {
> --- 395,423 ----
>                   io_printf(fd, "%-15s\t%s\n", lp_name(i), lp_comment(i));
>   }
>   
> ! /* this is called when a connection is established to a client
>      and we want to start talking. The setup of the system is done from
>      here */
> ! int start_daemon(int f_in, int f_out)
>   {
>       char line[200];
>       char *motd;
>       int i = -1;
>       extern char *config_file;
>       extern int remote_version;
> +     extern int am_server;
>   
>       if (!lp_load(config_file, 0)) {
>               exit_cleanup(RERR_SYNTAX);
>       }
>   
> !     if ( !am_server ) {
> !             set_socket_options(f_in,"SO_KEEPALIVE");
> !             set_socket_options(f_in,lp_socket_options());
> !             set_nonblocking(f_in);
> !     }
>   
> !     io_printf(f_out,"@RSYNCD: %d\n", PROTOCOL_VERSION);
>   
>       motd = lp_motd_file();
>       if (motd && *motd) {
> ***************
> *** 379,428 ****
>                       int len = fread(line, 1, sizeof(line)-1, f);
>                       if (len > 0) {
>                               line[len] = 0;
> !                             io_printf(fd,"%s", line);
>                       }
>               }
>               if (f) fclose(f);
> !             io_printf(fd,"\n");
>       }
>   
> !     if (!read_line(fd, line, sizeof(line)-1)) {
>               return -1;
>       }
>   
>       if (sscanf(line,"@RSYNCD: %d", &remote_version) != 1) {
> !             io_printf(fd,"@ERROR: protocol startup error\n");
>               return -1;
>       }       
>   
>       while (i == -1) {
>               line[0] = 0;
> !             if (!read_line(fd, line, sizeof(line)-1)) {
>                       return -1;
>               }
>   
>               if (!*line || strcmp(line,"#list")==0) {
> !                     send_listing(fd);
>                       return -1;
>               } 
>   
>               if (*line == '#') {
>                       /* it's some sort of command that I don't understand */
> !                     io_printf(fd,"@ERROR: Unknown command '%s'\n", line);
>                       return -1;
>               }
>   
>               i = lp_number(line);
>               if (i == -1) {
> !                     io_printf(fd,"@ERROR: Unknown module '%s'\n", line);
>                       return -1;
>               }
>       }
>   
> !     return rsync_module(fd, i);
>   }
>   
> - 
>   int daemon_main(void)
>   {
>       extern char *config_file;
> --- 426,474 ----
>                       int len = fread(line, 1, sizeof(line)-1, f);
>                       if (len > 0) {
>                               line[len] = 0;
> !                             io_printf(f_out,"%s", line);
>                       }
>               }
>               if (f) fclose(f);
> !             io_printf(f_out,"\n");
>       }
>   
> !     if (!read_line(f_in, line, sizeof(line)-1)) {
>               return -1;
>       }
>   
>       if (sscanf(line,"@RSYNCD: %d", &remote_version) != 1) {
> !             io_printf(f_out,"@ERROR: protocol startup error\n");
>               return -1;
>       }       
>   
>       while (i == -1) {
>               line[0] = 0;
> !             if (!read_line(f_in, line, sizeof(line)-1)) {
>                       return -1;
>               }
>   
>               if (!*line || strcmp(line,"#list")==0) {
> !                     send_listing(f_out);
>                       return -1;
>               } 
>   
>               if (*line == '#') {
>                       /* it's some sort of command that I don't understand */
> !                     io_printf(f_out,"@ERROR: Unknown command '%s'\n", line);
>                       return -1;
>               }
>   
>               i = lp_number(line);
>               if (i == -1) {
> !                     io_printf(f_out,"@ERROR: Unknown module '%s'\n", line);
>                       return -1;
>               }
>       }
>   
> !     return rsync_module(f_in, f_out, i);
>   }
>   
>   int daemon_main(void)
>   {
>       extern char *config_file;
> ***************
> *** 440,446 ****
>                       open("/dev/null", O_RDWR);
>               }
>   
> !             return start_daemon(STDIN_FILENO);
>       }
>   
>       become_daemon();
> --- 486,492 ----
>                       open("/dev/null", O_RDWR);
>               }
>   
> !             return start_daemon(STDIN_FILENO, STDIN_FILENO);
>       }
>   
>       become_daemon();
> Index: main.c
> ===================================================================
> RCS file: /juno/repository/usr/local/pkg/rsync/main.c,v
> retrieving revision 1.1.1.6
> retrieving revision 1.5
> diff -c -b -r1.1.1.6 -r1.5
> *** main.c    2001/10/19 04:09:33     1.1.1.6
> --- main.c    2001/11/21 03:37:30     1.5
> ***************
> *** 126,131 ****
> --- 126,132 ----
>       extern int local_server;
>       extern char *rsync_path;
>       extern int blocking_io;
> +     extern int daemon_over_rsh;
>   
>       if (!local_server) {
>               if (!cmd)
> ***************
> *** 165,172 ****
> --- 166,175 ----
>   
>       args[argc++] = ".";
>   
> +     if (!daemon_over_rsh) {
>               if (path && *path)
>                       args[argc++] = path;
> +     }
>   
>       args[argc] = NULL;
>   
> ***************
> *** 555,561 ****
> --- 558,566 ----
>       extern int am_sender;
>       extern char *shell_cmd;
>       extern int rsync_port;
> +     extern int daemon_over_rsh;
>   
> +     /* rsync:// always uses rsync server over direct socket connection */
>       if (strncasecmp(URL_PREFIX, argv[0], strlen(URL_PREFIX)) == 0) {
>               char *host, *path;
>   
> ***************
> *** 580,586 ****
>       if (p) {
>               if (p[1] == ':') {
>                       *p = 0;
> !                     return start_socket_client(argv[0], p+2, argc-1, argv+1);
>               }
>   
>               if (argc < 1) {
> --- 585,597 ----
>       if (p) {
>               if (p[1] == ':') {
>                       *p = 0;
> !                     if (!shell_cmd) {
> !                             return start_socket_client(argv[0], p+2, 
> !                                                        argc-1, argv+1);
> !                     } else {
> !                             ++p;
> !                             daemon_over_rsh = 1;
> !                     }
>               }
>   
>               if (argc < 1) {
> ***************
> *** 602,608 ****
>                       local_server = 1;
>               } else if (p[1] == ':') {
>                       *p = 0;
> !                     return start_socket_client(argv[argc-1], p+2, argc-1, argv);
>               }
>   
>               if (argc < 2) {
> --- 613,625 ----
>                       local_server = 1;
>               } else if (p[1] == ':') {
>                       *p = 0;
> !                     if (!shell_cmd) {
> !                             return start_socket_client(argv[argc-1], p+2, 
> !                                                        argc-1, argv);
> !                     } else {
> !                             ++p;
> !                             daemon_over_rsh = 1;
> !                     }
>               }
>   
>               if (argc < 2) {
> ***************
> *** 647,654 ****
>               extern int list_only;
>               list_only = 1;
>       }
>       
> !     pid = do_cmd(shell_cmd,shell_machine,shell_user,shell_path,&f_in,&f_out);
>       
>       ret = client_run(f_in, f_out, pid, argc, argv);
>   
> --- 664,683 ----
>               extern int list_only;
>               list_only = 1;
>       }
> + 
> +     pid = do_cmd(shell_cmd,shell_machine,shell_user,shell_path,
> +                  &f_in,&f_out);
>   
> !     /* if we're running an rsync server on the remote host over a
> !        remote shell command, we need to do the RSYNCD protocol first */
> !     if (daemon_over_rsh) {
> !             int tmpret;
> !             tmpret = start_inband_exchange(shell_user, shell_path,
> !                                            f_in, f_out, argc, argv);
> !             if ( tmpret < 0 ) {
> !                     return tmpret;
> !             }
> !     }
>   
>       ret = client_run(f_in, f_out, pid, argc, argv);
>   
> ***************
> *** 712,718 ****
>          that implement getcwd that way "pwd" can't be found after chroot. */
>       push_dir(NULL,0);
>   
> !     if (am_daemon) {
>               return daemon_main();
>       }
>   
> --- 741,747 ----
>          that implement getcwd that way "pwd" can't be found after chroot. */
>       push_dir(NULL,0);
>   
> !     if (am_daemon && !am_server) {
>               return daemon_main();
>       }
>   
> ***************
> *** 734,740 ****
> --- 763,773 ----
>       if (am_server) {
>               set_nonblocking(STDIN_FILENO);
>               set_nonblocking(STDOUT_FILENO);
> +             if (am_daemon) {
> +                     return start_daemon(STDIN_FILENO, STDOUT_FILENO);
> +             } else {
>                       start_server(STDIN_FILENO, STDOUT_FILENO, argc, argv);
> +             }
>       }
>   
>       return start_client(argc, argv);
> Index: options.c
> ===================================================================
> RCS file: /juno/repository/usr/local/pkg/rsync/options.c,v
> retrieving revision 1.1.1.4
> retrieving revision 1.5
> diff -c -b -r1.1.1.4 -r1.5
> *** options.c 2001/10/19 04:09:46     1.1.1.4
> --- options.c 2001/11/21 03:37:30     1.5
> ***************
> *** 53,58 ****
> --- 53,59 ----
>   int module_id = -1;
>   int am_server = 0;
>   int am_sender=0;
> + int daemon_over_rsh = 0;
>   int recurse = 0;
>   int am_daemon=0;
>   int do_stats=0;
> ***************
> *** 84,89 ****
> --- 85,91 ----
>   char *rsync_path = RSYNC_NAME;
>   char *backup_dir = NULL;
>   int rsync_port = RSYNC_PORT;
> + char *remote_user = NULL;
>   
>   int verbose = 0;
>   int quiet = 0;
> ***************
> *** 104,109 ****
> --- 106,113 ----
>   
>     rprintf(F,"Usage: rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST\n");
>     rprintf(F,"  or   rsync [OPTION]... [USER@]HOST:SRC DEST\n");
> +   rprintf(F,"  or   rsync [OPTION]... SRC [SRC]... [USER@]HOST:::DEST\n");
> +   rprintf(F,"  or   rsync [OPTION]... [USER@]HOST:::SRC DEST\n");
>     rprintf(F,"  or   rsync [OPTION]... SRC [SRC]... DEST\n");
>     rprintf(F,"  or   rsync [OPTION]... [USER@]HOST::SRC [DEST]\n");
>     rprintf(F,"  or   rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST\n");
> ***************
> *** 165,170 ****
> --- 169,175 ----
>     rprintf(F,"     --daemon                run as a rsync daemon\n");  
>     rprintf(F,"     --address               bind to the specified address\n");  
>     rprintf(F,"     --config=FILE           specify alternate rsyncd.conf file\n");  
> +   rprintf(F,"     --remote-user=USER      remote username for ::: mode\n");
>     rprintf(F,"     --port=PORT             specify alternate rsyncd port number\n");
>     rprintf(F,"     --blocking-io           use blocking IO for the remote 
>shell\n");  
>     rprintf(F,"     --stats                 give some file transfer stats\n");  
> ***************
> *** 188,194 ****
>         OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
>         OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR, 
>         OPT_IGNORE_ERRORS, OPT_BWLIMIT, OPT_BLOCKING_IO,
> !       OPT_MODIFY_WINDOW};
>   
>   static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP";
>   
> --- 193,199 ----
>         OPT_LOG_FORMAT, OPT_PASSWORD_FILE, OPT_SIZE_ONLY, OPT_ADDRESS,
>         OPT_DELETE_AFTER, OPT_EXISTING, OPT_MAX_DELETE, OPT_BACKUP_DIR, 
>         OPT_IGNORE_ERRORS, OPT_BWLIMIT, OPT_BLOCKING_IO,
> !       OPT_MODIFY_WINDOW, OPT_REMOTE_USER};
>   
>   static char *short_options = "oblLWHpguDCtcahvqrRIxnSe:B:T:zP";
>   
> ***************
> *** 249,254 ****
> --- 254,260 ----
>     {"ignore-errors",0,     0,   OPT_IGNORE_ERRORS},
>     {"blocking-io" ,0,     0,    OPT_BLOCKING_IO},
>     {"config",      1,     0,    OPT_CONFIG},
> +   {"remote-user", 1,     0,    OPT_REMOTE_USER},
>     {"port",        1,     0,    OPT_PORT},
>     {"log-format",  1,     0,    OPT_LOG_FORMAT},
>     {"bwlimit",         1,     0,    OPT_BWLIMIT},
> ***************
> *** 571,576 ****
> --- 577,586 ----
>                       config_file = optarg;
>                       break;
>   
> +             case OPT_REMOTE_USER:
> +                     remote_user = optarg;
> +                     break;
> + 
>               case OPT_PORT:
>                       rsync_port = atoi(optarg);
>                       break;
> ***************
> *** 620,625 ****
> --- 630,642 ----
>       int i, x;
>   
>       args[ac++] = "--server";
> + 
> +     if (daemon_over_rsh) {
> +             args[ac++] = "--daemon";
> +             *argc = ac;
> +             /* if we're passing --daemon, we're done */
> +             return;
> +     }
>   
>       if (!am_sender)
>               args[ac++] = "--sender";
> Index: proto.h
> ===================================================================
> RCS file: /juno/repository/usr/local/pkg/rsync/proto.h,v
> retrieving revision 1.1.1.6
> retrieving revision 1.4
> diff -c -b -r1.1.1.6 -r1.4
> *** proto.h   2001/10/19 04:09:57     1.1.1.6
> --- proto.h   2001/11/19 20:31:47     1.4
> ***************
> *** 1,7 ****
>   /* This file is automatically generated with "make proto". DO NOT EDIT */
>   
>   int allow_access(char *addr, char *host, char *allow_list, char *deny_list);
> ! char *auth_server(int fd, int module, char *addr, char *leader);
>   void auth_client(int fd, char *user, char *challenge);
>   int make_backup(char *fname);
>   uint32 get_checksum1(char *buf1,int len);
> --- 1,7 ----
>   /* This file is automatically generated with "make proto". DO NOT EDIT */
>   
>   int allow_access(char *addr, char *host, char *allow_list, char *deny_list);
> ! char *auth_server(int f_in, int f_out, int module, char *addr, char *leader);
>   void auth_client(int fd, char *user, char *challenge);
>   int make_backup(char *fname);
>   uint32 get_checksum1(char *buf1,int len);
> ***************
> *** 17,22 ****
> --- 17,24 ----
>                struct map_struct *buf, int fd1, int fd2);
>   void cleanup_set_pid(int pid);
>   int start_socket_client(char *host, char *path, int argc, char *argv[]);
> + int start_inband_exchange(char *user, char *path, int f_in, int f_out, int argc, 
>char *argv[]);
> + int start_daemon(int f_in, int f_out);
>   int daemon_main(void);
>   void setup_protocol(int f_out,int f_in);
>   int claim_connection(char *fname,int max_connections);
> ***************
> *** 145,151 ****
>   void send_files(struct file_list *flist,int f_out,int f_in);
>   int open_socket_out(char *host, int port, struct in_addr *address);
>   int is_a_socket(int fd);
> ! void start_accept_loop(int port, int (*fn)(int ));
>   void set_socket_options(int fd, char *options);
>   void become_daemon(void);
>   char *client_addr(int fd);
> --- 147,153 ----
>   void send_files(struct file_list *flist,int f_out,int f_in);
>   int open_socket_out(char *host, int port, struct in_addr *address);
>   int is_a_socket(int fd);
> ! void start_accept_loop(int port, int (*fn)(int, int));
>   void set_socket_options(int fd, char *options);
>   void become_daemon(void);
>   char *client_addr(int fd);
> Index: rsync.1
> ===================================================================
> RCS file: /juno/repository/usr/local/pkg/rsync/rsync.1,v
> retrieving revision 1.1.1.6
> retrieving revision 1.5
> diff -c -b -r1.1.1.6 -r1.5
> *** rsync.1   2001/10/19 04:09:42     1.1.1.6
> --- rsync.1   2001/11/21 03:37:31     1.5
> ***************
> *** 1,4 ****
> ! .TH "rsync" "1" "1 Mar 1999" "" "" 
>   .SH "NAME" 
>   rsync \- faster, flexible replacement for rcp
>   .SH "SYNOPSIS" 
> --- 1,4 ----
> ! .TH "rsync" "1" "31 Oct 2001" "" "" 
>   .SH "NAME" 
>   rsync \- faster, flexible replacement for rcp
>   .SH "SYNOPSIS" 
> ***************
> *** 47,53 ****
>   .PP 
>   .SH "GENERAL" 
>   .PP 
> ! There are six different ways of using rsync\&. They are:
>   .PP 
>   .IP o 
>   for copying local files\&. This is invoked when neither
> --- 47,53 ----
>   .PP 
>   .SH "GENERAL" 
>   .PP 
> ! There are eight different ways of using rsync\&. They are:
>   .PP 
>   .IP o 
>   for copying local files\&. This is invoked when neither
> ***************
> *** 75,80 ****
> --- 75,92 ----
>   separator\&. 
>   .IP 
>   .IP o 
> + for copying from a remote machine using a remote shell program as the
> + transport, using rsync server on the remote machine\&.  This is
> + invoked when the source path contains a :: separator and the \fB-e
> + remote-shell\fR option is also provided\&.
> + .IP 
> + .IP o 
> + for copying from the local machine to a remote machine using a remote
> + shell program as the transport, using rsync server on the remote
> + machine\&.  This is invoked when the destination path contains a ::
> + separator and the \fB-e remote-shell\fR option is also provided\&.
> + .IP 
> + .IP o 
>   for listing files on a remote machine\&. This is done the
>   same way as rsync transfers except that you leave off the
>   local destination\&.  
> ***************
> *** 155,161 ****
>   transport\&. In this case you will connect to a remote rsync server
>   running on TCP port 873\&. 
>   .PP 
> ! You may establish the connetcion via a web proxy by setting the
>   environment variable RSYNC_PROXY to a hostname:port pair pointing to
>   your web proxy\&. Note that your web proxy must allow proxying to port
>   873, this must be configured in your proxy servers ruleset\&.
> --- 167,173 ----
>   transport\&. In this case you will connect to a remote rsync server
>   running on TCP port 873\&. 
>   .PP 
> ! You may establish the connection via a web proxy by setting the
>   environment variable RSYNC_PROXY to a hostname:port pair pointing to
>   your web proxy\&. Note that your web proxy must allow proxying to port
>   873, this must be configured in your proxy servers ruleset\&.
> ***************
> *** 188,199 ****
> --- 200,258 ----
>   WARNING: On some systems environment variables are visible to all
>   users\&. On those systems using --password-file is recommended\&.
>   .PP 
> + .SH "CONNECTING TO AN RSYNC SERVER OVER A REMOTE SHELL PROGRAM" 
> + .PP
> + It is sometimes useful to be able to set up file transfers using rsync
> + server capabilities on the remote machine, while still using rsh or
> + ssh for transport.  This is especially useful when you want to connect
> + to a remote machine via ssh (for encryption or to get through a
> + firewall), but you still want to have access to the rsync server
> + features (see \fBRUNNING AN RSYNC SERVER OVER A REMOTE SHELL
> + PROGRAM\fR, below).  
> + .PP
> + From the user's perspective, using rsync in this way is the same as
> + using it to connect to an rsync server, except that you must
> + explicitly set the remote shell program on the command line with \fB-e
> + remote-shell\fR.  (Setting RSYNC_RSH in the environment will not turn
> + on this functionality\&.)
> + .PP
> + If you connect to a remote host as a user, e.g. via
> + .PP
> + rsync -a local-path user@host::module/remote-path
> + .PP
> + then the \fBuser\fR is for the remote shell connection.  If you want
> + to be able to also use different users defined in rsyncd.conf, then
> + you can use the --remote-user=USER option (see below)\&.
> + .PP
>   .SH "RUNNING AN RSYNC SERVER" 
>   .PP 
>   An rsync server is configured using a config file which by default is
>   called /etc/rsyncd\&.conf\&. Please see the rsyncd\&.conf(5) man page for more
>   information\&. 
>   .PP 
> + .SH "RUNNING AN RSYNC SERVER OVER A REMOTE SHELL PROGRAM" 
> + .PP 
> + See the rsyncd\&.conf(5) man page for full information on the rsync
> + server configuration file.  
> + .PP
> + Several configuration options will not be available unless the remote
> + user is root (e.g. chroot, setuid/setgid, etc.).  There is no need to
> + configure inetd or the services map to include the rsync server port
> + if you run an rsync server via a remote shell program.
> + .PP
> + To run an rsync server out of a single-use ssh key, use the
> + "command=\fIcommand\fR" syntax in the remote user's
> + \fIauthorized_keys\fR entry, where \fIcommand\fR would be
> + .PP
> + rsync --server --daemon .
> + .PP
> + (rsync's argument parsing expects the trailing ".", so make sure that
> + it's there).  If you want to use a rsyncd\&.conf(5)-style
> + configuration file other than /etc/rsyncd.conf, you can added a
> + --config-file option to the \fIcommand\fR:
> + .PP 
> + rsync --server --daemon --config-file=<file> .
> + .PP
>   .SH "EXAMPLES" 
>   .PP 
>   Here are some examples of how I use rsync\&.
> ***************
> *** 298,303 ****
> --- 357,363 ----
>        --daemon                run as a rsync daemon
>        --address               bind to the specified address
>        --config=FILE           specify alternate rsyncd\&.conf file
> +      --remote-user=USER      remote username for :: mode
>        --port=PORT             specify alternate rsyncd port number
>        --blocking-io           use blocking IO for the remote shell
>        --stats                 give some file transfer stats
> ***************
> *** 566,573 ****
>   remote copies of rsync\&. By default, rsync will use rsh, but you may
>   like to instead use ssh because of its high security\&.
>   .IP 
>   You can also choose the remote shell program using the RSYNC_RSH
> ! environment variable\&.
>   .IP 
>   .IP "\fB--rsync-path=PATH\fP" 
>   Use this to specify the path to the copy of
> --- 626,641 ----
>   remote copies of rsync\&. By default, rsync will use rsh, but you may
>   like to instead use ssh because of its high security\&.  
>   .IP
> + If this option is used with \fB[user@]host::module/path\fR, then the
> + remote shell COMMAND will be used to run an rsync server on the remote
> + host, and all data will be transmitted through that remote shell
> + connection, rather than through a direct socket connection to a
> + running rsync server on the remote host\&.
> + .IP 
>   You can also choose the remote shell program using the RSYNC_RSH
> ! environment variable\&.  However, this will not trigger the
> ! run-rsync-server-over-a-remote-shell behavior if the :: form is used
> ! for SOURCE or DEST; that requires an explicit \fB-e remote-shell\fR.
>   .IP 
>   .IP "\fB--rsync-path=PATH\fP" 
>   Use this to specify the path to the copy of
> ***************
> *** 713,718 ****
> --- 781,797 ----
>   This specifies an alternate config file than
>   the default /etc/rsyncd\&.conf\&. This is only relevant when --daemon is
>   specified\&. 
> + .IP 
> + .IP "\fB--remote-user=USER\fP" 
> + This option allows you to specify the \fIrsyncd.conf\fR-level username
> + separately from the rsh/ssh-level username, e.g. when using
> + \fB-e remote-shell\fR and \fBrsh-user@host::module/path\fR.  The
> + \fBrsh-user\fR is used for logging into the remote \fBhost\fR at the
> + rsh/ssh level -- and is not necessarily the \fBUSER\fR you want to use
> + at the \fIrsyncd.conf\fR level.  Use of this option will use
> + \fBUSER\fR instead of the \fBuser\fR obtained from
> + \fBuser@host::module/path\fR in the protocol between the rsync client
> + and rsync server.
>   .IP 
>   .IP "\fB--port=PORT\fP" 
>   This specifies an alternate TCP port number to use
> Index: socket.c
> ===================================================================
> RCS file: /juno/repository/usr/local/pkg/rsync/socket.c,v
> retrieving revision 1.1.1.4
> retrieving revision 1.2
> diff -c -b -r1.1.1.4 -r1.2
> *** socket.c  2001/10/19 04:09:53     1.1.1.4
> --- socket.c  2001/11/19 20:31:48     1.2
> ***************
> *** 222,228 ****
>   }
>   
>   
> ! void start_accept_loop(int port, int (*fn)(int ))
>   {
>       int s;
>       extern struct in_addr socket_address;
> --- 222,228 ----
>   }
>   
>   
> ! void start_accept_loop(int port, int (*fn)(int, int))
>   {
>       int s;
>       extern struct in_addr socket_address;
> ***************
> *** 272,278 ****
>               if (fork()==0) {
>                       close(s);
>   
> !                     _exit(fn(fd));
>               }
>   
>               close(fd);
> --- 272,278 ----
>               if (fork()==0) {
>                       close(s);
>   
> !                     _exit(fn(fd, fd));
>               }
>   
>               close(fd);
> 
> 
> 

-- 
The trouble with being poor is that it takes up all your time.


Reply via email to