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/