Subject: review wanted: -p port for rsh / rlogin
To: None <tech-userlevel@netbsd.org>
From: Hubert Feyrer <hubert.feyrer@informatik.fh-regensburg.de>
List: tech-userlevel
Date: 03/29/2003 06:28:08
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
	...

Can someone please review the patch below? Thanks!


 - Hubert



Index: rsh/rsh.1
===================================================================
RCS file: /cvsroot/src/usr.bin/rsh/rsh.1,v
retrieving revision 1.12
diff -u -r1.12 rsh.1
--- rsh/rsh.1	2003/02/25 10:35:53	1.12
+++ rsh/rsh.1	2003/03/29 05:21:35
@@ -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
diff -u -r1.16 rsh.c
--- rsh/rsh.c	2002/11/16 13:47:34	1.16
+++ rsh/rsh.c	2003/03/29 05:21:35
@@ -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	"8KLdep:k:l:nu:wx"
 #  else
-#   define	OPTIONS	"8KLdek:l:nu:w"
+#   define	OPTIONS	"8KLdep:k:l:nu:w"
 #  endif
 # else
-#  define	OPTIONS	"8KLdel:nu:w"
+#  define	OPTIONS	"8KLdep:l:nu:w"
 # endif

 #else /* IN_RCMD */

 # ifdef KERBEROS
 #  ifdef CRYPT
-#   define	OPTIONS	"8KLdek:l:nwx"
+#   define	OPTIONS	"8KLdep:k:l:nwx"
 #  else
-#   define	OPTIONS	"8KLdek:l:nw"
+#   define	OPTIONS	"8KLdep:k:l:nw"
 #  endif
 # else
-#  define	OPTIONS	"8KLdel:nw"
+#  define	OPTIONS	"8KLdep:l:nw"
 # endif

 #endif /* IN_RCMD */
@@ -201,6 +203,16 @@
 		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);
+			}
+			break;
 #ifdef IN_RCMD
 		case 'u':
 			if (getuid() != 0 && optarg && name &&
@@ -265,10 +281,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 +595,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
diff -u -r1.14 rlogin.1
--- rlogin/rlogin.1	2003/02/25 10:35:52	1.14
+++ rlogin/rlogin.1	2003/03/29 05:21:35
@@ -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
diff -u -r1.27 rlogin.c
--- rlogin/rlogin.c	2002/11/16 04:42:26	1.27
+++ rlogin/rlogin.c	2003/03/29 05:21:35
@@ -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,17 @@
 		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);
+			}
+			break;
 #ifdef CRYPT
 #ifdef KERBEROS
 		case 'x':
@@ -262,17 +275,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 +354,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 +372,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 +393,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 +974,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] ");

-- 
Want to get a clue on IPv6 but don't know where to start? Try this:
* Basics -> http://www.onlamp.com/pub/a/onlamp/2001/05/24/ipv6_tutorial.html
* Setup  -> http://www.onlamp.com/pub/a/onlamp/2001/06/01/ipv6_tutorial.html
Of course with your #1 IPv6 ready operating system -> http://www.NetBSD.org/