BSD 4_2 release
[unix-history] / usr / src / usr.bin / uucp / cico.c
index ef9ee0b..46ae137 100644 (file)
@@ -1,13 +1,24 @@
-static char sccsid[] = "@(#)cico.c     4.2     (Berkeley)      9/14/82";
+#ifndef lint
+static char sccsid[] = "@(#)cico.c     5.3 (Berkeley) 10/3/83";
+#endif
 
 
-       /*  @(#)cico    2.2  5/18/79  11:31:12  */
 #include "uucp.h"
 #include "uucp.h"
-#include "uucpdefs.h"
 #include <signal.h>
 #include <signal.h>
-#include <sgtty.h>
 #include <setjmp.h>
 #include <setjmp.h>
+#include <sys/types.h>
+#ifdef SYSIII
+#include <termio.h>
+#endif
+#ifndef        SYSIII
+#include <sgtty.h>
+#endif
+
 
 
-char Scico[] = "@(#)cico       2.2";
+#ifdef UNET
+#include <UNET/unetio.h>
+#include <UNET/tcp.h>
+static struct uiocstate ust;
+#endif
 
 jmp_buf Sjbuf;
        /*  call fail text  */
 
 jmp_buf Sjbuf;
        /*  call fail text  */
@@ -23,8 +34,6 @@ char *Stattext[] = {
        };
 
 int Role = 0;
        };
 
 int Role = 0;
