--- cvs-1.12.13+real.orig/src/rsh-client.c
+++ cvs-1.12.13+real/src/rsh-client.c
@@ -53,9 +53,10 @@
     char *cvs_server = (root->cvs_server != NULL
 			? root->cvs_server : getenv ("CVS_SERVER"));
     int i = 0;
-    /* This needs to fit "rsh", "-b", "-l", "USER", "host",
+    /* This needs to fit "rsh", "-b", "-l", "USER", "-p", port, "host",
        "cmd (w/ args)", and NULL.  We leave some room to grow. */
-    char *rsh_argv[10];
+    char *rsh_argv[16];
+    char argvport[16];
 
     if (!cvs_rsh)
 	/* People sometimes suggest or assume that this should default
@@ -97,8 +98,17 @@
 	rsh_argv[i++] = root->username;
     }
 
+    if (root->method == extssh_method && root->port)
+    {
+	snprintf(argvport, sizeof(argvport), "%d", root->port);
+	rsh_argv[i++] = "-p";
+	rsh_argv[i++] = argvport;
+    }
+
     rsh_argv[i++] = root->hostname;
     rsh_argv[i++] = cvs_server;
+    if (readonlyfs)
+	rsh_argv[i++] = "-R";
     rsh_argv[i++] = "server";
 
     /* Mark the end of the arg list. */
@@ -154,10 +164,11 @@
      * on the server machine does not set CVSROOT to something
      * containing a colon (or better yet, upgrade the server).
      */
-    command = Xasprintf ("%s server", cvs_server);
+    command = Xasprintf ("%s%s server", cvs_server, readonlyfs ? " -R" : "");
 
     {
-        char *argv[10];
+	char argvport[16];
+        char *argv[16];
 	char **p = argv;
 
 	*p++ = cvs_rsh;
@@ -171,6 +182,13 @@
 	    *p++ = root->username;
 	}
 
+	if (root->method == extssh_method && root->port)
+	{
+		snprintf(argvport, sizeof(argvport), "%d", root->port);
+		*p++ = "-p";
+		*p++ = argvport;
+	}
+
 	*p++ = root->hostname;
 	*p++ = command;
 	*p++ = NULL;
