Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
 
4
void
5
usage(void)
6
{
7
	fprint(2, "usage: %s [-q] [-t secs] goodstring [badstring ...]\n", argv0);
8
	exits("usage");
9
}
10
 
11
void
12
catch(void*, char *s)
13
{
14
	exits(s);
15
}
16
 
17
int
18
writewithoutcr(int fd, char *p, int i)
19
{
20
	char *q, *e;
21
 
22
	/* dump cr's */
23
	for(e = p+i; p < e; ){
24
		q = memchr(p, '\r', e-p);
25
		if(q == nil)
26
			break;
27
		if(q > p)
28
			if(write(fd, p, q-p) < 0)
29
				return -1;
30
		p = q+1;
31
	}
32
	if(p < e)
33
		if(write(fd, p, e-p) < 0)
34
			return -1;
35
	return i;
36
}
37
 
38
void
39
main(int argc, char **argv)
40
{
41
	int timeout = 5*60;
42
	int quiet = 0;
43
	int ignorecase = 0;
44
	int fd, i, m, n, bsize;
45
	char *good;
46
	char *buf;
47
	int sofar;
48
 
49
	ARGBEGIN {
50
	case 'i':
51
		ignorecase = 1;
52
		break;
53
	case 't':
54
		timeout = atoi(EARGF(usage()));
55
		break;
56
	case 'q':
57
		quiet = 1;
58
		break;
59
	} ARGEND;
60
 
61
	if(argc < 1)
62
		usage();
63
 
64
	good = argv[0];
65
	n = strlen(good);
66
 
67
	for(i = 1; i < argc; i++){
68
		m = strlen(argv[i]);
69
		if(m > n)
70
			n = m;
71
	}
72
 
73
	fd = open("/dev/cons", ORDWR);
74
	if(fd < 0)
75
		sysfatal("opening /dev/cons: %r");
76
 
77
	bsize = n+4096;
78
	buf = malloc(bsize+1);
79
 
80
	sofar = 0;
81
	alarm(timeout*1000);
82
	for(;;){
83
		if(sofar > n){
84
			memmove(buf, &buf[sofar-n], n);
85
			sofar = n;
86
		}
87
		i = read(0, buf+sofar, bsize);
88
		if(i <= 0)
89
			exits("EOF");
90
		if(!quiet)
91
			writewithoutcr(fd, buf+sofar, i);
92
		sofar += i;
93
		buf[sofar] = 0;
94
		if(ignorecase){
95
			if(cistrstr(buf, good))
96
				break;
97
			for(i = 1; i < argc; i++)
98
				if(cistrstr(buf, argv[i]))
99
					exits(argv[i]);
100
		} else {
101
			if(strstr(buf, good))
102
				break;
103
			for(i = 1; i < argc; i++)
104
				if(strstr(buf, argv[i]))
105
					exits(argv[i]);
106
		}
107
	}
108
 
109
	exits(0);
110
}