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