-char *ttyname();
-
        /*  call fail codes  */
 int Stattype[] = {0, 0, 0, 0,
        SS_NODEVICE, SS_FAIL, SS_FAIL, SS_BADSEQ
        /*  call fail codes  */
 int Stattype[] = {0, 0, 0, 0,
        SS_NODEVICE, SS_FAIL, SS_FAIL, SS_BADSEQ
@@ -32,7 +41,12 @@ int Stattype[] = {0, 0, 0, 0,
 
 
 int Errorrate = 0;
 
 
 int Errorrate = 0;
+#ifdef SYSIII
+struct termio Savettyb;
+#endif
+#ifndef        SYSIII
 struct sgttyb Savettyb;
 struct sgttyb Savettyb;
+#endif
 
 /*******
  *     cico - this program is used  to place a call to a
 
 /*******
  *     cico - this program is used  to place a call to a
@@ -40,21 +54,27 @@ struct sgttyb Savettyb;
  */
 
 main(argc, argv)
  */
 
 main(argc, argv)
-char *argv[];
+register char *argv[];
 {
 {
-       int ret, seq;
+       register int ret;
+       int seq;
        int onesys = 0;
        char wkpre[NAMESIZE], file[NAMESIZE];
        int onesys = 0;
        char wkpre[NAMESIZE], file[NAMESIZE];
-       char msg[BUFSIZ], *p, *q;
-       extern onintr(), timeout();
-       extern intrINT();
-       extern intrHUP();
-       extern intrQUIT();
-       extern intrTERM();
+       char msg[BUFSIZ], *q;
+       register char *p;
+       extern onintr(), timeout(), setdebug();
        extern intrEXIT();
        extern char *pskip();
        char rflags[30];
        char *ttyn;
        extern intrEXIT();
        extern char *pskip();
        char rflags[30];
        char *ttyn;
+       int orig_uid = getuid();
+
+       strcpy(Progname, "uucico");
+       uucpname(Myname);
+
+       /* Try to run as uucp -- rti!trt */
+       setgid(getegid());
+       setuid(geteuid());
 
        signal(SIGILL, intrEXIT);
        signal(SIGTRAP, intrEXIT);
 
        signal(SIGILL, intrEXIT);
        signal(SIGTRAP, intrEXIT);
@@ -64,16 +84,18 @@ char *argv[];
        signal(SIGBUS, intrEXIT);
        signal(SIGSEGV, intrEXIT);
        signal(SIGSYS, intrEXIT);
        signal(SIGBUS, intrEXIT);
        signal(SIGSEGV, intrEXIT);
        signal(SIGSYS, intrEXIT);
-       signal(SIGINT, intrINT);
-       signal(SIGHUP, intrHUP);
-       signal(SIGQUIT, intrQUIT);
-       signal(SIGTERM, intrTERM);
+       signal(SIGINT, onintr);
+       signal(SIGHUP, onintr);
+       signal(SIGQUIT, onintr);
+       signal(SIGTERM, onintr);
+       signal(SIGPIPE, onintr);        /* 4.1a tcp-ip stupidity */
+       signal(SIGFPE, setdebug);
        ret = guinfo(getuid(), User, msg);
        strcpy(Loginuser, User);
        ret = guinfo(getuid(), User, msg);
        strcpy(Loginuser, User);
-       ASSERT(ret == 0, "BAD UID ret %d", ret);
+       ASSERT(ret == 0, "BAD UID ", "", ret);
 
        rflags[0] = '\0';
 
        rflags[0] = '\0';
-       uucpname(Myname);
+       umask(WFMASK);
        strcpy(Rmtname, Myname);
        Ifn = Ofn = -1;
        while(argc>1 && argv[1][0] == '-'){
        strcpy(Rmtname, Myname);
        Ifn = Ofn = -1;
        while(argc>1 && argv[1][0] == '-'){
@@ -81,20 +103,20 @@ char *argv[];
                case 'd':
                        Spool = &argv[1][2];
                        break;
                case 'd':
                        Spool = &argv[1][2];
                        break;
-/*
-*              case 'E':
-*                      Errorrate = atoi(&argv[1][2]);
-*                      if (Errorrate <= 0)
-*                              Errorrate = 100;
-*                      break;
-*              case 'g':
-*                      Pkdrvon = 1;
-*                      break;
-*              case 'G':
-*                      Pkdrvon = 1;
-*                      strcat(rflags, " -g ");
-*                      break;
-*/
+#ifdef PROTODEBUG
+               case 'E':
+                       Errorrate = atoi(&argv[1][2]);
+                       if (Errorrate <= 0)
+                               Errorrate = 100;
+                       break;
+               case 'g':
+                       Pkdrvon = 1;
+                       break;
+               case 'G':
+                       Pkdrvon = 1;
+                       strcat(rflags, " -g ");
+                       break;
+#endif
                case 'r':
                        Role = atoi(&argv[1][2]);
                        break;
                case 'r':
                        Role = atoi(&argv[1][2]);
                        break;
@@ -104,10 +126,12 @@ char *argv[];
                                onesys = 1;
                        break;
                case 'x':
                                onesys = 1;
                        break;
                case 'x':
+                       chkdebug(orig_uid);
                        Debug = atoi(&argv[1][2]);
                        if (Debug <= 0)
                                Debug = 1;
                        strcat(rflags, argv[1]);
                        Debug = atoi(&argv[1][2]);
                        if (Debug <= 0)
                                Debug = 1;
                        strcat(rflags, argv[1]);
+                       logent("ENABLED", "DEBUG");
                        break;
                default:
                        printf("unknown flag %s\n", argv[1]);
                        break;
                default:
                        printf("unknown flag %s\n", argv[1]);
@@ -116,41 +140,73 @@ char *argv[];
                --argc;  argv++;
        }
 
                --argc;  argv++;
        }
 
-       chdir(Spool);
+       subchdir(Spool);
        strcpy(Wrkdir, Spool);
 
        strcpy(Wrkdir, Spool);
 
+#ifdef UNET
+/*
+ * Determine if we are on UNET
+ */
+       ret = ioctl(0, UIOCSTATE, &ust);
+       if (ret == 0) {
+               Unet = 1;
+               DEBUG(4, "UNET connection -- ioctl-s disabled\n", "");
+       }
+#endif
        if (Role == SLAVE) {
                /* initial handshake */
                onesys = 1;
        if (Role == SLAVE) {
                /* initial handshake */
                onesys = 1;
-               ret = ioctl(0, TIOCGETP, &Savettyb);
-               Savettyb.sg_flags |= ECHO;
-               Savettyb.sg_flags &= ~RAW;
+               if (!Unet) {
+#ifdef SYSIII
+                       ret = ioctl(0, TCGETA, &Savettyb);
+                       Savettyb.c_cflag = (Savettyb.c_cflag & ~CS8) | CS7;
+                       Savettyb.c_oflag |= OPOST;
+                       Savettyb.c_lflag |= (ISIG|ICANON|ECHO);
+#endif
+#ifndef        SYSIII
+                       ret = ioctl(0, TIOCGETP, &Savettyb);
+                       Savettyb.sg_flags |= ECHO;
+                       Savettyb.sg_flags &= ~RAW;
+#endif
+               }
                Ifn = 0;
                Ofn = 1;
                fixmode(Ifn);
                fclose(stderr);
                fopen(RMTDEBUG, "w");
                Ifn = 0;
                Ofn = 1;
                fixmode(Ifn);
                fclose(stderr);
                fopen(RMTDEBUG, "w");
-               chmod(RMTDEBUG, 0666);
                omsg('S', "here", Ofn);
                signal(SIGALRM, timeout);
                alarm(MAXMSGTIME);
                if (setjmp(Sjbuf)) {
                        /* timed out */
                omsg('S', "here", Ofn);
                signal(SIGALRM, timeout);
                alarm(MAXMSGTIME);
                if (setjmp(Sjbuf)) {
                        /* timed out */
-                       ret = ioctl(0, TIOCSETP, &Savettyb);
+                       if (!Unet) {
+#ifdef SYSIII
+                               ret = ioctl(0, TCSETA, &Savettyb);
+#endif
+#ifndef        SYSIII
+                               ret = ioctl(0, TIOCSETP, &Savettyb);
+#endif
+                       }
                        exit(0);
                }
                for (;;) {
                        ret = imsg(msg, Ifn);
                        if (ret != 0) {
                                alarm(0);
                        exit(0);
                }
                for (;;) {
                        ret = imsg(msg, Ifn);
                        if (ret != 0) {
                                alarm(0);
-                               ret = ioctl(0, TIOCSETP, &Savettyb);
+                               if (!Unet) {
+#ifdef SYSIII
+                                       ret = ioctl(0, TCSETA, &Savettyb);
+#endif
+#ifndef        SYSIII
+                                       ret = ioctl(0, TIOCSETP, &Savettyb);
+#endif
+                               }
                                exit(0);
                        }
                        if (msg[0] == 'S')
                                break;
                }
                alarm(0);
                                exit(0);
                        }
                        if (msg[0] == 'S')
                                break;
                }
                alarm(0);
-               DEBUG(4, "msg-%s,", msg);
                q = &msg[1];
                p = pskip(q);
                sprintf(Rmtname, "%.7s", q);
                q = &msg[1];
                p = pskip(q);
                sprintf(Rmtname, "%.7s", q);
@@ -163,13 +219,11 @@ char *argv[];
                        signal(SIGINT, SIG_IGN);
                        signal(SIGHUP, SIG_IGN);
                        omsg('R', "CB", Ofn);
                        signal(SIGINT, SIG_IGN);
                        signal(SIGHUP, SIG_IGN);
                        omsg('R', "CB", Ofn);
-                       DEBUG(4, "CALLBACK Role %d\n", Role);
                        logent("CALLBACK", "REQUIRED");
                        /*  set up for call back  */
                        systat(Rmtname, SS_CALLBACK, "CALL BACK");
                        gename(CMDPRE, Rmtname, 'C', file);
                        logent("CALLBACK", "REQUIRED");
                        /*  set up for call back  */
                        systat(Rmtname, SS_CALLBACK, "CALL BACK");
                        gename(CMDPRE, Rmtname, 'C', file);
-                       close(creat(file, 0666));
-                       chmod(file, 0666);
+                       close(creat(subfile(file), 0666));
                        xuucico(Rmtname);
                        cleanup(0);
                }
                        xuucico(Rmtname);
                        cleanup(0);
                }
@@ -209,6 +263,9 @@ char *argv[];
                        omsg('R', "BADSEQ", Ofn);
                        cleanup(0);
                }
                        omsg('R', "BADSEQ", Ofn);
                        cleanup(0);
                }
+               ttyn = ttyname(Ifn);
+               if (ttyn != NULL)
+                       chmod(ttyn, 0600);
        }
 loop:
        if (!onesys) {
        }
 loop:
        if (!onesys) {
@@ -232,15 +289,15 @@ loop:
                signal(SIGQUIT, SIG_IGN);
                if (!iswrk(file, "chk", Spool, wkpre) && !onesys) {
                        logent(Rmtname, "NO WORK");
                signal(SIGQUIT, SIG_IGN);
                if (!iswrk(file, "chk", Spool, wkpre) && !onesys) {
                        logent(Rmtname, "NO WORK");
-                       cleanup(0);
+                       goto next;
                }
                if (Ifn != -1 && Role == MASTER) {
                        write(Ofn, EOTMSG, strlen(EOTMSG));
                }
                if (Ifn != -1 && Role == MASTER) {
                        write(Ofn, EOTMSG, strlen(EOTMSG));
+                       clsacu();
                        close(Ofn);
                        close(Ifn);
                        Ifn = Ofn = -1;
                        close(Ofn);
                        close(Ifn);
                        Ifn = Ofn = -1;
-                       rmlock(NULL);
-                       clsacu();
+                       rmlock(CNULL);
                        sleep(3);
                }
                sprintf(msg, "call to %s ", Rmtname);
                        sleep(3);
                }
                sprintf(msg, "call to %s ", Rmtname);
@@ -267,22 +324,23 @@ loop:
                        ret = imsg(msg, Ifn);
                        if (ret != 0) {
                                alarm(0);
                        ret = imsg(msg, Ifn);
                        if (ret != 0) {
                                alarm(0);
+                               logent("imsg 1", "FAILED");
                                goto next;
                        }
                        if (msg[0] == 'S')
                                break;
                }
                                goto next;
                        }
                        if (msg[0] == 'S')
                                break;
                }
-               alarm(0);
+               alarm(MAXMSGTIME);
                seq = gnxseq(Rmtname);
                sprintf(msg, "%.7s -Q%d %s", Myname, seq, rflags);
                omsg('S', msg, Ofn);
                seq = gnxseq(Rmtname);
                sprintf(msg, "%.7s -Q%d %s", Myname, seq, rflags);
                omsg('S', msg, Ofn);
-               alarm(MAXMSGTIME);
                for (;;) {
                        ret = imsg(msg, Ifn);
                        DEBUG(4, "msg-%s\n", msg);
                        if (ret != 0) {
                                alarm(0);
                                ulkseq();
                for (;;) {
                        ret = imsg(msg, Ifn);
                        DEBUG(4, "msg-%s\n", msg);
                        if (ret != 0) {
                                alarm(0);
                                ulkseq();
+                               logent("imsg 2", "FAILED");
                                goto next;
                        }
                        if (msg[0] == 'R')
                                goto next;
                        }
                        if (msg[0] == 'R')
@@ -303,18 +361,18 @@ loop:
                }
                cmtseq();
        }
                }
                cmtseq();
        }
