xref: /plan9/sys/src/cmd/dial/expect.c (revision 0cc39a83e201996cab5ee319ea497ce6109e8d23)
11cea1571SDavid du Colombier #include <u.h>
21cea1571SDavid du Colombier #include <libc.h>
31cea1571SDavid du Colombier 
41cea1571SDavid du Colombier void
usage(void)51cea1571SDavid du Colombier usage(void)
61cea1571SDavid du Colombier {
7*0cc39a83SDavid du Colombier 	fprint(2, "usage: %s [-q] [-t secs] goodstring [badstring ...]\n", argv0);
81cea1571SDavid du Colombier 	exits("usage");
91cea1571SDavid du Colombier }
101cea1571SDavid du Colombier 
111cea1571SDavid du Colombier void
catch(void *,char * s)121cea1571SDavid du Colombier catch(void*, char *s)
131cea1571SDavid du Colombier {
141cea1571SDavid du Colombier 	exits(s);
151cea1571SDavid du Colombier }
161cea1571SDavid du Colombier 
171cea1571SDavid du Colombier int
writewithoutcr(int fd,char * p,int i)181cea1571SDavid du Colombier writewithoutcr(int fd, char *p, int i)
191cea1571SDavid du Colombier {
201cea1571SDavid du Colombier 	char *q, *e;
211cea1571SDavid du Colombier 
221cea1571SDavid du Colombier 	/* dump cr's */
231cea1571SDavid du Colombier 	for(e = p+i; p < e; ){
241cea1571SDavid du Colombier 		q = memchr(p, '\r', e-p);
251cea1571SDavid du Colombier 		if(q == nil)
261cea1571SDavid du Colombier 			break;
271cea1571SDavid du Colombier 		if(q > p)
281cea1571SDavid du Colombier 			if(write(fd, p, q-p) < 0)
291cea1571SDavid du Colombier 				return -1;
301cea1571SDavid du Colombier 		p = q+1;
311cea1571SDavid du Colombier 	}
321cea1571SDavid du Colombier 	if(p < e)
331cea1571SDavid du Colombier 		if(write(fd, p, e-p) < 0)
341cea1571SDavid du Colombier 			return -1;
351cea1571SDavid du Colombier 	return i;
361cea1571SDavid du Colombier }
371cea1571SDavid du Colombier 
381cea1571SDavid du Colombier void
main(int argc,char ** argv)391cea1571SDavid du Colombier main(int argc, char **argv)
401cea1571SDavid du Colombier {
411cea1571SDavid du Colombier 	int timeout = 5*60;
421cea1571SDavid du Colombier 	int quiet = 0;
431cea1571SDavid du Colombier 	int ignorecase = 0;
441cea1571SDavid du Colombier 	int fd, i, m, n, bsize;
451cea1571SDavid du Colombier 	char *good;
461cea1571SDavid du Colombier 	char *buf;
471cea1571SDavid du Colombier 	int sofar;
481cea1571SDavid du Colombier 
491cea1571SDavid du Colombier 	ARGBEGIN {
501cea1571SDavid du Colombier 	case 'i':
511cea1571SDavid du Colombier 		ignorecase = 1;
521cea1571SDavid du Colombier 		break;
531cea1571SDavid du Colombier 	case 't':
541cea1571SDavid du Colombier 		timeout = atoi(EARGF(usage()));
551cea1571SDavid du Colombier 		break;
561cea1571SDavid du Colombier 	case 'q':
571cea1571SDavid du Colombier 		quiet = 1;
581cea1571SDavid du Colombier 		break;
591cea1571SDavid du Colombier 	} ARGEND;
601cea1571SDavid du Colombier 
611cea1571SDavid du Colombier 	if(argc < 1)
621cea1571SDavid du Colombier 		usage();
631cea1571SDavid du Colombier 
641cea1571SDavid du Colombier 	good = argv[0];
651cea1571SDavid du Colombier 	n = strlen(good);
661cea1571SDavid du Colombier 
671cea1571SDavid du Colombier 	for(i = 1; i < argc; i++){
681cea1571SDavid du Colombier 		m = strlen(argv[i]);
691cea1571SDavid du Colombier 		if(m > n)
701cea1571SDavid du Colombier 			n = m;
711cea1571SDavid du Colombier 	}
721cea1571SDavid du Colombier 
731cea1571SDavid du Colombier 	fd = open("/dev/cons", ORDWR);
741cea1571SDavid du Colombier 	if(fd < 0)
751cea1571SDavid du Colombier 		sysfatal("opening /dev/cons: %r");
761cea1571SDavid du Colombier 
771cea1571SDavid du Colombier 	bsize = n+4096;
781cea1571SDavid du Colombier 	buf = malloc(bsize+1);
791cea1571SDavid du Colombier 
801cea1571SDavid du Colombier 	sofar = 0;
811cea1571SDavid du Colombier 	alarm(timeout*1000);
821cea1571SDavid du Colombier 	for(;;){
831cea1571SDavid du Colombier 		if(sofar > n){
841cea1571SDavid du Colombier 			memmove(buf, &buf[sofar-n], n);
851cea1571SDavid du Colombier 			sofar = n;
861cea1571SDavid du Colombier 		}
871cea1571SDavid du Colombier 		i = read(0, buf+sofar, bsize);
881cea1571SDavid du Colombier 		if(i <= 0)
891cea1571SDavid du Colombier 			exits("EOF");
901cea1571SDavid du Colombier 		if(!quiet)
911cea1571SDavid du Colombier 			writewithoutcr(fd, buf+sofar, i);
921cea1571SDavid du Colombier 		sofar += i;
931cea1571SDavid du Colombier 		buf[sofar] = 0;
941cea1571SDavid du Colombier 		if(ignorecase){
951cea1571SDavid du Colombier 			if(cistrstr(buf, good))
961cea1571SDavid du Colombier 				break;
971cea1571SDavid du Colombier 			for(i = 1; i < argc; i++)
981cea1571SDavid du Colombier 				if(cistrstr(buf, argv[i]))
991cea1571SDavid du Colombier 					exits(argv[i]);
1001cea1571SDavid du Colombier 		} else {
1011cea1571SDavid du Colombier 			if(strstr(buf, good))
1021cea1571SDavid du Colombier 				break;
1031cea1571SDavid du Colombier 			for(i = 1; i < argc; i++)
1041cea1571SDavid du Colombier 				if(strstr(buf, argv[i]))
1051cea1571SDavid du Colombier 					exits(argv[i]);
1061cea1571SDavid du Colombier 		}
1071cea1571SDavid du Colombier 	}
1081cea1571SDavid du Colombier 
1091cea1571SDavid du Colombier 	exits(0);
1101cea1571SDavid du Colombier }
111