BSD 4 release
[unix-history] / usr / src / cmd / cu.c
index 308e3c9..00c7883 100644 (file)
@@ -1,3 +1,4 @@
+static char *sccsid = "@(#)cu.c        4.1 (Berkeley) 10/1/80";
 #include <stdio.h>
 #include <signal.h>
 #include <sgtty.h>
 #include <stdio.h>
 #include <signal.h>
 #include <sgtty.h>
@@ -28,6 +29,7 @@ int   ln;     /* fd for comm line */
 char   tkill, terase;  /* current input kill & erase */
 int    efk;            /* process of id of listener  */
 char   c;
 char   tkill, terase;  /* current input kill & erase */
 int    efk;            /* process of id of listener  */
 char   c;
+char   oc;
 
 char   *connmsg[] = {
        "",
 
 char   *connmsg[] = {
        "",
@@ -44,7 +46,8 @@ char  *connmsg[] = {
 rdc(ds) {
 
        ds=read(ds,&c,1); 
 rdc(ds) {
 
        ds=read(ds,&c,1); 
-       c&= 0177; 
+       oc = c;
+       c &= 0177;
        return (ds);
 }
 
        return (ds);
 }
 
@@ -99,30 +102,35 @@ char *av[];
                prf(connmsg[8]);
                exit(8);
        }
                prf(connmsg[8]);
                exit(8);
        }
-       telno = av[1];
-       av += 2;
-       ac -= 2;
-       for (; ac > 0; av++) {
-               if (equal(*av, "-t")) {
+       for (; ac > 1; av++,ac--) {
+               if (av[1][0] != '-')
+                       telno = av[1];
+               else switch(av[1][1]) {
+               case 't':
                        dout = 1;
                        --ac;
                        continue;
                        dout = 1;
                        --ac;
                        continue;
-               }
-               if (equal(*av, "-d")) {
+               case 'd':
                        dbflag++;
                        continue;
                        dbflag++;
                        continue;
-               }
-               if (ac < 2)
+               case 's':
+                       lspeed = av[2]; ++av; --ac;
+                       break;
+               case 'l':
+                       devcul = av[2]; ++av; --ac;
                        break;
                        break;
-               if (equal(*av, "-s"))
-                       lspeed = *++av;
-               else if (equal(*av, "-l"))
-                       devcul = *++av;
-               else if (equal(*av, "-a"))
-                       devcua = *++av;
-               else
+               case 'a':
+                       devcua = av[2]; ++av; --ac;
+                       break;
+               case '0': case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+                       devcua[strlen(devcua)-1] = av[1][1];
+                       devcul[strlen(devcul)-1] = av[1][1];
+                       break;
+               default:
+                       prf("Bad flag %s", av[1]);
                        break;
                        break;
-               ac -= 2;
+               }
        }
        if (!exists(devcua) || !exists(devcul))
                exit(9);
        }
        if (!exists(devcua) || !exists(devcul))
                exit(9);
@@ -145,11 +153,13 @@ char *av[];
        stbuf.sg_ispeed = speed;
        stbuf.sg_ospeed = speed;
        stbuf.sg_flags = EVENP|ODDP;
        stbuf.sg_ispeed = speed;
        stbuf.sg_ospeed = speed;
        stbuf.sg_flags = EVENP|ODDP;
-       if (!dout)
+       if (!dout) {
                stbuf.sg_flags |= RAW;
                stbuf.sg_flags |= RAW;
-       ioctl(TIOCSETP, ln, &stbuf);
-       ioctl(TIOCEXCL, ln, (struct sgttyb *)NULL);
-       ioctl(TIOCHPCL, ln, (struct sgttyb *)NULL);
+               stbuf.sg_flags &= ~ECHO;
+       }
+       ioctl(ln, TIOCSETP, &stbuf);
+       ioctl(ln, TIOCEXCL, (struct sgttyb *)NULL);
+       ioctl(ln, TIOCHPCL, (struct sgttyb *)NULL);
        prf("Connected");
        if (dout)
                fk = -1;
        prf("Connected");
        if (dout)
                fk = -1;
@@ -170,7 +180,7 @@ char *av[];
        wait((int *)NULL);
        stbuf.sg_ispeed = 0;
        stbuf.sg_ospeed = 0;
        wait((int *)NULL);
        stbuf.sg_ispeed = 0;
        stbuf.sg_ospeed = 0;
-       ioctl(TIOCSETP, ln, &stbuf);
+       ioctl(ln, TIOCSETP, &stbuf);
        prf("Disconnected");
        exit(0);
 }
        prf("Disconnected");
        exit(0);
 }
@@ -215,7 +225,7 @@ char *dev, *acu, *telno;
                ;
        p--;
        if (*(p-1)!='<') {
                ;
        p--;
        if (*(p-1)!='<') {
-               if (*(p-1)!='-') *p++='-';
+               /*if (*(p-1)!='-') *p++='-';*/
                *p++='<';
        }
        t=p-b;
                *p++='<';
        }
        t=p-b;
@@ -234,11 +244,11 @@ char *dev, *acu, *telno;
                er=(errno == 4? 3:6); 
                goto X;
        }
                er=(errno == 4? 3:6); 
                goto X;
        }
-       ioctl(TIOCGETP, ln, &stbuf);
+       ioctl(ln, TIOCGETP, &stbuf);
        stbuf.sg_flags &= ~ECHO;
        xalarm(10);
        stbuf.sg_flags &= ~ECHO;
        xalarm(10);