-       ttyn = ttyname(Ifn);
-       if (ttyn != NULL)
-               chmod(ttyn, 0600);
        DEBUG(1, " Rmtname %s, ", Rmtname);
        DEBUG(1, " Rmtname %s, ", Rmtname);
-       DEBUG(1, "my Role %s,  ", Role ? "MASTER" : "SLAVE");
-       DEBUG(1, "Spool - %s\n", Spool);
+       DEBUG(1, "Role %s,  ", Role ? "MASTER" : "SLAVE");
        DEBUG(1, "Ifn - %d, ", Ifn);
        DEBUG(1, "Ifn - %d, ", Ifn);
-       DEBUG(1, "Ofn - %d, ", Ofn);
        DEBUG(1, "Loginuser - %s\n", Loginuser);
 
        DEBUG(1, "Loginuser - %s\n", Loginuser);
 
+       alarm(MAXMSGTIME);
+       if (setjmp(Sjbuf))
+               goto Failure;
        ret = startup(Role);
        ret = startup(Role);
+       alarm(0);
        if (ret != SUCCESS) {
        if (ret != SUCCESS) {
+Failure:
                logent("startup", "FAILED");
                systat(Rmtname, SS_FAIL, "STARTUP");
                goto next;
                logent("startup", "FAILED");
                systat(Rmtname, SS_FAIL, "STARTUP");
                goto next;
@@ -323,7 +381,7 @@ loop:
                logent("startup", "OK");
                systat(Rmtname, SS_INPROGRESS, "TALKING");
                ret = cntrl(Role, wkpre);
                logent("startup", "OK");
                systat(Rmtname, SS_INPROGRESS, "TALKING");
                ret = cntrl(Role, wkpre);
-               DEBUG(1, "ret from cntrl - %d\n", ret);
+               DEBUG(1, "cntrl - %d\n", ret);
                signal(SIGINT, SIG_IGN);
                signal(SIGHUP, SIG_IGN);
                signal(SIGALRM, timeout);
                signal(SIGINT, SIG_IGN);
                signal(SIGHUP, SIG_IGN);
                signal(SIGALRM, timeout);
@@ -350,6 +408,7 @@ loop:
                        }
                }
                alarm(0);
                        }
                }
                alarm(0);
