On Thu, 2007-08-23 at 20:57 +0100, Pedro Alves wrote:
> >> The rcp you ported doesn't work for me when I try
> >>   rcp mio:/temp/rshd-log.txt .
> >>
> 
> ?
> It works here.  Why shouldn't it?  You're passing an absolute path
> to the device.  The '.' is the local path.  Wrong example, or am I
> missing something?

It is in the recursive directory code, as you say below.

> >> The reason is that the remote rcp (the one on the PDA) is compiled with
> >> the mingw32ce toolset, and the libcwd library. That library offers
> >> chdir() and getcwd() but calls to functions like _open() don't have
> >> information from the current directory.
> >>
> >> There are several ways out of this :
> >> 1- add code to rcp.c to deal with this
> >> 2- compile rcp.c with the cegcc toolset which doesn't have this problem
> >> 3- rewrite rcp.c so it doesn't need this
> >>
> >> I feel for 2 because 1 and 3 are reinventing the wheel. Your idea ?
> >>
> >>    Danny
> > 
> > Grmbl.
> > 
> > I tried both 1 and 2. Unfortunately, solution 1 is much less work than
> > solution 2.
> > 
> 
> That would be my first choice (option 1).  Either implement rcp_open
> around libcwd's getcwd, or call getcwd before _open/open.  Of the top
> of my head, the case that *may* need it is the recursive directory
> copy, but even then, it may not be needed.

Patch below. I've seen both the receive and send do the wrong thing so I
adapted both.

        Danny
-- 
Danny Backx ; danny.backx - at - scarlet.be ; http://danny.backx.info
Index: rcp.c
===================================================================
--- rcp.c	(revision 1047)
+++ rcp.c	(working copy)
@@ -242,6 +242,7 @@
   /* If the target has wildcards, process them.  */
   if ((strchr (strPath, '?') != NULL) || (strchr (strPath, '*') != NULL))
     {
+      debug("ParseTarget: FindFirstFileA %s\n", strPath);
       *hFile = FindFirstFileA (strPath, &wfdFileData);
       if (*hFile != INVALID_HANDLE_VALUE)
 	{
@@ -281,6 +282,7 @@
     {
       /* Check to see if Target is a file or a directory.  */
       strcpy (Target, strPath);
+      debug("ParseTarget: stat %s\n", Target);
       if (stat (Target, &statbuf) != 0)
 	return FALSE;
       else
@@ -401,6 +403,8 @@
   BOOL bTarget;
   BOOL bProcessing;
   struct _stat statbuf;
+  char fullfn[MAX_PATH];
+  int l;
 
   debug ("sending %s\n", Target);
 
@@ -484,8 +488,10 @@
 	      return;
 	    }
 
+	  debug("RcpSvrSend: chdir(%s) at %d\n", Target2, __LINE__);
 	  chdir (Target2);
 	  RcpSvrSend ("*", bRecursive);
+	  debug("RcpSvrSend: chdir(%s) at %d\n", "..", __LINE__);
 	  chdir ("..");
 	}
       else
@@ -496,11 +502,30 @@
 	  else
 	    {
 	      *FileName = 0;
+	      debug("RcpSvrSend: chdir(%s) at %d\n", Target2, __LINE__);
 	      chdir (Target2);
 	      FileName++;
 	    }
 	  /* Open the file for reading.  */
-	  FileId = _open (FileName, O_RDONLY | O_BINARY, S_IWRITE);
+	  /* Before we do that, we need to prepend the current directory to
+	   * the file name, CE doesn't have that, and our libcwd doesn't
+	   * reimplement _open. */
+	  if (FileName[0] != '\\' && FileName[0] != '/')
+	    {
+	      getcwd (fullfn, MAX_PATH+1);
+	      l = strlen (fullfn);
+	      if (fullfn[l-1] != '/')
+		{
+		  fullfn[l] = '/';
+		  fullfn[l+1] = '\0';
+		}
+	      strcat(fullfn, FileName);
+	      FileId = _open (fullfn, O_RDONLY | O_BINARY, S_IWRITE);
+	    }
+	  else
+	    {
+	      FileId = _open (FileName, O_RDONLY | O_BINARY, S_IWRITE);
+	    }
 	  if (FileId == -1)
 	    {
 	      /* Error condition.  */
@@ -668,6 +693,8 @@
   BOOL bDir;
   BOOL bTarget;
   BOOL bProcessing;
+  char fullfn[MAX_PATH]; /* for getcwd workaround */
+  int l;
 
   debug ("RcpSvrRecv\n");
 
@@ -739,6 +766,7 @@
 
       if (bDir)
 	{
+	  debug("RcpSvrRecv: chdir(%s) at %d\n", Target2, __LINE__);
 	  nValue = chdir (Target2);
 	  if (nValue == -1)
 	    {
@@ -841,9 +869,28 @@
 
 	  bDir = FALSE;
 	  /* Open the file for writing.  */
-	  FileId =
-	    _open (Target2, _O_WRONLY | _O_TRUNC | _O_CREAT | _O_BINARY,
-		   _S_IWRITE);
+	  /* Before we do that, we need to prepend the current directory to
+	   * the file name, CE doesn't have that, and our libcwd doesn't
+	   * reimplement _open. */
+	  if (Target2[0] != '\\' && Target2[0] != '/')
+	    {
+	      getcwd (fullfn, MAX_PATH+1);
+	      l = strlen(fullfn);
+	      if (fullfn[l-1] != '/')
+		{
+		  fullfn[l] = '/';
+		  fullfn[l+1] = '\0';
+		}
+	      strcat (fullfn, Target2);
+	      debug ("open file [%s] for write -> ", fullfn);
+	      FileId = _open (fullfn, _O_WRONLY | _O_TRUNC | _O_CREAT | _O_BINARY,
+			      _S_IWRITE);
+	    }
+	  else
+	    {
+	      FileId = _open (Target2, _O_WRONLY | _O_TRUNC | _O_CREAT | _O_BINARY,
+			      _S_IWRITE);
+	    }
 	  if (FileId == -1)
 	    {
 	      /* Error condition.  */
@@ -1009,6 +1056,7 @@
   debug ("closing down\n");
 
   /* Make sure we end up where we started.  */
+  debug("rcp_main: chdir(%s) at %d\n", HomeDir, __LINE__);
   chdir (HomeDir);
   free (HomeDir);
 

Attachment: signature.asc
Description: This is a digitally signed message part

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Cegcc-devel mailing list
Cegcc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cegcc-devel

Reply via email to