summaryrefslogtreecommitdiffstats
path: root/crypto/telnet/telnetd/telnetd.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/telnet/telnetd/telnetd.c')
-rw-r--r--crypto/telnet/telnetd/telnetd.c85
1 files changed, 38 insertions, 47 deletions
diff --git a/crypto/telnet/telnetd/telnetd.c b/crypto/telnet/telnetd/telnetd.c
index 805047d..f6eb9fb 100644
--- a/crypto/telnet/telnetd/telnetd.c
+++ b/crypto/telnet/telnetd/telnetd.c
@@ -38,7 +38,11 @@ static const char copyright[] =
#endif /* not lint */
#ifndef lint
+#if 0
static const char sccsid[] = "@(#)telnetd.c 8.4 (Berkeley) 5/30/95";
+#endif
+static const char rcsid[] =
+ "$Id$";
#endif /* not lint */
#include "telnetd.h"
@@ -53,6 +57,9 @@ static const char sccsid[] = "@(#)telnetd.c 8.4 (Berkeley) 5/30/95";
# undef _SC_CRAY_SECURE_SYS
#endif
+#include <err.h>
+#include <arpa/inet.h>
+
#if defined(_SC_CRAY_SECURE_SYS)
#include <sys/sysv.h>
#include <sys/secdev.h>
@@ -132,9 +139,11 @@ int lowpty = 0, highpty; /* low, high pty numbers */
int debug = 0;
int keepalive = 1;
-char *progname;
char *altlogin;
+void doit __P((struct sockaddr_in *));
+int terminaltypeok __P((char *));
+void startslave __P((char *, int, char *));
extern void usage P((void));
/*
@@ -171,14 +180,13 @@ char valid_opts[] = {
'\0'
};
+ int
main(argc, argv)
char *argv[];
{
struct sockaddr_in from;
int on = 1, fromlen;
register int ch;
- extern char *optarg;
- extern int optind;
#if defined(IPPROTO_IP) && defined(IP_TOS)
int tos = -1;
#endif
@@ -190,8 +198,6 @@ main(argc, argv)
nclearto = 0;
#endif /* ENCRYPTION */
- progname = *argv;
-
/*
* This initialization causes linemode to default to a configuration
* that works on all telnet clients, including the FreeBSD client.
@@ -216,7 +222,7 @@ main(argc, argv)
highpty = getnpty();
#endif /* CRAY */
- while ((ch = getopt(argc, argv, valid_opts)) != EOF) {
+ while ((ch = getopt(argc, argv, valid_opts)) != -1) {
switch(ch) {
#ifdef AUTHENTICATION
@@ -241,8 +247,7 @@ main(argc, argv)
*/
auth_level = -1;
} else {
- fprintf(stderr,
- "telnetd: unknown authorization level for -a\n");
+ warnx("unknown authorization level for -a");
}
break;
#endif /* AUTHENTICATION */
@@ -368,12 +373,11 @@ main(argc, argv)
case 'S':
#ifdef HAS_GETTOS
if ((tos = parsetos(optarg, "tcp")) < 0)
- fprintf(stderr, "%s%s%s\n",
- "telnetd: Bad TOS argument '", optarg,
+ warnx("%s%s%s",
+ "bad TOS argument '", optarg,
"'; will try to use default TOS");
#else
- fprintf(stderr, "%s%s\n", "TOS option unavailable; ",
- "-S flag not supported\n");
+ warnx("TOS option unavailable; -S flag not supported");
#endif
break;
@@ -395,7 +399,7 @@ main(argc, argv)
#endif /* AUTHENTICATION */
default:
- fprintf(stderr, "telnetd: %c: unknown option\n", ch);
+ warnx("%c: unknown option", ch);
/* FALLTHROUGH */
case '?':
usage();
@@ -420,7 +424,7 @@ main(argc, argv)
} else {
sin.sin_port = atoi(*argv);
if ((int)sin.sin_port <= 0) {
- fprintf(stderr, "telnetd: %s: bad port #\n", *argv);
+ warnx("%s: bad port #", *argv);
usage();
/* NOT REACHED */
}
@@ -428,34 +432,24 @@ main(argc, argv)
}
} else {
sp = getservbyname("telnet", "tcp");
- if (sp == 0) {
- fprintf(stderr, "telnetd: tcp/telnet: unknown service\n");
- exit(1);
- }
+ if (sp == 0)
+ errx(1, "tcp/telnet: unknown service");
sin.sin_port = sp->s_port;
}
s = socket(AF_INET, SOCK_STREAM, 0);
- if (s < 0) {
- perror("telnetd: socket");;
- exit(1);
- }
+ if (s < 0)
+ err(1, "socket");
(void) setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
(char *)&on, sizeof(on));
- if (bind(s, (struct sockaddr *)&sin, sizeof sin) < 0) {
- perror("bind");
- exit(1);
- }
- if (listen(s, 1) < 0) {
- perror("listen");
- exit(1);
- }
+ if (bind(s, (struct sockaddr *)&sin, sizeof sin) < 0)
+ err(1, "bind");
+ if (listen(s, 1) < 0)
+ err(1, "listen");
foo = sizeof sin;
ns = accept(s, (struct sockaddr *)&sin, &foo);
- if (ns < 0) {
- perror("accept");
- exit(1);
- }
+ if (ns < 0)
+ err(1, "accept");
(void) dup2(ns, 0);
(void) close(ns);
(void) close(s);
@@ -483,10 +477,8 @@ main(argc, argv)
memset((char *)&dv, 0, sizeof(dv));
- if (getsysv(&sysv, sizeof(struct sysv)) != 0) {
- perror("getsysv");
- exit(1);
- }
+ if (getsysv(&sysv, sizeof(struct sysv)) != 0)
+ err(1, "getsysv");
/*
* Get socket security label and set device values
@@ -497,8 +489,7 @@ main(argc, argv)
(char *)&ss, &szss) < 0) ||
(getsockopt(0, SOL_SOCKET, SO_SEC_MULTI,
(char *)&sock_multi, &szi) < 0)) {
- perror("getsockopt");
- exit(1);
+ err(1, "getsockopt");
} else {
dv.dv_actlvl = ss.ss_actlabel.lt_level;
dv.dv_actcmp = ss.ss_actlabel.lt_compart;
@@ -528,8 +519,7 @@ main(argc, argv)
openlog("telnetd", LOG_PID | LOG_ODELAY, LOG_DAEMON);
fromlen = sizeof (from);
if (getpeername(0, (struct sockaddr *)&from, &fromlen) < 0) {
- fprintf(stderr, "%s: ", progname);
- perror("getpeername");
+ warn("getpeername");
_exit(1);
}
if (keepalive &&
@@ -557,12 +547,13 @@ main(argc, argv)
net = 0;
doit(&from);
/* NOTREACHED */
+ return(0);
} /* end of main */
void
usage()
{
- fprintf(stderr, "Usage: telnetd");
+ fprintf(stderr, "usage: telnetd");
#ifdef AUTHENTICATION
fprintf(stderr, " [-a (debug|other|user|valid|off|none)]\n\t");
#endif
@@ -821,11 +812,11 @@ char user_name[256];
/*
* Get a pty, scan input lines.
*/
-void
+ void
doit(who)
struct sockaddr_in *who;
{
- char *host, *inet_ntoa();
+ char *host = NULL;
struct hostent *hp;
int ptynum;
@@ -1105,9 +1096,9 @@ telnet(f, p, host)
* side. Set up signal handler now.
*/
if ((int)signal(SIGUSR1, termstat) < 0)
- perror("signal");
+ warn("signal");
else if (ioctl(p, TCSIGME, (char *)SIGUSR1) < 0)
- perror("ioctl:TCSIGME");
+ warn("ioctl:TCSIGME");
/*
* Make processing loop check terminal characteristics early on.
*/
OpenPOWER on IntegriCloud