-       ioctl(TIOCSETP, dh, &stbuf);
-       ioctl(TIOCHPCL, dh, (struct sgttyb *)NULL);
+       ioctl(dh, TIOCSETP, &stbuf);
+       ioctl(dh, TIOCHPCL, (struct sgttyb *)NULL);
        xalarm(0);
 X: 
        if (er) close(dn);
        xalarm(0);
 X: 
        if (er) close(dn);
@@ -259,6 +269,7 @@ X:
  *     ~!cmd   execute cmd locally
  *     ~$proc  execute proc locally, send output to line
  *     ~%cmd   execute builtin cmd (put and take)
  *     ~!cmd   execute cmd locally
  *     ~$proc  execute proc locally, send output to line
  *     ~%cmd   execute builtin cmd (put and take)
+ *     ~#      send 1-sec break
  */
 
 wr()
  */
 
 wr()
@@ -270,11 +281,13 @@ wr()
                while (rdc(0) == 1) {
                        if (p == b) lcl=(c == '~');
                        if (p == b+1 && b[0] == '~') lcl=(c!='~');
                while (rdc(0) == 1) {
                        if (p == b) lcl=(c == '~');
                        if (p == b+1 && b[0] == '~') lcl=(c!='~');
-                       if (c == 0) c=0177;
+                       /* if (c == 0) oc=c=0177; fake break kludge */
                        if (!lcl) {
                        if (!lcl) {
+                               c = oc;
                                if (wrc(ln) == 0) {
                                        prf("line gone"); return;
                                }
                                if (wrc(ln) == 0) {
                                        prf("line gone"); return;
                                }
+                               c &= 0177;
                        }
                        if (lcl) {
                                if (c == 0177) c=tkill;
                        }
                        if (lcl) {
                                if (c == 0177) c=tkill;
@@ -286,7 +299,7 @@ wr()
                                p=p-2; 
                                if (p<b) p=b;
                        }
                                p=p-2; 
                                if (p<b) p=b;
                        }
-                       if (c == tkill || c == 0177 || c == '\r' || c == '\n') p=b;
+                       if (c == tkill || c == 0177 || c == '\4' || c == '\r' || c == '\n') p=b;
                }
                return;
 A: 
                }
                return;
 A: 
@@ -296,10 +309,16 @@ A:
                case '.':
                case '\004':
                        return;
                case '.':
                case '\004':
                        return;
+               case '#':
+                       ioctl(ln, TIOCSBRK, 0);
+                       sleep(1);
+                       ioctl(ln, TIOCCBRK, 0);
+                       continue;
                case '!':
                case '$':
                        fk = fork();
                        if (fk == 0) {
                case '!':
                case '$':
                        fk = fork();
                        if (fk == 0) {
+                               char *getenv();
                                char *shell = getenv("SHELL");
                                if (shell == 0) shell = "/bin/sh";
                                close(1);
                                char *shell = getenv("SHELL");
                                if (shell == 0) shell = "/bin/sh";
                                close(1);
@@ -307,7 +326,8 @@ A:
                                close(ln);
                                mode(0);
                                if (!nhup) signal(SIGINT, SIG_DFL);
                                close(ln);
                                mode(0);
                                if (!nhup) signal(SIGINT, SIG_DFL);
-                               if (b[2] == 0) execl(shell,"-",0);
+                               if (b[2] == 0) execl(shell,shell,0);
+                               /* if (b[2] == 0) execl(shell,"-",0); */
                                else execl(shell,"sh","-c",b+2,0);
                                prf("Can't execute shell");
                                exit(~0);
                                else execl(shell,"sh","-c",b+2,0);
                                prf("Can't execute shell");
                                exit(~0);
@@ -357,6 +377,14 @@ A:
                        kill(efk,SIGEMT);
                        }
                        break;
                        kill(efk,SIGEMT);
                        }
                        break;
+#ifdef SIGTSTP
+#define CTRLZ  26
+               case CTRLZ:
+                       mode(0);
+                       kill(getpid(), SIGTSTP);
+                       mode(1);
+                       break;
+#endif
                case '%':
                        dopercen(&b[2]);
                        break;
                case '%':
                        dopercen(&b[2]);
                        break;
@@ -577,7 +605,7 @@ mode(f)
 {
        struct sgttyb stbuf;
        if (dout) return;
 {
        struct sgttyb stbuf;
        if (dout) return;
-       ioctl(TIOCGETP, 0, &stbuf);
+       ioctl(0, TIOCGETP, &stbuf);
        tkill = stbuf.sg_kill;
        terase = stbuf.sg_erase;
        if (f == 0) {
        tkill = stbuf.sg_kill;
        terase = stbuf.sg_erase;
        if (f == 0) {
@@ -586,13 +614,13 @@ mode(f)
        }
        if (f == 1) {
                stbuf.sg_flags |= RAW;
        }
        if (f == 1) {
                stbuf.sg_flags |= RAW;
-               stbuf.sg_flags &= ECHO|CRMOD;
+               stbuf.sg_flags &= ~(ECHO|CRMOD);
        }
        if (f == 2) {
                stbuf.sg_flags &= ~RAW;
                stbuf.sg_flags &= ~(ECHO|CRMOD);
        }
        }
        if (f == 2) {
                stbuf.sg_flags &= ~RAW;
                stbuf.sg_flags &= ~(ECHO|CRMOD);
        }
-       ioctl(TIOCSETP, 0, &stbuf);
+       ioctl(0, TIOCSETP, &stbuf);
 }
 
 echo(s)
 }
 
 echo(s)