home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / ip / slip / cslip-2.6 / tip / libacu / v831.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-30  |  5.9 KB  |  247 lines

  1. /*
  2.  * Copyright (c) 1983 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that: (1) source distributions retain this entire copyright
  7.  * notice and comment, and (2) distributions including binaries display
  8.  * the following acknowledgement:  ``This product includes software
  9.  * developed by the University of California, Berkeley and its contributors''
  10.  * in the documentation or other materials provided with the distribution
  11.  * and in all advertising materials mentioning features or use of this
  12.  * software. Neither the name of the University nor the names of its
  13.  * contributors may be used to endorse or promote products derived
  14.  * from this software without specific prior written permission.
  15.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  16.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  17.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18.  */
  19.  
  20. #ifndef lint
  21. static char sccsid[] = "@(#)v831.c    5.3 (Berkeley) 6/1/90";
  22. #endif /* not lint */
  23.  
  24. /*
  25.  * Routines for dialing up on Vadic 831
  26.  */
  27. #include <sys/time.h>
  28.  
  29. #include "tip.h"
  30.  
  31. int    v831_abort();
  32. static    int alarmtr();
  33. extern    errno;
  34.  
  35. static jmp_buf jmpbuf;
  36. static int child = -1;
  37.  
  38. v831_dialer(num, acu)
  39.         char *num, *acu;
  40. {
  41.         int status, pid, connected = 1;
  42.         register int timelim;
  43.  
  44.         if (boolean(value(VERBOSE)))
  45.                 printf("\nstarting call...");
  46. #ifdef DEBUG
  47.         printf ("(acu=%s)\n", acu);
  48. #endif
  49.         if ((AC = open(acu, O_RDWR)) < 0) {
  50.                 if (errno == EBUSY)
  51.                         printf("line busy...");
  52.                 else
  53.                         printf("acu open error...");
  54.                 return (0);
  55.         }
  56.         if (setjmp(jmpbuf)) {
  57.                 kill(child, SIGKILL);
  58.                 close(AC);
  59.                 return (0);
  60.         }
  61.         signal(SIGALRM, alarmtr);
  62.         timelim = 5 * strlen(num);
  63.         alarm(timelim < 30 ? 30 : timelim);
  64.         if ((child = fork()) == 0) {
  65.                 /*
  66.                  * ignore this stuff for aborts
  67.                  */
  68.                 signal(SIGALRM, SIG_IGN);
  69.         signal(SIGINT, SIG_IGN);
  70.                 signal(SIGQUIT, SIG_IGN);
  71.                 sleep(2);
  72.                 exit(dialit(num, acu) != 'A');
  73.         }
  74.         /*
  75.          * open line - will return on carrier
  76.          */
  77.         if ((FD = open(DV, O_RDWR)) < 0) {
  78. #ifdef DEBUG
  79.                 printf("(after open, errno=%d)\n", errno);
  80. #endif
  81.                 if (errno == EIO)
  82.                         printf("lost carrier...");
  83.                 else
  84.                         printf("dialup line open failed...");
  85.                 alarm(0);
  86.                 kill(child, SIGKILL);
  87.                 close(AC);
  88.                 return (0);
  89.         }
  90.         alarm(0);
  91. #ifdef notdef
  92.         ioctl(AC, TIOCHPCL, 0);
  93. #endif
  94.         signal(SIGALRM, SIG_DFL);
  95.         while ((pid = wait(&status)) != child && pid != -1)
  96.                 ;
  97.         if (status) {
  98.                 close(AC);
  99.                 return (0);
  100.         }
  101.         return (1);
  102. }
  103.  
  104. static
  105. alarmtr()
  106. {
  107.  
  108.         alarm(0);
  109.         longjmp(jmpbuf, 1);
  110. }
  111.  
  112. /*
  113.  * Insurance, for some reason we don't seem to be
  114.  *  hanging up...
  115.  */
  116. v831_disconnect()
  117. {
  118.         struct sgttyb cntrl;
  119.  
  120.         sleep(2);
  121. #ifdef DEBUG
  122.         printf("[disconnect: FD=%d]\n", FD);
  123. #endif
  124.         if (FD > 0) {
  125.                 ioctl(FD, TIOCCDTR, 0);
  126.                 ioctl(FD, TIOCGETP, &cntrl);
  127.                 cntrl.sg_ispeed = cntrl.sg_ospeed = 0;
  128.                 ioctl(FD, TIOCSETP, &cntrl);
  129.                 ioctl(FD, TIOCNXCL, (struct sgttyb *)NULL);
  130.         }
  131.         close(FD);
  132. }
  133.  
  134. v831_abort()
  135. {
  136.  
  137. #ifdef DEBUG
  138.         printf("[abort: AC=%d]\n", AC);
  139. #endif
  140.         sleep(2);
  141.         if (child > 0)
  142.                 kill(child, SIGKILL);
  143.         if (AC > 0)
  144.                 ioctl(FD, TIOCNXCL, (struct sgttyb *)NULL);
  145.                 close(AC);
  146.         if (FD > 0)
  147.                 ioctl(FD, TIOCCDTR, 0);
  148.         close(FD);
  149. }
  150.  
  151. /*
  152.  * Sigh, this probably must be changed at each site.
  153.  */
  154. struct vaconfig {
  155.     char    *vc_name;
  156.     char    vc_rack;
  157.     char    vc_modem;
  158. } vaconfig[] = {
  159.     { "/dev/cua0",'4','0' },
  160.     { "/dev/cua1",'4','1' },
  161.     { 0 }
  162. };
  163.  
  164. #define pc(x)    (c = x, write(AC,&c,1))
  165. #define ABORT    01
  166. #define SI    017
  167. #define STX    02
  168. #define ETX    03
  169.  
  170. static
  171. dialit(phonenum, acu)
  172.     register char *phonenum;
  173.     char *acu;
  174. {
  175.         register struct vaconfig *vp;
  176.     struct sgttyb cntrl;
  177.         char c, *sanitize();
  178.         int i, two = 2;
  179.  
  180.         phonenum = sanitize(phonenum);
  181. #ifdef DEBUG
  182.         printf ("(dial phonenum=%s)\n", phonenum);
  183. #endif
  184.         if (*phonenum == '<' && phonenum[1] == 0)
  185.                 return ('Z');
  186.     for (vp = vaconfig; vp->vc_name; vp++)
  187.         if (strcmp(vp->vc_name, acu) == 0)
  188.             break;
  189.     if (vp->vc_name == 0) {
  190.         printf("Unable to locate dialer (%s)\n", acu);
  191.         return ('K');
  192.     }
  193.         ioctl(AC, TIOCGETP, &cntrl);
  194.         cntrl.sg_ispeed = cntrl.sg_ospeed = B2400;
  195.         cntrl.sg_flags = RAW | EVENP | ODDP;
  196.         ioctl(AC, TIOCSETP, &cntrl);
  197.     ioctl(AC, TIOCFLUSH, &two);
  198.         pc(STX);
  199.     pc(vp->vc_rack);
  200.     pc(vp->vc_modem);
  201.     while (*phonenum && *phonenum != '<')
  202.         pc(*phonenum++);
  203.         pc(SI);
  204.     pc(ETX);
  205.         sleep(1);
  206.         i = read(AC, &c, 1);
  207. #ifdef DEBUG
  208.         printf("read %d chars, char=%c, errno %d\n", i, c, errno);
  209. #endif
  210.         if (i != 1)
  211.         c = 'M';
  212.         if (c == 'B' || c == 'G') {
  213.                 char cc, oc = c;
  214.  
  215.                 pc(ABORT);
  216.                 read(AC, &cc, 1);
  217. #ifdef DEBUG
  218.                 printf("abort response=%c\n", cc);
  219. #endif
  220.                 c = oc;
  221.                 v831_disconnect();
  222.         }
  223.         close(AC);
  224. #ifdef DEBUG
  225.         printf("dialit: returns %c\n", c);
  226. #endif
  227.         return (c);
  228. }
  229.  
  230. static char *
  231. sanitize(s)
  232.     register char *s;
  233. {
  234.         static char buf[128];
  235.         register char *cp;
  236.  
  237.         for (cp = buf; *s; s++) {
  238.         if (!isdigit(*s) && *s == '<' && *s != '_')
  239.             continue;
  240.         if (*s == '_')
  241.             *s = '=';
  242.         *cp++ = *s;
  243.     }
  244.         *cp++ = 0;
  245.         return (buf);
  246. }
  247.