+               clsacu();       /* rti!trt: is this needed? */
        }
 next:
        if (!onesys) {
        }
 next:
        if (!onesys) {
@@ -358,8 +417,9 @@ next:
        cleanup(0);
 }
 
        cleanup(0);
 }
 
-
-int Hupvec[] = {0, 0, 1};
+#ifndef        SYSIII
+struct sgttyb Hupvec;
+#endif
 
 /***
  *     cleanup(code)   cleanup and exit with "code" status
 
 /***
  *     cleanup(code)   cleanup and exit with "code" status
@@ -367,32 +427,41 @@ int Hupvec[] = {0, 0, 1};
  */
 
 cleanup(code)
  */
 
 cleanup(code)
-int code;
+register int code;
 {
 {
-       int ret;
-       char *ttyn;
+       register int ret;
+       register char *ttyn;
 
        signal(SIGINT, SIG_IGN);
        signal(SIGHUP, SIG_IGN);
 
        signal(SIGINT, SIG_IGN);
        signal(SIGHUP, SIG_IGN);
-       rmlock(NULL);
+       rmlock(CNULL);
        clsacu();
        logcls();
        if (Role == SLAVE) {
        clsacu();
        logcls();
        if (Role == SLAVE) {
-               ret = ioctl(0, TIOCSETP, &Savettyb);
-               DEBUG(4, "\nIfn - %d, ", Ifn);
-               DEBUG(4, "ret ioctl - %d\n", ret);
-               DEBUG(4, "tty.flags %o,", Savettyb.sg_flags);
-               DEBUG(4, "tty.ispeed %d, ", Savettyb.sg_ispeed);
-               DEBUG(4, "tty.ospeed %d, ", Savettyb.sg_ospeed);
-               ret = ioctl(0, TIOCSETP, Hupvec);
-               DEBUG(4, "ret ioctl - %d\n", ret);
+               if (!Unet) {
+#ifdef SYSIII
+                       Savettyb.c_cflag |= HUPCL;
+                       ret = ioctl(0, TCSETA, &Savettyb);
+#endif
+#ifndef        SYSIII
+                       /* rti!trt:  use more robust hang up sequence */
+                       ret = ioctl(0, TIOCHPCL, STBNULL);
+                       ret = ioctl(0, TIOCGETP, &Hupvec);
+                       Hupvec.sg_ispeed = B0;
+                       Hupvec.sg_ospeed = B0;
+                       ret = ioctl(0, TIOCSETP, &Hupvec);
+                       sleep(2);
+                       ret = ioctl(0, TIOCSETP, &Savettyb);
+#endif
+                       DEBUG(4, "ret ioctl - %d\n", ret);
+               }
+               ttyn = ttyname(Ifn);
+               if (ttyn != NULL)
+                       chmod(ttyn, 0600);
        }
        if (Ofn != -1) {
                if (Role == MASTER)
                        write(Ofn, EOTMSG, strlen(EOTMSG));
        }
        if (Ofn != -1) {
                if (Role == MASTER)
                        write(Ofn, EOTMSG, strlen(EOTMSG));
-               ttyn = ttyname(Ifn);
-               if (ttyn != NULL)
-                       chmod(ttyn, 0666);
                close(Ifn);
                close(Ofn);
        }
                close(Ifn);
                close(Ofn);
        }
@@ -407,26 +476,42 @@ int code;
  */
 
 onintr(inter)
  */
 
 onintr(inter)
-int inter;
+register int inter;
 {
        char str[30];
        signal(inter, SIG_IGN);
        sprintf(str, "SIGNAL %d", inter);
        logent(str, "CAUGHT");
 {
        char str[30];
        signal(inter, SIG_IGN);
        sprintf(str, "SIGNAL %d", inter);
        logent(str, "CAUGHT");
+       systat(Rmtname, SS_FAIL, str);
        cleanup(inter);
 }
 
        cleanup(inter);
 }
 
-intrINT() { onintr(SIGINT);}
-intrHUP() { onintr(SIGHUP);}
-intrQUIT() { onintr(SIGQUIT);}
-intrTERM() { onintr(SIGTERM);}
+/* changed to single version of intrEXIT.  Is this okay? rti!trt */
 intrEXIT(signo)
 int signo;
 {
 intrEXIT(signo)
 int signo;
 {
+#ifdef SIGIO
+       /* if using 4.2 signal mechanism, must unblock all signal handlers */
+       sigsetmask(0);
+#endif
        signal(signo, SIG_DFL);
        signal(signo, SIG_DFL);
+       setgid(getgid());
        setuid(getuid());
        abort();
 }
        setuid(getuid());
        abort();
 }
+/*
+ * Catch a special signal
+ * (SIGFPE, ugh), and toggle debugging between 0 and 30.
+ * Handy for looking in on long running uucicos.
+ */
+setdebug()
+{
+       if (Debug < 30)
+               Debug = 30;
+       else
+               Debug = 0;
+}
+
 
 /***
  *     fixmode(tty)    fix kill/echo/raw on line
 
 /***
  *     fixmode(tty)    fix kill/echo/raw on line
@@ -435,17 +520,36 @@ int signo;
  */
 
 fixmode(tty)
  */
 
 fixmode(tty)
-int tty;
+register int tty;
 {
 {
+#ifdef SYSIII
+       struct termio ttbuf;
+#endif
+#ifndef        SYSIII
        struct sgttyb ttbuf;
        struct sgttyb ttbuf;
-       int ret;
-
+#endif
+       register int ret;
+
+       if (Unet)
+               return;
+#ifdef SYSIII
+       ioctl(tty, TCGETA, &ttbuf);
+       ttbuf.c_iflag = ttbuf.c_oflag = ttbuf.c_lflag = (ushort)0;
+       ttbuf.c_cflag &= (CBAUD);
+       ttbuf.c_cflag |= (CS8|CREAD);
+       ttbuf.c_cc[VMIN] = 6;
+       ttbuf.c_cc[VTIME] = 1;
+       ret = ioctl(tty, TCSETA, &ttbuf);
+#endif
+#ifndef        SYSIII
        ioctl(tty, TIOCGETP, &ttbuf);
        ttbuf.sg_flags = (ANYP | RAW);
        ret = ioctl(tty, TIOCSETP, &ttbuf);
        ioctl(tty, TIOCGETP, &ttbuf);
        ttbuf.sg_flags = (ANYP | RAW);
        ret = ioctl(tty, TIOCSETP, &ttbuf);
-       ASSERT(ret >= 0, "RETURN FROM STTY %d", ret);
-       ioctl(tty, TIOCEXCL, 0);
-       return;
+#endif
+       ASSERT(ret >= 0, "STTY FAILED", "", ret);
+#ifndef        SYSIII
+       ioctl(tty, TIOCEXCL, STBNULL);
+#endif
 }
 
 
 }
 
 
@@ -455,6 +559,8 @@ int tty;
 
 timeout()
 {
 
 timeout()
 {
+       logent(Rmtname, "TIMEOUT");
+       systat(Rmtname, SS_FAIL, "TIMEOUT");
        longjmp(Sjbuf, 1);
 }
 
        longjmp(Sjbuf, 1);
 }