home *** CD-ROM | disk | FTP | other *** search
/ Super Net 1 / SUPERNET_1.iso / PC / OTROS / SUN / SLIP / CSN_SLIP.TAR / slip-tip / libacu / t1600.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-08-22  |  8.9 KB  |  550 lines

  1. /*
  2.  * Dialer support for Telebit Trailblazer Plus modem.
  3.  */
  4. #include "tip.h"
  5.  
  6. #define SYNC 1
  7. #define NOSYNC 0
  8.  
  9. static jmp_buf Sjbuf;
  10.  
  11. #define VERB(l, f, s) if (boolean(value(VERBOSE))) fprintf(stderr, f, s)
  12.  
  13. #define DELAY(n) { int i; for(i=0;i<n*90000;i++); }
  14.  
  15. #define PRINT(s) fprintf(stderr,s)
  16.  
  17. static int debug;
  18.  
  19. char *findl();
  20.  
  21. char *t16DialOutModes[] = {
  22.     "\rAT E0 V0\r", 
  23.     "\0"
  24. };
  25.  
  26.  
  27. char *t16AtnModes[] = {
  28.             "\rAT E0 V0\r", /* attention..*/
  29.             "\0"
  30.             };
  31.  
  32.  
  33. char *t16DialInModes[] = {
  34.             "AT E0 V0\r",   /* disconnect */
  35.             "\0"
  36.             };
  37.  
  38.  
  39. int t16gotok();
  40.  
  41. extern alarmtr();
  42.  
  43. /*
  44. ** On entry:
  45. **
  46. ** FD - file descriptor
  47. **
  48. */
  49.  
  50. t16_dialer(num, acu)
  51. register char    *num;
  52. char    *acu;
  53. {
  54.     int ix, retry;
  55.     char buf[BUFSIZ];
  56.  
  57.     int sp;
  58.  
  59. #ifdef DEBUG
  60.     debug++;
  61. #endif
  62.  
  63.     ttysetup(speed(9600));
  64.  
  65.     ix = 1; retry = 3;
  66.  
  67.     while (1)
  68.     {
  69.  
  70.             VERB(4,"Checking for life...\n",acu);
  71.  
  72.  
  73.             if (BlatStrings(FD,t16AtnModes,SYNC)) 
  74.                 break;
  75.  
  76.             VERB(4,"BREAK down ...\n",0);
  77.             ioctl(FD,TIOCSBRK,0);
  78.             sleep(1);
  79.             ioctl(FD,TIOCCBRK,0); DELAY(1);
  80.             VERB(4,"BREAK up...\n",0);
  81.             DELAY(1);
  82.  
  83.             if (--retry == 0) {
  84.                 VERB(4,acu, "modem not responding OK");
  85.                 t16_disconnect();
  86.                 return 0;
  87.             }
  88.  
  89.             switch(retry)
  90.             {
  91.             case 2:
  92.                 ttysetup(speed(2400));
  93.                 break;
  94.  
  95.             case 1:
  96.                 ttysetup(speed(1200));
  97.                 break;
  98.  
  99.             default:
  100.                 break;
  101.             }
  102.  
  103.  
  104.     }
  105.  
  106.     ttysetup(speed(9600));
  107.  
  108.  
  109.     VERB(4,"Checking for life at 9600...\n",0);
  110.  
  111.     if (!BlatStrings(FD,t16AtnModes,SYNC)) {
  112.         t16_disconnect();
  113.         return 0;
  114.     }
  115.  
  116.     if (!BlatStrings(FD,t16DialOutModes,SYNC)) {
  117.         t16_disconnect();
  118.         return 0;
  119.     }
  120.  
  121.  
  122.     ioctl(FD, TIOCFLUSH, &ix);
  123.     alarm(0);
  124.  
  125.     sprintf(buf,"ATDT%s\r",num);
  126.  
  127.     VERB(4,"\r\n",0);
  128.     VERB(4,buf,0);
  129.     VERB(4,"\r\n",0);
  130.  
  131.     write(FD,buf,strlen(buf));
  132.  
  133.     if (setjmp(Sjbuf)) {
  134.         fprintf(stderr,"\nModem Didn't respond after dial command\n");
  135.         t16_disconnect();
  136.         return 0;
  137.     }
  138.  
  139.     sp = 0;
  140.  
  141.     do {
  142.  
  143.     int result = 0;
  144.  
  145.     switch (result = t16gotok(FD,60)) {
  146.  
  147.         case 0: 
  148.             VERB(4,"TELEBIT Command accepted\n",0); 
  149.             sp = 0;
  150.             break;
  151.         case 1: 
  152.             PRINT("TELEBIT connected at 300 baud\n");
  153.             sp = 300;
  154.             break;
  155.         case 2: 
  156.             sp = 0;
  157.             VERB(4, "TELEBIT This End Ring\n",0);
  158.             break;
  159.         case 3: 
  160.             PRINT("TELEBIT No Carrier\n");
  161.             sp = -1;
  162.             break;
  163.         case 4: 
  164.             PRINT("TELEBIT Error\n");
  165.             sp = -1;
  166.             break;
  167.         case 5: 
  168.             sp = 1200;
  169.             PRINT("TELEBIT Connect 1200\n");
  170.             break;
  171.         case 6: 
  172.             PRINT("TELEBIT No dialtone\n");
  173.             sp = -1;
  174.             break;
  175.         case 7: 
  176.             PRINT("TELEBIT detected BUSY\n");
  177.             sp = -1;
  178.             break;
  179.         case 8: 
  180.             PRINT("TELEBIT No quiet answer\n");
  181.             sp = -1;
  182.             break;
  183.         case 10: 
  184.             sp = 2400;
  185.             PRINT("TELEBIT Connect 2400\n");
  186.             break;
  187.  
  188.         case 11:
  189.             sp = 4800;
  190.             PRINT("TELEBIT Connect 4800/V.32\n");
  191.             break;
  192.  
  193.         case 12:
  194.             sp = 9600;
  195.             PRINT("TELEBIT Connect 9600/V.32\n");
  196.             break;
  197.  
  198.         case 13:
  199.             sp = 14400;
  200.             PRINT("TELEBIT Connect 14400/V.32\n");
  201.             break;
  202.  
  203.  
  204.         case 14:
  205.             sp = 19200;
  206.             PRINT("TELEBIT Connect 19200/V.32\n");
  207.             break;
  208.  
  209.  
  210.         case 15:
  211.             sp = 38400;
  212.             PRINT("TELEBIT Connect 38400/V.32\n");
  213.             break;
  214.  
  215.  
  216.         case 48:
  217.             sp = 7200;
  218.             PRINT("TELEBIT Connect 7200/V.32\n");
  219.             break;
  220.  
  221.         case 49:
  222.             sp = 12000;
  223.             PRINT("TELEBIT Connect 12000/V.32\n");
  224.             break;
  225.  
  226.         case 50:
  227.             sp = 9600;
  228.             PRINT("TELEBIT Connect FAST\n");
  229.             break;
  230.  
  231.         case 52:
  232.             sp = 0;
  233.             PRINT("TELEBIT Far End  RINGING\n");
  234.             break;
  235.  
  236.  
  237.         case 53:
  238.             sp = 0;
  239.             PRINT("TELEBIT Dialing...\n");
  240.             break;
  241.  
  242.  
  243.         case 54:
  244.             sp = 0;
  245.             PRINT("TELEBIT No prompttone...\n");
  246.             break;
  247.  
  248.         case 20:
  249.             PRINT("TELEBIT Connect 300/REL\n");
  250.             sp = 300;
  251.             break;
  252.  
  253.         case 22:
  254.             PRINT("TELEBIT Connect 1200/REL\n");
  255.             sp = 1200;
  256.             break;
  257.  
  258.         case 23:
  259.             PRINT("TELEBIT Connect 2400/REL\n");
  260.             sp = 2400;
  261.             break;
  262.  
  263.         case 24:
  264.             PRINT("TELEBIT Connect 4800/REL\n");
  265.             sp = 4800;
  266.             break;
  267.  
  268.         case 25:
  269.             PRINT("TELEBIT Connect 9600/REL\n");
  270.             sp = 9600;
  271.             break;
  272.  
  273.         case 61:
  274.             PRINT("TELEBIT Connect FAST/KERM\n");
  275.             sp = 9600;
  276.             break;
  277.  
  278.         case 62:
  279.             PRINT("TELEBIT Connect FAST/XMDM\n");
  280.             sp = 9600;
  281.             break;
  282.  
  283.         case 63:
  284.             PRINT("TELEBIT Connect FAST/UUCP\n");
  285.             sp = 9600;
  286.             break;
  287.  
  288.         case 71:
  289.             PRINT("TELEBIT Connect FAST/KERM/COMP\n");
  290.             sp = 9600;
  291.             break;
  292.  
  293.         case 72:
  294.             PRINT("TELEBIT Connect FAST/XMDM/COMP\n");
  295.             sp = 9600;
  296.             break;
  297.  
  298.         case 73:
  299.             PRINT("TELEBIT Connect FAST/UUCP/COMP\n");
  300.             sp = 9600;
  301.             break;
  302.  
  303.         default: 
  304.             fprintf(stderr,"TELEBIT Unknown response: <%d>\n",result);
  305.             sp = -1;
  306.             break;
  307.         }
  308.  
  309.     } while (sp == 0);
  310.  
  311.     alarm(0);
  312.  
  313.     if (sp < 0) {
  314.             t16_disconnect();
  315.             return 0;
  316.     }
  317.  
  318.  
  319.     ttysetup(speed(sp));
  320.     return 1;
  321. }
  322.  
  323.  
  324. t16_disconnect()
  325. {
  326.     (void) close(FD);
  327. }
  328.  
  329.  
  330. t16_abort()
  331. {
  332.     t16_disconnect();
  333. }
  334.  
  335.  
  336.  
  337. t16expstr(fn,str)
  338. register char *str;
  339. int fn;
  340. {
  341.     char buf[BUFSIZ];
  342.     char *cp;
  343.     char *cp1;
  344.     int i;
  345.     int count;
  346.     int gotit = 0;
  347.     int alarms = 15;
  348.  
  349.     /* while not time outs */
  350.     if (setjmp(Sjbuf))
  351.         goto gotsum;
  352.  
  353.     signal(SIGALRM, alarmtr);
  354.  
  355.     /* read characters */
  356.     cp = buf;
  357. again:
  358.     alarm (3);
  359.     count = read(fn, cp, BUFSIZ);
  360.     VERB (4,"Expect: ..count = %d\r\n",count);
  361.  
  362. gotsum:
  363.     VERB (4,"Expect : gotit = %d\r\n",gotit );
  364.     alarm (0);
  365.     cp += count;
  366.     if (!gotit && findl(str,buf,cp-buf))
  367.     {
  368.         gotit++;
  369.         VERB (4,"Got a match\r\n",0);
  370.         return (1);
  371.     }
  372.  
  373.     if (!alarms--)
  374.     {
  375.         fprintf  (stderr,"Expect: Timeout.\r\n",0);
  376.         return (0);
  377.     }
  378.  
  379.     goto again;
  380. }
  381.  
  382.  
  383. /*
  384. ** findl  - first occurance of pattern in area, returns pointer to
  385. **     character following match in str or null if on fail
  386. **         length specifies length of area.
  387.  */
  388.  
  389. char *findl(pattern,area,len)
  390. char *pattern, *area;
  391. int len;
  392. {
  393.     char *lastmatch, *pat;
  394.     char *ar;
  395.     int i;
  396.  
  397.     VERB (4,"Findl: len = %d\r\n",len);
  398.     VERB (4,"Findl: pattern: %s\r\n",pattern);
  399.     VERB (4,"Findl: area = ",0);
  400.     for (ar = area; ar < (area + len);ar++)
  401.         VERB (4,"%c",*ar);
  402.  
  403.     VERB (4,"\r\n",0);
  404.  
  405.     ar = area;
  406.  
  407.     for (;;)
  408.     {
  409.         /* find first match */
  410.         while((ar < (area + len))  && *ar != *pattern ) ar++;
  411.  
  412.         /*
  413.          * Remember location in area incase match fails and
  414.          * we have to go back.
  415.          */
  416.         lastmatch = ar;
  417.         pat = pattern;
  418.  
  419.         while (*ar == *pat)
  420.         {
  421.             ar++;
  422.             pat++;
  423.             if (!*pat)
  424.                 return (ar); /*found*/
  425.  
  426.             if( ar > (area+len))
  427.                 return ((char *)0);  /* not found*/
  428.         }
  429.         /* no match yet, back up and keep looking */
  430.         pat = pattern;
  431.         ar = lastmatch;
  432.         *ar++;
  433.     }
  434. }
  435.  
  436.  
  437.  
  438.  
  439. /*
  440. ** wait for ack if sync != 0
  441. */
  442. BlatStrings(fd,sp,sync)
  443. int fd;
  444. int sync;
  445. char **sp;
  446. {
  447.     int touts = 0;
  448.     int result;
  449.  
  450.     char *cp;
  451.  
  452.     while(**sp != '\0')
  453.     {
  454.         VERB(4,*sp,0);
  455.         VERB(4,"\n",0);
  456.  
  457.         cp = *sp;
  458.  
  459.         while (*cp) {
  460.             write(fd,cp,1);
  461.             if (*cp == '\r') DELAY(1);
  462.             cp++;
  463.         }
  464.  
  465.         if (!sync)
  466.             return 1;
  467.             
  468.  
  469.         result = t16gotok(fd,3);
  470.  
  471.         if (result == 0) *sp++; 
  472.  
  473.         if (result != 0) {
  474.     
  475.             if (touts++ > 3) 
  476.                 return 0;
  477.         }
  478.  
  479.     }     
  480.  
  481.     return 1;
  482.  
  483. }
  484.  
  485.  
  486. /*
  487. ** t16gotok(fd,pd)
  488. **
  489. ** look for some response from mr. modem. fd is file 
  490. */
  491. t16gotok(fd,pd)
  492. int fd,pd;
  493. {
  494.     char buf[80];
  495.     int i;
  496.  
  497.     if (!pd) pd = 5;
  498.  
  499.     i = 0;
  500.  
  501.        signal(SIGALRM, alarmtr);
  502.  
  503.     while(1) {
  504.  
  505.         if (setjmp(Sjbuf)) {
  506.                 VERB(4,"\r\nt16gotok(): Timeout.\r\n",0);
  507.                 return -1;
  508.         }
  509.  
  510.         alarm(pd);
  511.  
  512.         read(fd,&buf[i],1);
  513.  
  514.         alarm(0);
  515.  
  516.         buf[i] &= 0177;
  517.  
  518.         VERB(4, buf[i] >= 040 ? "%c" : "\\%03o", buf[i]);
  519.  
  520.         if (buf[i] == '\r') {
  521.             VERB(4,"\n",0);
  522.             break;
  523.         }
  524.  
  525.         if (i++ >= 80) break; 
  526.  
  527.     }
  528.  
  529.     /*
  530.     ** check for previous character either numeric of 'K'
  531.     */
  532.  
  533.     if (i >= 2 && buf[i-1] == 'K' && buf[i-2] == 'O') return 0;
  534.  
  535.     if (i >= 2 && buf[i-1] >= '0' && buf[i-1] <= '9' && 
  536.                   buf[i-2] >= '0' && buf[i-2] <= '9') {
  537.  
  538.             buf[i] = '\0';
  539.  
  540.             return atoi(&buf[i-2]);
  541.     }
  542.  
  543.     if (i >= 1 && buf[i-1] >= '0' && buf[i-1] <= '9') return buf[i-1] - 060;
  544.  
  545.  
  546.     return 1;
  547.  
  548. }
  549.  
  550.