|
|
1.1 root 1: /*
2: * test expression
3: * [ expression ]
4: */
5:
6: #include <stdio.h>
7: #include <sys/types.h>
8: #include <sys/stat.h>
9: #define EQ(a,b) ((tmp=a)==0?0:(strcmp(tmp,b)==0))
10:
11: int ap;
12: int ac;
13: char **av;
14: char *tmp;
15:
16: main(argc, argv)
17: char *argv[];
18: {
19:
20: ac = argc; av = argv; ap = 1;
21: if(EQ(argv[0],"[")) {
22: if(!EQ(argv[--ac],"]"))
23: synbad("] missing","");
24: }
25: argv[ac] = 0;
26: if (ac<=1) exit(1);
27: exit(exp()?0:1);
28: }
29:
30: char *nxtarg(mt) {
31:
32: if (ap>=ac) {
33: if(mt) {
34: ap++;
35: return(0);
36: }
37: synbad("argument expected","");
38: }
39: return(av[ap++]);
40: }
41:
42: exp() {
43: int p1;
44:
45: p1 = e1();
46: if (EQ(nxtarg(1), "-o")) return(p1 | exp());
47: ap--;
48: return(p1);
49: }
50:
51: e1() {
52: int p1;
53:
54: p1 = e2();
55: if (EQ(nxtarg(1), "-a")) return (p1 & e1());
56: ap--;
57: return(p1);
58: }
59:
60: e2() {
61: if (EQ(nxtarg(0), "!"))
62: return(!e3());
63: ap--;
64: return(e3());
65: }
66:
67: e3() {
68: int p1;
69: register char *a;
70: char *p2;
71: int int1, int2;
72:
73: a=nxtarg(0);
74: if(EQ(a, "(")) {
75: p1 = exp();
76: if(!EQ(nxtarg(0), ")")) synbad(") expected","");
77: return(p1);
78: }
79:
80: if(EQ(a, "-r"))
81: return(tio(nxtarg(0), 4));
82:
83: if(EQ(a, "-w"))
84: return(tio(nxtarg(0), 2));
85:
86: if(EQ(a, "-x"))
87: return(tio(nxtarg(0), 1));
88:
89: if(EQ(a, "-d"))
90: return(ftype(nxtarg(0),S_IFDIR));
91:
92: if(EQ(a, "-c"))
93: return(ftype(nxtarg(0),S_IFCHR));
94:
95: if(EQ(a, "-b"))
96: return(ftype(nxtarg(0),S_IFBLK));
97:
98: if(EQ(a, "-L"))
99: return(islink(nxtarg(0)));
100:
101: if(EQ(a, "-f"))
102: return(ftype(nxtarg(0),S_IFREG));
103:
104: if(EQ(a, "-e"))
105: return(access(nxtarg(0),0) >= 0);
106:
107: if(EQ(a, "-u"))
108: return(ftype(nxtarg(0),S_ISUID));
109:
110: if(EQ(a, "-g"))
111: return(ftype(nxtarg(0),S_ISGID));
112:
113: if(EQ(a, "-s"))
114: return(fsizep(nxtarg(0)));
115:
116: if(EQ(a, "-t"))
117: if(ap>=ac)
118: return(isatty(1));
119: else
120: return(isatty(atoi(nxtarg(0))));
121:
122: if(EQ(a, "-n"))
123: return(!EQ(nxtarg(0), ""));
124: if(EQ(a, "-z"))
125: return(EQ(nxtarg(0), ""));
126: if(EQ(a, "-S"))
127: return(geteuid() == 0);
128:
129: p2 = nxtarg(1);
130: if (p2==0)
131: return(!EQ(a,""));
132: if(EQ(p2, "="))
133: return(EQ(nxtarg(0), a));
134:
135: if(EQ(p2, "!="))
136: return(!EQ(nxtarg(0), a));
137:
138: if(EQ(a, "-l")) {
139: int1=length(p2);
140: p2=nxtarg(0);
141: } else{ int1=atoi(a);
142: }
143: int2 = atoi(nxtarg(0));
144: if(EQ(p2, "-eq"))
145: return(int1==int2);
146: if(EQ(p2, "-ne"))
147: return(int1!=int2);
148: if(EQ(p2, "-gt"))
149: return(int1>int2);
150: if(EQ(p2, "-lt"))
151: return(int1<int2);
152: if(EQ(p2, "-ge"))
153: return(int1>=int2);
154: if(EQ(p2, "-le"))
155: return(int1<=int2);
156:
157: synbad("unknown operator ",p2);
158: }
159:
160: tio(a, f)
161: char *a;
162: int f;
163: {
164:
165: return access (a, f) >= 0;
166: }
167:
168: ftype(f, field)
169: char *f;
170: int field;
171: {
172: struct stat statb;
173:
174: if(stat(f,&statb)<0)
175: return(0);
176: if((statb.st_mode&S_IFMT)==field)
177: return(1);
178: return(0);
179: }
180:
181: islink(f)
182: char *f;
183: {
184: struct stat statb;
185: if(lstat(f,&statb)<0)
186: return 0;
187: return((statb.st_mode&S_IFMT)==S_IFLNK);
188: }
189:
190: fsizep(f)
191: char *f;
192: {
193: struct stat statb;
194: if(stat(f,&statb)<0)
195: return(0);
196: return(statb.st_size>0);
197: }
198:
199: synbad(s1,s2)
200: char *s1, *s2;
201: {
202: int len;
203:
204: write(2, "test: ", 6);
205: if ((len = strlen(s1)) != 0)
206: write(2, s1, len);
207: if ((len = strlen(s2)) != 0)
208: write(2, s2, len);
209: write(2, "\n", 1);
210: exit(255);
211: }
212:
213: length(s)
214: char *s;
215: {
216: char *es=s;
217: while(*es++);
218: return(es-s-1);
219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.