xref: /original-bsd/contrib/connectd/cd/con.c (revision 77e11d34)
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 */
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 
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];
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 
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