more fixes from rick adams
[unix-history] / usr / src / usr.bin / uucp / uucico / condevs.c
index 714e73c..43228ff 100644 (file)
@@ -1,7 +1,10 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)condevs.c  5.12 (Berkeley) %G%";
+static char sccsid[] = "@(#)condevs.c  5.13 (Berkeley) %G%";
 #endif
 
 #endif
 
+extern int errno;
+extern char *sys_errlist[];
+
 /*
  * Here are various dialers to establish the machine-machine connection.
  * conn.c/condevs.c was glued together by Mike Mitchell.
 /*
  * Here are various dialers to establish the machine-machine connection.
  * conn.c/condevs.c was glued together by Mike Mitchell.
@@ -179,14 +182,16 @@ register char *flds[];
 
        sprintf(dcname, "/dev/%s", dev.D_line);
        if (setjmp(Sjbuf)) {
 
        sprintf(dcname, "/dev/%s", dev.D_line);
        if (setjmp(Sjbuf)) {
+               DEBUG(4, "Open timed out\n", CNULL);
                delock(dev.D_line);
                return CF_DIAL;
        }
        signal(SIGALRM, alarmtr);
                delock(dev.D_line);
                return CF_DIAL;
        }
        signal(SIGALRM, alarmtr);
-       alarm(10);
+       /* For PC Pursuit, it could take a while to call back */
+       alarm( strcmp(flds[F_LINE], "PCP") ? 10 : MAXMSGTIME*4 );
        getnextfd();
        errno = 0;
        getnextfd();
        errno = 0;
-        DEBUG(4,"Opening %s",dcname);
+        DEBUG(4,"Opening %s\n",dcname);
        dcr = open(dcname, 2); /* read/write */
 #ifdef VMSDTR  /* Modem control on vms(works dtr) */
        fflush(stdout);
        dcr = open(dcname, 2); /* read/write */
 #ifdef VMSDTR  /* Modem control on vms(works dtr) */
        fflush(stdout);
@@ -210,16 +215,19 @@ register char *flds[];
        }
 #endif VMSDTR
        next_fd = -1;
        }
 #endif VMSDTR
        next_fd = -1;
-       if (dcr < 0 && errno == EACCES)
-               logent(dcname, "CAN'T OPEN");
        alarm(0);
        if (dcr < 0) {
        alarm(0);
        if (dcr < 0) {
+               if (errno == EACCES)
+                       logent(dev.D_line, "CANT OPEN");
+               DEBUG(4, "OPEN FAILED: errno %d\n", errno);
                delock(dev.D_line);
                return CF_DIAL;
        }
        fflush(stdout);
                delock(dev.D_line);
                return CF_DIAL;
        }
        fflush(stdout);
-       if (fixline(dcr, dev.D_speed) == FAIL)
+       if (fixline(dcr, dev.D_speed) == FAIL) {
+               DEBUG(4, "FIXLINE FAILED\n", CNULL);
                return CF_DIAL;
                return CF_DIAL;
+       }
        strcpy(devSel, dev.D_line);     /* for latter unlock */
        CU_end = dircls;
        return dcr;
        strcpy(devSel, dev.D_line);     /* for latter unlock */
        CU_end = dircls;
        return dcr;
@@ -339,7 +347,6 @@ register char *flds[];
        return retval;
 }
 
        return retval;
 }
 
-#if defined(VENTEL) || defined(NOVATION) || defined(DF112)
 /*
  * intervaldelay:  delay execution for numerator/denominator seconds.
  */
 /*
  * intervaldelay:  delay execution for numerator/denominator seconds.
  */
@@ -401,13 +408,60 @@ register char *str;
        DEBUG(6, "slowrite ", CNULL);
        while (*str) {
                DEBUG(6, "%c", *str);
        DEBUG(6, "slowrite ", CNULL);
        while (*str) {
                DEBUG(6, "%c", *str);
-               uucpdelay(1,10);        /* delay 1/10 second */
+               uucpdelay(1, 10);       /* delay 1/10 second */
                write(fd, str, 1);
                str++;
        }
        DEBUG(6, "\n", CNULL);
 }
                write(fd, str, 1);
                str++;
        }
        DEBUG(6, "\n", CNULL);
 }
-#endif VENTEL || NOVATION || DF112
+
+#define BSPEED B150
+
+/*
+ *     send a break
+ */
+genbrk(fn, bnulls)
+register int fn, bnulls;
+{
+#ifdef USG
+       if (ioctl(fn, TCSBRK, STBNULL) < 0)
+               DEBUG(5, "break TCSBRK %s\n", sys_errlist[errno]);
+#else  !USG
+# ifdef        TIOCSBRK
+       if (ioctl(fn, TIOCSBRK, STBNULL) < 0)
+               DEBUG(5, "break TIOCSBRK %s\n", sys_errlist[errno]);
+# ifdef        TIOCCBRK
+       uucpdelay(bnulls, 10);
+       if (ioctl(fn, TIOCCBRK, STBNULL) < 0)
+               DEBUG(5, "break TIOCCBRK %s\n", sys_errlist[errno]);
+# endif TIOCCBRK
+       DEBUG(4, "ioctl %f second break\n", (float) bnulls/10 );
+# else !TIOCSBRK
+       struct sgttyb ttbuf;
+       register int sospeed;
+
+       if (ioctl(fn, TIOCGETP, &ttbuf) < 0)
+               DEBUG(5, "break TIOCGETP %s\n", sys_errlist[errno]);
+       sospeed = ttbuf.sg_ospeed;
+       ttbuf.sg_ospeed = BSPEED;
+       if (ioctl(fn, TIOCSETP, &ttbuf) < 0)
+               DEBUG(5, "break TIOCSETP %s\n", sys_errlist[errno]);
+       if (write(fn, "\0\0\0\0\0\0\0\0\0\0\0\0", bnulls) != bnulls) {
+badbreak:
+               logent(sys_errlist[errno], "BAD WRITE genbrk");
+               alarm(0);
+               longjmp(Sjbuf, 3);
+       }
+       ttbuf.sg_ospeed = sospeed;
+       if (ioctl(fn, TIOCSETP, &ttbuf) < 0)
+               DEBUG(5, "break ioctl %s\n", sys_errlist[errno]);
+       if (write(fn, "@", 1) != 1)
+               goto badbreak;
+       DEBUG(4, "sent BREAK nulls - %d\n", bnulls);
+#endif !TIOCSBRK
+#endif !USG
+}
+
 
 #ifdef DIALINOUT
 /* DIALIN/OUT CODE (WLS) */
 
 #ifdef DIALINOUT
 /* DIALIN/OUT CODE (WLS) */