date and time created 86/04/03 16:50:58 by donn
[unix-history] / usr / src / usr.bin / tip / aculib / dn11.c
index 73a1eaa..2a9553a 100644 (file)
-/*     dn11.c  4.1     81/05/09        */
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)dn11.c     5.1 (Berkeley) %G%";
+#endif not lint
+
 /*
  * Routines for dialing up on DN-11
  */
 #include "tip.h"
 
 /*
  * Routines for dialing up on DN-11
  */
 #include "tip.h"
 
-int dn_abort();
+int dn_abort(), alarmtr();
+static jmp_buf jmpbuf;
+static int child = -1, dn;
 
 
-#if DN11
 dn_dialer(num, acu)
 dn_dialer(num, acu)
-char *num, *acu;
+       char *num, *acu;
 {
        extern errno;
 {
        extern errno;
-       char *p, *q, b[30];
-       int child = -1, dn, t, connected = 1;
+       char *p, *q, phone[40];
+       int lt, nw, connected = 1;
+       register int timelim;
 
 
+       if (boolean(value(VERBOSE)))
+               printf("\nstarting call...");
        if ((dn = open(acu, 1)) < 0) {
        if ((dn = open(acu, 1)) < 0) {
-               if (errno == 6)
-                       printf("line busy\n");
-               return(0);
+               if (errno == EBUSY)
+                       printf("line busy...");
+               else
+                       printf("acu open error...");
+               return (0);
        }
        }
-       if ((child = fork()) == -1) {
-               printf("can't fork\n");
-               return(0);
+       if (setjmp(jmpbuf)) {
+               kill(child, SIGKILL);
+               close(dn);
+               return (0);
        }
        }
-       if (child == 0) {
+       signal(SIGALRM, alarmtr);
+       timelim = 5 * strlen(num);
+       alarm(timelim < 30 ? 30 : timelim);
+       if ((child = fork()) == 0) {
+               /*
+                * ignore this stuff for aborts
+                */
                signal(SIGALRM, SIG_IGN);
                signal(SIGALRM, SIG_IGN);
-               pause();
+               signal(SIGINT, SIG_IGN);
+               signal(SIGQUIT, SIG_IGN);
+               sleep(2);
+               nw = write(dn, num, lt = strlen(num));
+               exit(nw != lt);
        }
        }
-       sleep(2);
        /*
        /*
-        * copy phone #, assure EON
+        * open line - will return on carrier
         */
         */
-       for (p = b, q = num; *p = *q; p++, q++)
-               ;
-       if (*(p-1) != '<') {
-               if (*(p-1) != '-')
-                       *p++ = '-';
-               *p++ = '<';
+       if ((FD = open(DV, 2)) < 0) {
+               if (errno == EIO)
+                       printf("lost carrier...");
+               else
+                       printf("dialup line open failed...");
+               alarm(0);
+               kill(child, SIGKILL);
+               close(dn);
+               return (0);
        }
        }
-       close(FD);
-       t = p-b;
-       signal(SIGALRM, dn_abort);
-       alarm(5*t);
-       t = write(dn, b, t);
        alarm(0);
        alarm(0);
-       if (t < 0) {
-               printf("dn11 write error\n");
-               connected = 0;
-               goto error;
-       }
-       alarm(40);              /* was 5; sometimes missed carrier */
-       FD = open(DV, 2);
-       alarm(0);
-       if (FD < 0) {
-               if (errno == 4)
-                       printf("lost carrier\n");
-               connected = 0;
-               goto error;
-       }
-       ioctl(FD, TIOCEXCL, 0);
-       ioctl(FD, TIOCHPCL, 0);
-error: 
-       kill(child, SIGKILL);
-       alarm(10);
-       while ((t = wait((int *)NULL)) != -1 && t != child)
+       ioctl(dn, TIOCHPCL, 0);
+       signal(SIGALRM, SIG_DFL);
+       while ((nw = wait(&lt)) != child && nw != -1)
                ;
                ;
+       fflush(stdout);
+       close(dn);
+       if (lt != 0) {
+               close(FD);
+               return (0);
+       }
+       return (1);
+}
+
+alarmtr()
+{
+
        alarm(0);
        alarm(0);
-       signal(SIGALRM, SIG_DFL);
-       return(connected);
+       longjmp(jmpbuf, 1);
+}
+
+/*
+ * Insurance, for some reason we don't seem to be
+ *  hanging up...
+ */
+dn_disconnect()
+{
+
+       sleep(2);
+       if (FD > 0)
+               ioctl(FD, TIOCCDTR, 0);
+       close(FD);
 }
 
 }
 
-dn_disconnect() { }
+dn_abort()
+{
 
 
-dn_abort() { }
-#endif
+       sleep(2);
+       if (child > 0)
+               kill(child, SIGKILL);
+       if (dn > 0)
+               close(dn);
+       if (FD > 0)
+               ioctl(FD, TIOCCDTR, 0);
+       close(FD);
+}