[Bug 1924] New: unable to rsync between a PC with cygwin and a unix machine using rsh

samba-bugs at samba.org samba-bugs at samba.org
Wed Oct 13 15:21:01 GMT 2004


https://bugzilla.samba.org/show_bug.cgi?id=1924

           Summary: unable to rsync between a PC with cygwin and a unix
                    machine using rsh
           Product: rsync
           Version: 2.6.3
          Platform: x86
        OS/Version: Windows 2000
            Status: NEW
          Severity: major
          Priority: P3
         Component: core
        AssignedTo: wayned at samba.org
        ReportedBy: patrick.fernandez-canal at airbus.com
         QAContact: rsync-qa at samba.org
                CC: patrick.fernandez-canal at airbus.com


unable to rsync between a PC with cygwin and a unix machine using rsh
The problems occurs only when using rsync with rsh from cygwin, because the rsh 
syntax on cygwin requires that the command shall be quoted.
But when rsync fork/exec the rsh the command apears without quote (as set set 
of argv) and rsh wants the full command as a unique argv entry.

Doing that leads to the follwing message:

$ rsync -av --no-whole-file --rsync-path=/usr/local/bin/rsync -e rsh Partitions
/  wtcrep at pdmread1:/local/home/wtcrep/pfc_tst_rsync
rsh: unknown option -- server
Try `rsh --help' for more information.
rsync: read error: Connection reset by peer
rsync error: error in rsync protocol data stream (code 12) at /home/lapo/packagi
ng/tmp/rsync-2.6.2/io.c(354)

In fact fork exec uses done is the following:
rsh -l wtcrep pdmread1 /usr/local/bin/rsync --server \
     -vvlogDtpr . /local/home/wtcrep/pfc_tst_rsync

and in fact what rsh is waiting for is 
rsh -l wtcrep pdmread1 \
"/usr/local/bin/rsync --server -vvlogDtpr . /local/home/wtcrep/pfc_tst_rsync"

I did tests also between 2 Unix workstations (1 HP & 1 Sun) the rsync works 
fine. There is not the problem described above. I think that rsh 
implementations on Sun & HP are less strict therefore the problem does not 
appear.
But it should appear on Linux machine that uses the same implementation as 
Cygwin.

I did a change in the main.c to get rid of the problem.
My change resides completely  in the do_cmd function
Hoping this can help.

Don't hesitate to contact me if you want additionnal information
kind regards
Patrick

PS: Here is the my code change.
--------------------------------------------------------------------------
/* Start the remote shell.   cmd may be NULL to use the default. */
static pid_t do_cmd(char *cmd, char *machine, char *user, char *path,
		    int *f_in, int *f_out)
{
	int i, argc = 0;
	char *args[100];
	pid_t ret;
	char *tok, *dir = NULL;
	int dash_l_set = 0;
	
        /* Start ofc PFC  patched section
	to handle the of the whole command under cygwin rsh
	----------------------------------------------------
	*/
	char *other_args[100] ;
	int other_argc = 0 ;
	char the_cmd[1024] ;
        /*  End of PFC patched section */

	if (!read_batch && !local_server) {
		char *rsh_env = getenv(RSYNC_RSH_ENV);
		if (!cmd)
			cmd = rsh_env;
		if (!cmd)
			cmd = RSYNC_RSH;
		cmd = strdup(cmd);
		if (!cmd)
			goto oom;

		for (tok = strtok(cmd, " "); tok; tok = strtok(NULL, " "))
			args[argc++] = tok;


		/* check to see if we've already been given '-l user' in
		 * the remote-shell command */
		for (i = 0; i < argc-1; i++) {
			if (!strcmp(args[i], "-l") && args[i+1][0] != '-')
				dash_l_set = 1;
		}

#if HAVE_REMSH
		/* remsh (on HPUX) takes the arguments the other way around */
		args[argc++] = machine;
		if (user && !(daemon_over_rsh && dash_l_set)) {
			args[argc++] = "-l";
			args[argc++] = user;
		}
#else
		if (user && !(daemon_over_rsh && dash_l_set)) {
			args[argc++] = "-l";
			args[argc++] = user;
		}
		args[argc++] = machine;
#endif

/*
----------------------------------------------------
Start ofc PFC patched section 
to handle the of the whole command under cygwin rsh 
----------------------------------------------------
*/
		other_args[other_argc++] = rsync_path;

		if (blocking_io < 0) {
			char *cp;
			if ((cp = strrchr(cmd, '/')) != NULL)
				cp++;
			else
				cp = cmd;
			if (strcmp(cp, "rsh") == 0 || strcmp(cp, "remsh") == 0)
				blocking_io = 1;
		}

		server_options(other_args,&other_argc);
	}

	other_args[other_argc++] = ".";

	if (!daemon_over_rsh && path && *path)
		other_args[other_argc++] = path;

	if (!read_batch && !local_server) {
		strcpy(the_cmd, "");
		for (i=0;i<other_argc;i++){
			strcat(the_cmd, other_args[i] ) ;
			strcat(the_cmd, " " ) ;			
		}
		args[argc++] = the_cmd ;
	}
	else {
		for (i=0;i<other_argc;i++)
			args[argc++] =other_args[i] ;
	} ;
/*
---------------------------
End of PFC patched section 
---------------------------
*/
	
	if (argc >= (int)(sizeof args / sizeof args[0])) {
		rprintf(FERROR, "internal: args[] overflowed in do_cmd()\n");
		exit_cleanup(RERR_MALLOC); /* XXX Need better RERR? */
	}

	args[argc] = NULL;
	

	if (verbose > 3) {
		rprintf(FINFO,"cmd=");
		for (i=0;i<argc;i++)
			rprintf(FINFO,"%s ",args[i]);
		rprintf(FINFO,"\n");
	}

	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);
	}

	if (dir) free(dir);

	return ret;

oom:
	out_of_memory("do_cmd");
	return 0; /* not reached */
}

--------------------------------------------------------------------------

-- 
Configure bugmail: https://bugzilla.samba.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug, or are watching the QA contact.


More information about the rsync mailing list