date and time created 83/02/11 15:44:24 by rrh
[unix-history] / usr / src / usr.bin / rlogin / rlogin.c
index a7d7794..588527a 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)rlogin.c   4.6 82/12/05";
+static char sccsid[] = "@(#)rlogin.c   4.9 83/02/09";
 #endif
 
 #include <sys/types.h>
 #endif
 
 #include <sys/types.h>
@@ -22,7 +22,6 @@ struct        passwd *getpwuid();
 char   *name;
 int    rem;
 char   cmdchar = '~';
 char   *name;
 int    rem;
 char   cmdchar = '~';
-int    rcmdoptions = 0;
 int    eight;
 char   *speeds[] =
     { "0", "50", "75", "110", "134", "150", "200", "300",
 int    eight;
 char   *speeds[] =
     { "0", "50", "75", "110", "134", "150", "200", "300",
@@ -39,7 +38,7 @@ main(argc, argv)
        struct sgttyb ttyb;
        struct passwd *pwd;
        struct servent *sp;
        struct sgttyb ttyb;
        struct passwd *pwd;
        struct servent *sp;
-       int uid;
+       int uid, options = 0;
 
        host = rindex(argv[0], '/');
        if (host)
 
        host = rindex(argv[0], '/');
        if (host)
@@ -50,24 +49,24 @@ main(argc, argv)
        if (!strcmp(host, "rlogin"))
                host = *argv++, --argc;
 another:
        if (!strcmp(host, "rlogin"))
                host = *argv++, --argc;
 another:
-       if (!strcmp(*argv, "-d")) {
+       if (argc > 0 && !strcmp(*argv, "-d")) {
                argv++, argc--;
                argv++, argc--;
-               rcmdoptions |= SO_DEBUG;
+               options |= SO_DEBUG;
                goto another;
        }
                goto another;
        }
-       if (!strcmp(*argv, "-l")) {
+       if (argc > 0 && !strcmp(*argv, "-l")) {
                argv++, argc--;
                if (argc == 0)
                        goto usage;
                name = *argv++; argc--;
                goto another;
        }
                argv++, argc--;
                if (argc == 0)
                        goto usage;
                name = *argv++; argc--;
                goto another;
        }
-       if (!strncmp(*argv, "-e", 2)) {
+       if (argc > 0 && !strncmp(*argv, "-e", 2)) {
                cmdchar = argv[0][2];
                argv++, argc--;
                goto another;
        }
                cmdchar = argv[0][2];
                argv++, argc--;
                goto another;
        }
-       if (!strcmp(*argv, "-8")) {
+       if (argc > 0 && !strcmp(*argv, "-8")) {
                eight = 1;
                argv++, argc--;
                goto another;
                eight = 1;
                argv++, argc--;
                goto another;
@@ -89,7 +88,7 @@ another:
        cp = getenv("TERM");
        if (cp)
                strcpy(term, cp);
        cp = getenv("TERM");
        if (cp)
                strcpy(term, cp);
-       if (gtty(0, &ttyb)==0) {
+       if (ioctl(0, TIOCGETP, &ttyb)==0) {
                strcat(term, "/");
                strcat(term, speeds[ttyb.sg_ospeed]);
        }
                strcat(term, "/");
                strcat(term, speeds[ttyb.sg_ospeed]);
        }
@@ -98,6 +97,9 @@ another:
            name ? name : pwd->pw_name, term, 0);
         if (rem < 0)
                 exit(1);
            name ? name : pwd->pw_name, term, 0);
         if (rem < 0)
                 exit(1);
+       if (options & SO_DEBUG &&
+           setsockopt(rem, SOL_SOCKET, SO_DEBUG, 0, 0) < 0)
+               perror("rlogin: setsockopt (SO_DEBUG)");
        uid = getuid();
        if (setuid(uid) < 0) {
                perror("rlogin: setuid");
        uid = getuid();
        if (setuid(uid) < 0) {
                perror("rlogin: setuid");
@@ -116,25 +118,23 @@ usage:
 int    child;
 int    done();
 
 int    child;
 int    done();
 
-char   tkill, terase;  /* current input kill & erase */
-char   defkill, deferase, defflags;
-
-struct tchars deftchars;
-struct tchars notchars = { -1, -1, CTRL(q), CTRL(s), -1, -1 };
-struct ltchars defltchars;
-struct ltchars noltchars = { -1, -1, -1, -1, -1, -1 };
+int    defflags;
+struct ttychars deftc;
+struct ttychars notc = {
+       -1,     -1,     -1,     -1,     -1,
+       -1,     -1,     -1,     -1,     -1,
+       -1,     -1,     -1,     -1
+};
 
 doit()
 {
 
 doit()
 {
-       struct sgttyb stbuf;
        int exit();
 
        int exit();
 
-       ioctl(0, TIOCGETP, (char *)&stbuf);
-       defkill = stbuf.sg_kill;
-       deferase = stbuf.sg_erase;
-       defflags = stbuf.sg_flags & (ECHO | CRMOD);
-       ioctl(0, TIOCGETC, (char *)&deftchars);
-       ioctl(0, TIOCGLTC, (char *)&defltchars);
+       ioctl(0, TIOCGET, (char *)&defflags);
+       defflags &= ECHO | CRMOD;
+       ioctl(0, TIOCCGET, (char *)&deftc);
+       notc.tc_startc = deftc.tc_startc;
+       notc.tc_stopc = deftc.tc_stopc;
        signal(SIGINT, exit);
        signal(SIGHUP, exit);
        signal(SIGQUIT, exit);
        signal(SIGINT, exit);
        signal(SIGHUP, exit);
        signal(SIGQUIT, exit);
@@ -145,7 +145,6 @@ doit()
        }
        signal(SIGINT, SIG_IGN);
        if (child == 0) {
        }
        signal(SIGINT, SIG_IGN);
        if (child == 0) {
-               signal(SIGPIPE, SIG_IGN);
                reader();
                prf("\007Lost connection.");
                exit(3);
                reader();
                prf("\007Lost connection.");
                exit(3);
@@ -170,6 +169,7 @@ done()
  * writer: write to remote: 0 -> line.
  * ~.  terminate
  * ~^Z suspend rlogin process.
  * writer: write to remote: 0 -> line.
  * ~.  terminate
  * ~^Z suspend rlogin process.
+ * ~^Y  suspend rlogin process, but leave reader alone.
  */
 writer()
 {
  */
 writer()
 {
@@ -204,20 +204,21 @@ top:
                                c &= 0177;
                } else {
                        if (c == 0177)
                                c &= 0177;
                } else {
                        if (c == 0177)
-                               c = tkill;
+                               c = deftc.tc_kill;
                        if (c == '\r' || c == '\n') {
                        if (c == '\r' || c == '\n') {
-                               switch (b[1]) {
+                               char cmdc = b[1];
 
 
-                               case '.':
-                               case CTRL(d):
+                               if (cmdc == '.' || cmdc == deftc.tc_eofc) {
                                        write(0, CRLF, sizeof(CRLF));
                                        return;
                                        write(0, CRLF, sizeof(CRLF));
                                        return;
-
-                               case CTRL(z):
+                               }
+                               if (cmdc == deftc.tc_suspc ||
+                                   cmdc == deftc.tc_dsuspc) {
                                        write(0, CRLF, sizeof(CRLF));
                                        mode(0);
                                        signal(SIGCHLD, SIG_IGN);
                                        write(0, CRLF, sizeof(CRLF));
                                        mode(0);
                                        signal(SIGCHLD, SIG_IGN);
-                                       kill(0, SIGTSTP);
+                                       kill(cmdc == deftc.tc_suspc ?
+                                         0 : getpid(), SIGTSTP);
                                        signal(SIGCHLD, done);
                                        mode(1);
                                        goto top;
                                        signal(SIGCHLD, done);
                                        mode(1);
                                        goto top;
@@ -229,12 +230,12 @@ top:
                        write(1, &c, 1);
                }
                *p++ = c;
                        write(1, &c, 1);
                }
                *p++ = c;
-               if (c == terase) {
+               if (c == deftc.tc_erase) {
                        p -= 2; 
                        if (p < b)
                                goto top;
                }
                        p -= 2; 
                        if (p < b)
                                goto top;
                }
-               if (c == tkill || c == 0177 || c == CTRL(d) ||
+               if (c == deftc.tc_kill || c == 0177 || c == deftc.tc_eofc ||
                    c == '\r' || c == '\n')
                        goto top;
        }
                    c == '\r' || c == '\n')
                        goto top;
        }
@@ -242,30 +243,30 @@ top:
 
 oob()
 {
 
 oob()
 {
-       int out = 1+1;
+       int out = 1+1, atmark;
        char waste[BUFSIZ], mark;
 
        signal(SIGURG, oob);
        ioctl(1, TIOCFLUSH, (char *)&out);
        for (;;) {
        char waste[BUFSIZ], mark;
 
        signal(SIGURG, oob);
        ioctl(1, TIOCFLUSH, (char *)&out);
        for (;;) {
-               if (ioctl(rem, SIOCATMARK, &mark) < 0) {
+               if (ioctl(rem, SIOCATMARK, &atmark) < 0) {
                        perror("ioctl");
                        break;
                }
                        perror("ioctl");
                        break;
                }
-               if (mark)
+               if (atmark)
                        break;
                (void) read(rem, waste, sizeof (waste));
        }
        recv(rem, &mark, 1, SOF_OOB);
        if (mark & TIOCPKT_NOSTOP) {
                        break;
                (void) read(rem, waste, sizeof (waste));
        }
        recv(rem, &mark, 1, SOF_OOB);
        if (mark & TIOCPKT_NOSTOP) {
-               notchars.t_stopc = -1;
-               notchars.t_startc = -1;
-               ioctl(0, TIOCSETC, (char *)&notchars);
+               notc.tc_stopc = -1;
+               notc.tc_startc = -1;
+               ioctl(0, TIOCCSET, (char *)&notc);
        }
        if (mark & TIOCPKT_DOSTOP) {
        }
        if (mark & TIOCPKT_DOSTOP) {
-               notchars.t_stopc = CTRL(s);
-               notchars.t_startc = CTRL(q);
-               ioctl(0, TIOCSETC, (char *)&notchars);
+               notc.tc_stopc = deftc.tc_stopc;
+               notc.tc_startc = deftc.tc_startc;
+               ioctl(0, TIOCCSET, (char *)&notc);
        }
 }
 
        }
 }
 
@@ -293,34 +294,29 @@ reader()
 
 mode(f)
 {
 
 mode(f)
 {
-       struct sgttyb stbuf;
+       struct ttychars *tc;
+       int flags;
 
 
-       ioctl(0, TIOCGETP, (char *)&stbuf);
-       if (f == 0) {
-               stbuf.sg_flags &= ~CBREAK;
-               stbuf.sg_flags |= defflags;
-               ioctl(0, TIOCSETC, (char *)&deftchars);
-               ioctl(0, TIOCSLTC, (char *)&defltchars);
-               stbuf.sg_kill = defkill;
-               stbuf.sg_erase = deferase;
-       }
-       if (f == 1) {
-               stbuf.sg_flags |= CBREAK;
-               stbuf.sg_flags &= ~(ECHO|CRMOD);
-               ioctl(0, TIOCSETC, (char *)&notchars);
-               ioctl(0, TIOCSLTC, (char *)&noltchars);
-               stbuf.sg_kill = -1;
-               stbuf.sg_erase = -1;
-       }
-       if (f == 2) {
-               stbuf.sg_flags &= ~CBREAK;
-               stbuf.sg_flags &= ~(ECHO|CRMOD);
-               ioctl(0, TIOCSETC, (char *)&deftchars);
-               ioctl(0, TIOCSLTC, (char *)&defltchars);
-               stbuf.sg_kill = -1;
-               stbuf.sg_erase = -1;
+       ioctl(0, TIOCGET, (char *)&flags);
+       switch (f) {
+
+       case 0:
+               flags &= ~CBREAK;
+               flags |= defflags;
+               tc = &deftc;
+               break;
+
+       case 1:
+               flags |= CBREAK;
+               flags &= ~defflags;
+               tc = &notc;
+               break;
+
+       default:
+               return;
        }
        }
-       ioctl(0, TIOCSETN, (char *)&stbuf);
+       ioctl(0, TIOCSET, (char *)&flags);
+       ioctl(0, TIOCCSET, (char *)tc);
 }
 
 /*VARARGS*/
 }
 
 /*VARARGS*/