After OpenSSH lost it's ability to talk rsh, I have added a switch to our
rsh and rlogin programs to allow using them with some non-standard port
numbers:

===>    smaug# rsh -p 9999 vulab1 date
        Sat Mar 29 06:31:55 CET 2003
===>    smaug# rsh -p 9998 vulab1
        Last login: Sat Mar 29 06:28:05 2003 from 10.0.0.250
        ...
===>    smaug# rlogin -p 9998 vulab1
        Last login: Sat Mar 29 06:32:01 2003 from 10.0.0.250
        ...


Index: rsh/rsh.1
===================================================================
RCS file: /cvsroot/src/usr.bin/rsh/rsh.1,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- rsh/rsh.1	2003/02/25 10:35:53	1.12
+++ rsh/rsh.1	2003/04/07 01:46:41	1.13
@@ -1,4 +1,4 @@
-.\"	$NetBSD: rsh.1,v 1.12 2003/02/25 10:35:53 wiz Exp $
+.\"	$NetBSD: rsh.1,v 1.13 2003/04/07 01:46:41 hubertf Exp $
 .\"
 .\" Copyright (c) 1983, 1990, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -33,7 +33,7 @@
 .\"
 .\"	@(#)rsh.1	8.2 (Berkeley) 4/29/95
 .\"
-.Dd April 29, 1995
+.Dd March 29, 2003
 .Dt RSH 1
 .Os
 .Sh NAME
@@ -44,11 +44,14 @@
 .Op Fl Kdnx
 .Op Fl k Ar realm
 .Op Fl l Ar username
+.Op Fl p Ar port
 .Ar host
 .Op command
+
 .Nm
 .Op Fl Kdnx
 .Op Fl k Ar realm
+.Op Fl p Ar port
 .Ar username@host
 .Op command
 .Sh DESCRIPTION
@@ -107,6 +110,20 @@
 (see the
 .Sx BUGS
 section of this manual page).
+.It Fl p
+Uses the given
+.Pa port
+instead of the one assigned to the service "shell".
+May be given either as symbolic name or as number.
+If no command is given, note that 
+.Nm rlogin
+is started, which may need a different daemon 
+.Nm ( rlogind ,
+instead of 
+.Nm rshd )
+running on the server; You want to pass the 
+.Nm rshd 's
+port number in that case.
 .It Fl x
 The
 .Fl x
Index: rsh/rsh.c
===================================================================
RCS file: /cvsroot/src/usr.bin/rsh/rsh.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- rsh/rsh.c	2002/11/16 13:47:34	1.16
+++ rsh/rsh.c	2003/04/07 01:46:41	1.17
@@ -1,4 +1,4 @@
-/*	$NetBSD: rsh.c,v 1.16 2002/11/16 13:47:34 itojun Exp $	*/
+/*	$NetBSD: rsh.c,v 1.17 2003/04/07 01:46:41 hubertf Exp $	*/
 
 /*-
  * Copyright (c) 1983, 1990, 1993, 1994
@@ -43,7 +43,7 @@
 #if 0
 static char sccsid[] = "@(#)rsh.c	8.4 (Berkeley) 4/29/95";
 #else
-__RCSID("$NetBSD: rsh.c,v 1.16 2002/11/16 13:47:34 itojun Exp $");
+__RCSID("$NetBSD: rsh.c,v 1.17 2003/04/07 01:46:41 hubertf Exp $");
 #endif
 #endif /* not lint */
 
@@ -114,10 +114,12 @@
 	pid_t pid;
 	uid_t uid;
 	char *args, *host, *p, *user, *name;
+	char *service=NULL;
 
 	argoff = asrsh = dflag = nflag = 0;
 	one = 1;
 	host = user = NULL;
+	sp = NULL;
 
 #ifndef IN_RCMD
 	/*
@@ -147,24 +149,24 @@
 
 # ifdef KERBEROS
 #  ifdef CRYPT
-#   define	OPTIONS	"8KLdek:l:nu:wx"
+#   define	OPTIONS	"8KLdek:l:np:u:wx"
 #  else
-#   define	OPTIONS	"8KLdek:l:nu:w"
+#   define	OPTIONS	"8KLdek:l:np:u:w"
 #  endif
 # else
-#  define	OPTIONS	"8KLdel:nu:w"
+#  define	OPTIONS	"8KLdel:np:u:w"
 # endif
 
 #else /* IN_RCMD */
 
 # ifdef KERBEROS
 #  ifdef CRYPT
