BSD 4_4 release
[unix-history] / usr / src / usr.bin / tip / aculib / ventel.c
index 859795e..28b0d28 100644 (file)
@@ -1,29 +1,72 @@
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)ventel.c   1.4 (Berkeley) %G%";
-#endif
+static char sccsid[] = "@(#)ventel.c   8.1 (Berkeley) 6/6/93";
+#endif /* not lint */
 
 
-#if VENTEL
 /*
  * Routines for calling up on a Ventel Modem
 /*
  * Routines for calling up on a Ventel Modem
- * The Ventel is expected to be strapped for "no echo".
+ * The Ventel is expected to be strapped for local echo (just like uucp)
  */
 #include "tip.h"
 
 #define        MAXRETRY        5
 
  */
 #include "tip.h"
 
 #define        MAXRETRY        5
 
-static int sigALRM();
+static void sigALRM();
 static int timeout = 0;
 static jmp_buf timeoutbuf;
 
 static int timeout = 0;
 static jmp_buf timeoutbuf;
 
+/*
+ * some sleep calls have been replaced by this macro
+ * because some ventel modems require two <cr>s in less than
+ * a second in order to 'wake up'... yes, it is dirty...
+ */
+#define delay(num,denom) busyloop(CPUSPEED*num/denom)
+#define CPUSPEED 1000000       /* VAX 780 is 1MIPS */
+#define        DELAY(n)        { register long N = (n); while (--N > 0); }
+busyloop(n) { DELAY(n); }
+
 ven_dialer(num, acu)
        register char *num;
        char *acu;
 {
        register char *cp;
        register int connected = 0;
 ven_dialer(num, acu)
        register char *num;
        char *acu;
 {
        register char *cp;
        register int connected = 0;
-#ifdef ACULOG
-       char line[80];
-#endif
+       char *msg, *index(), line[80];
+       static int gobble(), vensync();
+       static void echo();
+
        /*
         * Get in synch with a couple of carriage returns
         */
        /*
         * Get in synch with a couple of carriage returns
         */
@@ -40,12 +83,14 @@ ven_dialer(num, acu)
        ioctl(FD, TIOCHPCL, 0);
        echo("#k$\r$\n$D$I$A$L$:$ ");
        for (cp = num; *cp; cp++) {
        ioctl(FD, TIOCHPCL, 0);
        echo("#k$\r$\n$D$I$A$L$:$ ");
        for (cp = num; *cp; cp++) {
-               sleep(1);
+               delay(1, 10);
                write(FD, cp, 1);
        }
                write(FD, cp, 1);
        }
-       echo("\r$\n");
-       if (gobble('\n'))
-               connected = gobble('!');
+       delay(1, 10);
+       write(FD, "\r", 1);
+       gobble('\n', line);
+       if (gobble('\n', line))
+               connected = gobble('!', line);
        ioctl(FD, TIOCFLUSH);
 #ifdef ACULOG
        if (timeout) {
        ioctl(FD, TIOCFLUSH);
 #ifdef ACULOG
        if (timeout) {
@@ -56,6 +101,26 @@ ven_dialer(num, acu)
 #endif
        if (timeout)
                ven_disconnect();       /* insurance */
 #endif
        if (timeout)
                ven_disconnect();       /* insurance */
+       if (connected || timeout || !boolean(value(VERBOSE)))
+               return (connected);
+       /* call failed, parse response for user */
+       cp = index(line, '\r');
+       if (cp)
+               *cp = '\0';
+       for (cp = line; cp = index(cp, ' '); cp++)
+               if (cp[1] == ' ')
+                       break;
+       if (cp) {
+               while (*cp == ' ')
+                       cp++;
+               msg = cp;
+               while (*cp) {
+                       if (isupper(*cp))
+                               *cp = tolower(*cp);
+                       cp++;
+               }
+               printf("%s...", msg);
+       }
        return (connected);
 }
 
        return (connected);
 }
 
@@ -72,7 +137,7 @@ ven_abort()
        close(FD);
 }
 
        close(FD);
 }
 
-static int
+static void
 echo(s)
        register char *s;
 {
 echo(s)
        register char *s;
 {
@@ -96,39 +161,42 @@ echo(s)
        }
 }
 
        }
 }
 
-static int
+static void
 sigALRM()
 {
 sigALRM()
 {
-
        printf("\07timeout waiting for reply\n");
        timeout = 1;
        longjmp(timeoutbuf, 1);
 }
 
 static int
        printf("\07timeout waiting for reply\n");
        timeout = 1;
        longjmp(timeoutbuf, 1);
 }
 
 static int
-gobble(match)
+gobble(match, response)
        register char match;
        register char match;
+       char response[];
 {
 {
+       register char *cp = response;
+       sig_t f;
        char c;
        char c;
-       int (*f)();
 
 
-       signal(SIGALRM, sigALRM);
+       f = signal(SIGALRM, sigALRM);
        timeout = 0;
        do {
                if (setjmp(timeoutbuf)) {
                        signal(SIGALRM, f);
        timeout = 0;
        do {
                if (setjmp(timeoutbuf)) {
                        signal(SIGALRM, f);
+                       *cp = '\0';
                        return (0);
                }
                alarm(number(value(DIALTIMEOUT)));
                        return (0);
                }
                alarm(number(value(DIALTIMEOUT)));
-               read(FD, &c, 1);
+               read(FD, cp, 1);
                alarm(0);
                alarm(0);
-               c &= 0177;
+               c = (*cp++ &= 0177);
 #ifdef notdef
                if (boolean(value(VERBOSE)))
                        putchar(c);
 #endif
        } while (c != '\n' && c != match);
        signal(SIGALRM, SIG_DFL);
 #ifdef notdef
                if (boolean(value(VERBOSE)))
                        putchar(c);
 #endif
        } while (c != '\n' && c != match);
        signal(SIGALRM, SIG_DFL);
+       *cp = '\0';
        return (c == match);
 }
 
        return (c == match);
 }
 
@@ -153,7 +221,7 @@ vensync(fd)
         * with DTR, you can always try setting the baud rate to 0.
         */
        ioctl(FD, TIOCCDTR, 0);
         * with DTR, you can always try setting the baud rate to 0.
         */
        ioctl(FD, TIOCCDTR, 0);
-       sleep(2);
+       sleep(1);
        ioctl(FD, TIOCSDTR, 0);
        while (already < MAXRETRY) {
                /*
        ioctl(FD, TIOCSDTR, 0);
        while (already < MAXRETRY) {
                /*
@@ -162,9 +230,9 @@ vensync(fd)
                 * so the modem can frame the incoming characters.
                 */
                write(fd, "\r", 1);
                 * so the modem can frame the incoming characters.
                 */
                write(fd, "\r", 1);
-               sleep(1);
+               delay(1,10);
                write(fd, "\r", 1);
                write(fd, "\r", 1);
-               sleep(3);
+               sleep(2);
                if (ioctl(fd, FIONREAD, (caddr_t)&nread) < 0) {
                        perror("tip: ioctl");
                        continue;
                if (ioctl(fd, FIONREAD, (caddr_t)&nread) < 0) {
                        perror("tip: ioctl");
                        continue;
@@ -180,4 +248,4 @@ vensync(fd)
        }
        return (0);
 }
        }
        return (0);
 }
-#endif
+