[cvsnt] Re: SSH & an unusual port - problem solved with diffs!

Blake McBride blake at integra-online.com
Mon Nov 17 22:36:14 GMT 2003


I solved the problem with the following code change:


--- src/client.c~	Wed Aug 06 13:31:55 2003
+++ src/client.c	Mon Nov 17 15:42:50 2003
@@ -4615,6 +4615,35 @@
     implementing piped_child)... but I'm doing something else at the
     moment, and wish to make only one change at a time.  -Karl */

+static	char	**parse_command(char **p, char *cmd)
+{
+	static	char	buf[128];
+	char	*bp = buf;
+	
+	while (*cmd)
+		if (*cmd == '\\'  &&  cmd[1]) {
+			cmd++;
+			*bp++ = *cmd == ' ' ? '\1' : *cmd;
+			cmd++;
+		} else
+			*bp++ = *cmd++;
+	*bp = '\0';
+	for (bp=buf ; *bp ;) {
+		for (; *bp == ' ' ; bp++);
+		if (*bp)
+			*p++ = bp;
+		for (; *bp  &&  *bp != ' ' ; bp++);
+		if (*bp)
+			*bp++ = '\2';
+	}
+	for (bp=buf ; *bp ; bp++)
+		if (*bp == '\1')
+			*bp = ' ';
+		else if (*bp == '\2')
+			*bp = '\0';
+	return p;
+}
+
  # ifdef START_RSH_WITH_POPEN_RW

  /* This is actually a crock -- it's OS/2-specific, for no one else
@@ -4639,7 +4668,8 @@
      int i = 0;
      /* This needs to fit "rsh", "-b", "-l", "USER", "host",
         "cmd (w/ args)", and NULL.  We leave some room to grow. */
-    char *rsh_argv[10];
+    char *rsh_argv[15];
+    char **p = rsh_argv;

      if (!cvs_rsh)
  	/* People sometimes suggest or assume that this should default
@@ -4667,26 +4697,26 @@
  	cvs_server = "cvs";

      /* The command line starts out with rsh. */
-    rsh_argv[i++] = cvs_rsh;
+    p = parse_command(p, cvs_rsh);

  #   ifdef RSH_NEEDS_BINARY_FLAG
      /* "-b" for binary, under OS/2. */
-    rsh_argv[i++] = "-b";
+    *p++ = "-b";
  #   endif /* RSH_NEEDS_BINARY_FLAG */

      /* Then we strcat more things on the end one by one. */
      if (root->username != NULL)
      {
-	rsh_argv[i++] = "-l";
-	rsh_argv[i++] = root->username;
+	*p++ = "-l";
+	*p++ = root->username;
      }

-    rsh_argv[i++] = root->hostname;
-    rsh_argv[i++] = cvs_server;
-    rsh_argv[i++] = "server";
+    *p++ = root->hostname;
+    *p++ = cvs_server;
+    *p++ = "server";

      /* Mark the end of the arg list. */
-    rsh_argv[i]   = (char *) NULL;
+    *p = (char *) NULL;

      if (trace)
      {
@@ -4740,10 +4770,10 @@
      sprintf (command, "%s server", cvs_server);

      {
-        char *argv[10];
+        char *argv[15];
  	char **p = argv;

-	*p++ = cvs_rsh;
+	p = parse_command(p, cvs_rsh);
  	*p++ = root->hostname;

  	/* If the login names differ between client and server




-----------------------------
Blake McBride
blake at mcbride.name



More information about the cvsnt mailing list