-#   define	OPTIONS	"8KLdek:l:nwx"
+#   define	OPTIONS	"8KLdek:l:np:wx"
 #  else
-#   define	OPTIONS	"8KLdek:l:nw"
+#   define	OPTIONS	"8KLdek:l:np:w"
 #  endif
 # else
-#  define	OPTIONS	"8KLdel:nw"
+#  define	OPTIONS	"8KLdel:np:w"
 # endif
 
 #endif /* IN_RCMD */
@@ -201,6 +203,18 @@
 		case 'n':
 			nflag = 1;
 			break;
+		case 'p':
+			service = optarg;
+			sp = getservbyname(service, "tcp");
+			if (sp == NULL) {	/* number given, no name */
+				sp = malloc(sizeof(*sp));
+				memset(sp, 0, sizeof(*sp));
+				sp->s_name = service;
+				sp->s_port = atoi(service);
+				if (sp->s_port <= 0 || sp->s_port > IPPORT_ANONMAX)
+					errx(1,"port must be between 1 and %d", IPPORT_ANONMAX);
+			}
+			break;
 #ifdef IN_RCMD
 		case 'u':
 			if (getuid() != 0 && optarg && name &&
@@ -265,10 +279,11 @@
 
 	args = copyargs(argv);
 
-	sp = NULL;
 #ifdef KERBEROS
 	if (use_kerberos) {
-		sp = getservbyname((doencrypt ? "ekshell" : "kshell"), "tcp");
+		if (sp == NULL) {
+			sp = getservbyname((doencrypt ? "ekshell" : "kshell"), "tcp");
+		}
 		if (sp == NULL) {
 			use_kerberos = 0;
 			warning("can't get entry for %s/tcp service",
@@ -578,7 +593,7 @@
 {
 
 	(void)fprintf(stderr,
-	    "usage: %s [-nd%s]%s[-l login]%s [login@]host %s\n", getprogname(),
+	    "usage: %s [-nd%s]%s[-l login] [-p port]%s [login@]host %s\n", getprogname(),
 #ifdef KERBEROS
 #ifdef CRYPT
 	    "x", " [-k realm] ",
Index: rlogin/rlogin.1
===================================================================
RCS file: /cvsroot/src/usr.bin/rlogin/rlogin.1,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- rlogin/rlogin.1	2003/02/25 10:35:52	1.14
+++ rlogin/rlogin.1	2003/04/07 01:46:42	1.15
@@ -1,4 +1,4 @@
-.\"	$NetBSD: rlogin.1,v 1.14 2003/02/25 10:35:52 wiz Exp $
+.\"	$NetBSD: rlogin.1,v 1.15 2003/04/07 01:46:42 hubertf Exp $
 .\"
 .\" Copyright (c) 1983, 1990, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -33,7 +33,7 @@
 .\"
 .\"	@(#)rlogin.1	8.2 (Berkeley) 4/29/95
 .\"
-.Dd April 29, 1995
+.Dd March 29, 2003
 .Dt RLOGIN 1
 .Os
 .Sh NAME
@@ -45,11 +45,14 @@
 .Op Fl e Ar char
 .Op Fl k Ar realm
 .Op Fl l Ar username
+.Op Fl p Ar port
 .Ar host
+
 .Nm
 .Op Fl 8EKLdx
 .Op Fl e Ar char
 .Op Fl k Ar realm
+.Op Fl p Ar port
 .Ar username@host
 .Sh DESCRIPTION
 .Nm
@@ -115,6 +118,11 @@
 .Ar username
 for the remote login.
 If this option is not specified, your local username will be used.
+.It Fl p
+Uses the given
+.Pa port 
+instead of the one assigned to the service "login".
+May be given either as symbolic name or as number.
 .It Fl x
 The
 .Fl x
Index: rlogin/rlogin.c
===================================================================
RCS file: /cvsroot/src/usr.bin/rlogin/rlogin.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- rlogin/rlogin.c	2002/11/16 04:42:26	1.27
+++ rlogin/rlogin.c	2003/04/07 01:46:42	1.28
@@ -1,4 +1,4 @@
-/*	$NetBSD: rlogin.c,v 1.27 2002/11/16 04:42:26 itojun Exp $	*/
+/*	$NetBSD: rlogin.c,v 1.28 2003/04/07 01:46:42 hubertf Exp $	*/
 
 /*
  * Copyright (c) 1983, 1990, 1993
@@ -43,7 +43,7 @@
 #if 0
 static char sccsid[] = "@(#)rlogin.c	8.4 (Berkeley) 4/29/95";
 #else
-__RCSID("$NetBSD: rlogin.c,v 1.27 2002/11/16 04:42:26 itojun Exp $");
+__RCSID("$NetBSD: rlogin.c,v 1.28 2003/04/07 01:46:42 hubertf Exp $");
 #endif
 #endif /* not lint */
 
@@ -160,6 +160,7 @@
 	char *host, *p, *user, *name, term[1024] = "network";
 	speed_t ospeed;
 	struct sigaction sa;
+	char *service=NULL;
 	struct rlimit rlim;
 #ifdef KERBEROS
 	KTEXT_ST ticket;
@@ -173,6 +174,7 @@
 	argoff = dflag = 0;
 	one = 1;
 	host = user = NULL;
+	sp = NULL;
 
 	if (strcmp(getprogname(), "rlogin") != 0) {
 		host = strdup(getprogname());
@@ -187,9 +189,9 @@
 	}
 
 #ifdef KERBEROS
-#define	OPTIONS	"8EKLde:k:l:x"
+#define	OPTIONS	"8EKLde:p:k:l:x"
 #else
-#define	OPTIONS	"8EKLde:l:"
+#define	OPTIONS	"8EKLde:p:l:"
 #endif
 	while ((ch = getopt(argc - argoff, argv + argoff, OPTIONS)) != -1)
 		switch(ch) {
@@ -222,6 +224,19 @@
 		case 'l':
 			user = optarg;
 			break;
+		case 'p':
+			/*HF*/
+			service = optarg;
+			sp = getservbyname(service, "tcp");
+			if (sp == NULL) {       /* number given, no name */
+				sp = malloc(sizeof(*sp));
+				memset(sp, 0, sizeof(*sp));
+				sp->s_name = service;
+				sp->s_port = atoi(service);
+				if (sp->s_port <= 0 || sp->s_port > IPPORT_ANONMAX)   
+					errx(1,"port must be between 1 and %d", IPPORT_ANONMAX);
+			}
+			break;
 #ifdef CRYPT
 #ifdef KERBEROS
 		case 'x':
@@ -262,17 +277,18 @@
 		user = name;
 
 #ifdef KERBEROS
-	sp = NULL;
 	if (use_kerberos) {
-		sp = getservbyname((doencrypt ? "eklogin" : "klogin"), "tcp");
 		if (sp == NULL) {
+			sp = getservbyname((doencrypt ? "eklogin" : "klogin"), "tcp");
+		}
+		if (sp == NULL) {
 			use_kerberos = 0;
 			warning("can't get entry for %s/tcp service",
 			    doencrypt ? "eklogin" : "klogin");
 		}
 	}
-	if (sp == NULL)
 #endif
+	if (sp == NULL)
 		sp = getservbyname("login", "tcp");
 	if (sp == NULL)
 		errx(1, "login/tcp: unknown service.");
@@ -340,7 +356,8 @@
 			if (!(dest_realm = krb_realmofhost (host))) {
 				warnx("Unknown realm for host %s.", host);
 				use_kerberos = 0;
-				sp = getservbyname("login", "tcp");
+				if (service != NULL)
+					sp = getservbyname("login", "tcp");
 				goto try_connect;
 			}
 		}
@@ -357,12 +374,14 @@
 					warnx("Host %s not registered for %s",
 				       	      host, "Kerberos rlogin service");
 					use_kerberos = 0;
-					sp = getservbyname("login", "tcp");
+					if (service != NULL) 
+						sp = getservbyname("login", "tcp");
 					goto try_connect;
 				case NO_TKT_FIL:
 					if (through_once++) {
 						use_kerberos = 0;
-						sp = getservbyname("login", "tcp");
+						if (service != NULL) 
+							sp = getservbyname("login", "tcp");
 						goto try_connect;
 					}
 #ifdef notyet
@@ -376,7 +395,8 @@
 				      (rem == -1) ? "rcmd protocol failure" :
 				      krb_err_txt[rem]);
 				use_kerberos = 0;
-				sp = getservbyname("login", "tcp");
+				if (service != NULL) 
+					sp = getservbyname("login", "tcp");
 				goto try_connect;
 			}
 		}
@@ -956,7 +976,7 @@
 usage(void)
 {
 	(void)fprintf(stderr,
-	    "usage: rlogin [ -%s]%s[-e char] [ -l username ] [username@]host\n",
+	    "usage: rlogin [ -%s]%s[-e char] [ -l username ] [-p port] [username@]host\n",
 #ifdef KERBEROS
 #ifdef CRYPT
 	    "8EKLdx", " [-k realm] ");
