convert to 4.1c directory layout
[unix-history] / usr / src / libexec / telnetd / telnetd.c
index 5f365aa..abc2ec1 100644 (file)
@@ -1,4 +1,6 @@
-/*     telnetd.c       4.2     82/03/01        */
+#ifndef lint
+static char sccsid[] = "@(#)telnetd.c  4.9 82/10/10";
+#endif
 
 /*
  * Stripped-down telnet server.
 
 /*
  * Stripped-down telnet server.
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <net/in.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <net/in.h>
+#include <netdb.h>
 #include "telnet.h"
 
 #define        INFINITY        10000000
 #define        BELL            '\07'
 #include "telnet.h"
 
 #define        INFINITY        10000000
 #define        BELL            '\07'
-#define        swab(x)         ((((x) >> 8) | ((x) << 8)) & 0xffff)
 
 char   hisopts[256];
 char   myopts[256];
 
 char   hisopts[256];
 char   myopts[256];
@@ -31,9 +33,7 @@ char  wont[] = { IAC, WONT, '%', 'c', 0 };
 char   ptyibuf[BUFSIZ], *ptyip = ptyibuf;
 char   ptyobuf[BUFSIZ], *pfrontp = ptyobuf, *pbackp = ptyobuf;
 char   netibuf[BUFSIZ], *netip = netibuf;
 char   ptyibuf[BUFSIZ], *ptyip = ptyibuf;
 char   ptyobuf[BUFSIZ], *pfrontp = ptyobuf, *pbackp = ptyobuf;
 char   netibuf[BUFSIZ], *netip = netibuf;
-char   netobuf[BUFSIZ] =
-       { IAC, DO, TELOPT_ECHO, '\r', '\n' },
-       *nfrontp = netobuf + 5, *nbackp = netobuf;
+char   netobuf[BUFSIZ], *nfrontp = netobuf, *nbackp = netobuf;
 int    pcc, ncc;
 
 int    pty, net;
 int    pcc, ncc;
 
 int    pty, net;
@@ -41,27 +41,48 @@ int inter;
 extern int errno;
 char   line[] = "/dev/ptyp0";
 
 extern int errno;
 char   line[] = "/dev/ptyp0";
 
-struct sockaddr_in sin = { AF_INET, swab(IPPORT_TELNET) };
-int    options = SO_ACCEPTCONN;
-
-/*
- * Debugging hooks.  Turned on with a SIGTERM.
- * Successive SIGTERM's toggle the switch.
- */
-int    toggle();
-int    debug;
-FILE   *log;
-char   logfile[80] = "/tmp/teldebugx";
+struct sockaddr_in sin = { AF_INET };
+int    options = SO_ACCEPTCONN|SO_KEEPALIVE;
 
 main(argc, argv)
        char *argv[];
 {
        int s, pid;
        union wait status;
 
 main(argc, argv)
        char *argv[];
 {
        int s, pid;
        union wait status;
+       struct servent *sp;
 
 
+       sp = getservbyname("telnet", "tcp");
+       if (sp == 0) {
+               fprintf(stderr, "telnetd: tcp/telnet: unknown service\n");
+               exit(1);
+       }
+       sin.sin_port = sp->s_port;
        argc--, argv++;
        if (argc > 0 && !strcmp(argv[0], "-d"))
        argc--, argv++;
        if (argc > 0 && !strcmp(argv[0], "-d"))
-               options |= SO_DEBUG;
+               options |= SO_DEBUG, argc--, argv++;
+       if (argc > 0) {
+               sin.sin_port = atoi(*argv);
+               if (sin.sin_port <= 0) {
+                       fprintf(stderr, "telnetd: %s: bad port #\n", *argv);
+                       exit(1);
+               }
+       }
+       sin.sin_port = htons(sin.sin_port);
+#ifndef DEBUG
+       if (fork())
+               exit(0);
+       for (s = 0; s < 10; s++)
+               (void) close(s);
+       (void) open("/", 0);
+       (void) dup2(0, 1);
+       (void) dup2(0, 2);
+       { int tt = open("/dev/tty", 2);
+         if (tt > 0) {
+               ioctl(tt, TIOCNOTTY, 0);
+               close(tt);
+         }
+       }
+#endif
        for (;;) {
                errno = 0;
                if ((s = socket(SOCK_STREAM, 0, &sin, options)) < 0) {
        for (;;) {
                errno = 0;
                if ((s = socket(SOCK_STREAM, 0, &sin, options)) < 0) {
@@ -107,7 +128,6 @@ doit(f)
        printf("All network ports in use.\n");
        exit(1);
 gotpty:
        printf("All network ports in use.\n");
        exit(1);
 gotpty:
-       logfile[strlen("/tmp/teldebug")] = "0123456789abcdef"[i];
        dup2(f, 0);
        cp[strlen("/dev/")] = 't';
        t = open("/dev/tty", 2);
        dup2(f, 0);
        cp[strlen("/dev/")] = 't';
        t = open("/dev/tty", 2);
@@ -122,8 +142,11 @@ gotpty:
                exit(1);
        }
        ioctl(t, TIOCGETP, &b);
                exit(1);
        }
        ioctl(t, TIOCGETP, &b);
-       b.sg_flags = ECHO|CRMOD|XTABS|ANYP;
+       b.sg_flags = CRMOD|XTABS|ANYP;
        ioctl(t, TIOCSETP, &b);
        ioctl(t, TIOCSETP, &b);
+       ioctl(p, TIOCGETP, &b);
+       b.sg_flags &= ~ECHO;
+       ioctl(p, TIOCSETP, &b);
        if ((i = fork()) < 0) {
                dup2(f, 2);
                perror("fork");
        if ((i = fork()) < 0) {
                dup2(f, 2);
                perror("fork");
@@ -155,8 +178,12 @@ telnet(f, p)
        ioctl(p, FIONBIO, &on);
        signal(SIGTSTP, SIG_IGN);
        sigset(SIGCHLD, cleanup);
        ioctl(p, FIONBIO, &on);
        signal(SIGTSTP, SIG_IGN);
        sigset(SIGCHLD, cleanup);
-       sigset(SIGTERM, toggle);
 
 
+       /*
+        * Request to do remote echo.
+        */
+       dooption(TELOPT_ECHO);
+       myopts[TELOPT_ECHO] = 1;
        for (;;) {
                int ibits = 0, obits = 0;
                register int c;
        for (;;) {
                int ibits = 0, obits = 0;
                register int c;
@@ -175,12 +202,7 @@ telnet(f, p)
                        ibits |= (1 << f);
                if (ncc < 0 && pcc < 0)
                        break;
                        ibits |= (1 << f);
                if (ncc < 0 && pcc < 0)
                        break;
-               if (debug)
-                       fprintf(log, "select: ibits=%d, obits=%d\n",
-                               ibits, obits);
                select(32, &ibits, &obits, INFINITY);
                select(32, &ibits, &obits, INFINITY);
-               if (debug)
-                       fprintf(log, "ibits=%d, obits=%d\n", ibits, obits);
                if (ibits == 0 && obits == 0) {
                        sleep(5);
                        continue;
                if (ibits == 0 && obits == 0) {
                        sleep(5);
                        continue;
@@ -191,8 +213,6 @@ telnet(f, p)
                 */
                if (ibits & (1 << f)) {
                        ncc = read(f, netibuf, BUFSIZ);
                 */
                if (ibits & (1 << f)) {
                        ncc = read(f, netibuf, BUFSIZ);
-                       if (debug)
-                               fprintf(log, "read %d from net\n", ncc);
                        if (ncc < 0 && errno == EWOULDBLOCK)
                                ncc = 0;
                        else {
                        if (ncc < 0 && errno == EWOULDBLOCK)
                                ncc = 0;
                        else {
@@ -207,8 +227,6 @@ telnet(f, p)
                 */
                if (ibits & (1 << p)) {
                        pcc = read(p, ptyibuf, BUFSIZ);
                 */
                if (ibits & (1 << p)) {
                        pcc = read(p, ptyibuf, BUFSIZ);
-                       if (debug)
-                               fprintf(log, "read %d from pty\n", pcc);
                        if (pcc < 0 && errno == EWOULDBLOCK)
                                pcc = 0;
                        else {
                        if (pcc < 0 && errno == EWOULDBLOCK)
                                pcc = 0;
                        else {
@@ -369,7 +387,7 @@ telrcv()
                        if (myopts[c]) {
                                myopts[c] = 0;
                                sprintf(nfrontp, wont, c);
                        if (myopts[c]) {
                                myopts[c] = 0;
                                sprintf(nfrontp, wont, c);
-                               nfrontp += sizeof(wont) - 2;
+                               nfrontp += sizeof (wont) - 2;
                        }
                        state = TS_DATA;
                        continue;
                        }
                        state = TS_DATA;
                        continue;
@@ -411,7 +429,7 @@ willoption(option)
                break;
        }
        sprintf(nfrontp, fmt, option);
                break;
        }
        sprintf(nfrontp, fmt, option);
-       nfrontp += sizeof(dont) - 2;
+       nfrontp += sizeof (dont) - 2;
 }
 
 wontoption(option)
 }
 
 wontoption(option)
@@ -439,7 +457,7 @@ wontoption(option)
                fmt = dont;
        }
        sprintf(nfrontp, fmt, option);
                fmt = dont;
        }
        sprintf(nfrontp, fmt, option);
-       nfrontp += sizeof(doopt) - 2;
+       nfrontp += sizeof (doopt) - 2;
 }
 
 dooption(option)
 }
 
 dooption(option)
@@ -471,7 +489,7 @@ dooption(option)
                break;
        }
        sprintf(nfrontp, fmt, option);
                break;
        }
        sprintf(nfrontp, fmt, option);
-       nfrontp += sizeof(doopt) - 2;
+       nfrontp += sizeof (doopt) - 2;
 }
 
 mode(on, off)
 }
 
 mode(on, off)
@@ -512,8 +530,8 @@ ptyflush()
 
        if ((n = pfrontp - pbackp) > 0)
                n = write(pty, pbackp, n);
 
        if ((n = pfrontp - pbackp) > 0)
                n = write(pty, pbackp, n);
-       if (n < 0 && errno == EWOULDBLOCK)
-               n = 0;
+       if (n < 0)
+               return;
        pbackp += n;
        if (pbackp == pfrontp)
                pbackp = pfrontp = ptyobuf;
        pbackp += n;
        if (pbackp == pfrontp)
                pbackp = pfrontp = ptyobuf;
@@ -525,30 +543,17 @@ netflush()
 
        if ((n = nfrontp - nbackp) > 0)
                n = write(net, nbackp, n);
 
        if ((n = nfrontp - nbackp) > 0)
                n = write(net, nbackp, n);
-       if (n < 0 && errno == EWOULDBLOCK)
-               n = 0;
+       if (n < 0) {
+               if (errno == EWOULDBLOCK)
+                       return;
+               /* should blow this guy away... */
+               return;
+       }
        nbackp += n;
        if (nbackp == nfrontp)
                nbackp = nfrontp = netobuf;
 }
 
        nbackp += n;
        if (nbackp == nfrontp)
                nbackp = nfrontp = netobuf;
 }
 
-toggle()
-{
-       if (debug) {
-               fprintf(log, "log stopped\n");
-               if (log)
-                       fclose(log);
-       } else {
-               if ((log = fopen(logfile, "a")) != NULL) {
-                       setbuf(log, 0);
-                       fprintf(log, "log started on /dev/pty%c\n",
-                               logfile[strlen("/tmp/teldebug")]);
-                       fprintf(log, "net=%d, pty=%d\n", net, pty);
-               }
-       }
-       debug = !debug;
-}
-
 cleanup()
 {
        int how = 2;
 cleanup()
 {
        int how = 2;
@@ -565,8 +570,8 @@ cleanup()
 struct utmp wtmp;
 char   wtmpf[] = "/usr/adm/wtmp";
 char   utmp[] = "/etc/utmp";
 struct utmp wtmp;
 char   wtmpf[] = "/usr/adm/wtmp";
 char   utmp[] = "/etc/utmp";
-#define SCPYN(a, b)    strncpy(a, b, sizeof(a))
-#define SCMPN(a, b)    strncmp(a, b, sizeof(a))
+#define SCPYN(a, b)    strncpy(a, b, sizeof (a))
+#define SCMPN(a, b)    strncmp(a, b, sizeof (a))
 
 rmut()
 {
 
 rmut()
 {
@@ -575,13 +580,13 @@ rmut()
 
        f = open(utmp, 2);
        if (f >= 0) {
 
        f = open(utmp, 2);
        if (f >= 0) {
-               while(read(f, (char *)&wtmp, sizeof(wtmp)) == sizeof(wtmp)) {
+               while(read(f, (char *)&wtmp, sizeof (wtmp)) == sizeof (wtmp)) {
                        if (SCMPN(wtmp.ut_line, line+5) || wtmp.ut_name[0]==0)
                                continue;
                        if (SCMPN(wtmp.ut_line, line+5) || wtmp.ut_name[0]==0)
                                continue;
-                       lseek(f, -(long)sizeof(wtmp), 1);
+                       lseek(f, -(long)sizeof (wtmp), 1);
                        SCPYN(wtmp.ut_name, "");
                        time(&wtmp.ut_time);
                        SCPYN(wtmp.ut_name, "");
                        time(&wtmp.ut_time);
-                       write(f, (char *)&wtmp, sizeof(wtmp));
+                       write(f, (char *)&wtmp, sizeof (wtmp));
                        found++;
                }
                close(f);
                        found++;
                }
                close(f);
@@ -593,7 +598,7 @@ rmut()
                        SCPYN(wtmp.ut_name, "");
                        time(&wtmp.ut_time);
                        lseek(f, (long)0, 2);
                        SCPYN(wtmp.ut_name, "");
                        time(&wtmp.ut_time);
                        lseek(f, (long)0, 2);
-                       write(f, (char *)&wtmp, sizeof(wtmp));
+                       write(f, (char *)&wtmp, sizeof (wtmp));
                        close(f);
                }
        }
                        close(f);
                }
        }