1 /*-
2 * Copyright (c) 1993 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Bill Jolitz.
7 *
8 * %sccs.include.redist.c%
9 */
10
11 #ifndef lint
12 static char sccsid[] = "@(#)con.c 5.2 (Berkeley) 05/29/93";
13 #endif /* not lint */
14
15 #include <sys/types.h>
16 #include <sys/time.h>
17 #include <sys/ioctl.h>
18 #include <stdio.h>
19
20 char string[80] ; char *seq(), *find(), *passuntil() ;
21 fd_set fdset;
22 struct timeval tv_10th = { 0, 100000 } ; /* 1/10th of a second */
23 # define TIMEOUT 600 /* 10ths of a second */
main(argc,argv)24 main (argc, argv) char *argv[]; {
25 int n,m,r,rv; char *cp ;
26
27 fprintf(stderr,"%s\n", argv[1]) ;
28 FD_ZERO(&fdset) ;
29 /* flush out any line noise */
30 seq ("\r", 0) ;
31 sleep (1) ;
32 ioctl (0, TIOCFLUSH, &n) ;
33
34 if (strcmp (argv[1], "drop") == 0) {
35 (void) select(0,0,0,0,&tv_10th);
36 seq("+", 5) ;
37 (void) select(0,0,0,0,&tv_10th);
38 seq("+", 5) ;
39 (void) select(0,0,0,0,&tv_10th);
40 seq("+", 5) ;
41 ioctl (0, TIOCFLUSH, &n) ;
42 (void) select(0,0,0,0,&tv_10th);
43 if(!find("\r\nOK\r\n", 30)) ;
44 ioctl (0, TIOCFLUSH, &n) ;
45 seq("ATH0\r", 5) ;
46 /*if(!find("\r\nOK\r\n", 10)) ;*/
47 cp = passuntil("\n",TIMEOUT);
48 fprintf(stderr, "|%s| ", cp) ;
49 cp = passuntil("\n",TIMEOUT);
50 fprintf(stderr, "|%s| ", cp) ;
51 if (strncmp(cp, "OK", 2) == 0) rv = 0;
52 else rv = 1;
53 } else {
54 system ("stty raw -echo 1200") ;
55 if ((seq ("ATDT", 10) == 0)
56 && (seq (argv[1], 30) == 0) && (seq ("\r", 10) == 0) ) ;
57 else write(2,"Cannot sync with hayes\n", 23) ;
58 /*if(!find("\r\nCONNECT", TIMEOUT))
59 passuntil("\r\n",20);*/
60 cp = passuntil("\n",TIMEOUT);
61 fprintf(stderr, "|%s| ", cp) ;
62 cp = passuntil("\n",TIMEOUT);
63 fprintf(stderr, "|%s| ", cp) ;
64 if (strncmp(cp, "CONNECT", 7) == 0) rv = 0;
65 else rv = 1;
66 fprintf(stderr,"rv = %d\n", rv) ;
67 }
68 write (2, "\r\n", 2) ;
69 return (rv) ;
70 }
71
seq(s,t)72 char *seq (s,t) char *s; {
73 char c; int n;
74
75 do {
76 write (1, s, 1) ;
77 n = 0 ;
78 loop:
79 FD_SET(0,&fdset) ;
80 if (select(1,&fdset,0,0,&tv_10th) > 0) {
81 n = read (0, &c, 1) ;
82 write (2, &c, 1) ;
83 }
84 else if (!t) return ((char *) -1) ;
85 else { t-- ; write (2, "*", 1); goto loop ; }
86 if (n != 1 || c != *s) return (s) ;
87 } while (*++s != '\0') ;
88 return ( (char *) 0) ;
89 }
90
91 char buf2[80];
find(s,n)92 char *find (s, n) char *s; {
93 int m,r; char *sp = buf2;
94
95 m = n ;
96 while (m > 0) {
97 FD_SET(0,&fdset) ;
98 if ((r=select(1,&fdset,0,0,&tv_10th)) > 0) {
99 ioctl (0, FIONREAD, &n) ;
100 read (0, sp, n) ;
101 write (2, sp, n) ;
102 sp += n;
103 } else m-- ;
104 if (strcmp(s, buf2) == 0) return ( (char *) 0) ;
105 }
106 return ( (char *) -1) ;
107 }
108
passuntil(s,n)109 char *passuntil (s, n) char *s; {
110 int m,r; char *sp = buf2;
111
112 m = n ;
113 while (m > 0) {
114 FD_SET(0,&fdset) ;
115 if ((r=select(1,&fdset,0,0,&tv_10th)) > 0) {
116 ioctl (0, FIONREAD, &n) ;
117 n = read (0, sp, n) ;
118 write (2, sp, n) ;
119 sp += n; *sp = '\0' ;
120 do if(index(s,sp[-n])) return (buf2) ; while (--n) ;
121 } else m-- ;
122 }
123 return ( (char *) -1) ;
124 }
125