Blame


1 bc7cb1a1 2003-11-23 devnull /*
2 bc7cb1a1 2003-11-23 devnull * POSIX standard
3 bc7cb1a1 2003-11-23 devnull * test expression
4 bc7cb1a1 2003-11-23 devnull * [ expression ]
5 bc7cb1a1 2003-11-23 devnull *
6 bc7cb1a1 2003-11-23 devnull * Plan 9 additions:
7 bc7cb1a1 2003-11-23 devnull * -A file exists and is append-only
8 bc7cb1a1 2003-11-23 devnull * -L file exists and is exclusive-use
9 e1ad38bf 2007-05-19 devnull * -T file exists and is temporary
10 bc7cb1a1 2003-11-23 devnull */
11 bc7cb1a1 2003-11-23 devnull
12 bc7cb1a1 2003-11-23 devnull #include <u.h>
13 bc7cb1a1 2003-11-23 devnull #include <libc.h>
14 f9888587 2007-05-21 devnull
15 f9888587 2007-05-21 devnull #define isatty plan9_isatty
16 e1ad38bf 2007-05-19 devnull
17 bc7cb1a1 2003-11-23 devnull #define EQ(a,b) ((tmp=a)==0?0:(strcmp(tmp,b)==0))
18 bc7cb1a1 2003-11-23 devnull
19 bc7cb1a1 2003-11-23 devnull int ap;
20 bc7cb1a1 2003-11-23 devnull int ac;
21 bc7cb1a1 2003-11-23 devnull char **av;
22 bc7cb1a1 2003-11-23 devnull char *tmp;
23 bc7cb1a1 2003-11-23 devnull
24 bc7cb1a1 2003-11-23 devnull void synbad(char *, char *);
25 bc7cb1a1 2003-11-23 devnull int fsizep(char *);
26 bc7cb1a1 2003-11-23 devnull int isdir(char *);
27 bc7cb1a1 2003-11-23 devnull int isreg(char *);
28 e1ad38bf 2007-05-19 devnull int isatty(int);
29 bc7cb1a1 2003-11-23 devnull int isint(char *, int *);
30 e1ad38bf 2007-05-19 devnull int isolder(char *, char *);
31 e1ad38bf 2007-05-19 devnull int isolderthan(char *, char *);
32 e1ad38bf 2007-05-19 devnull int isnewerthan(char *, char *);
33 bc7cb1a1 2003-11-23 devnull int hasmode(char *, ulong);
34 bc7cb1a1 2003-11-23 devnull int tio(char *, int);
35 bc7cb1a1 2003-11-23 devnull int e(void), e1(void), e2(void), e3(void);
36 e1ad38bf 2007-05-19 devnull char *nxtarg(int);
37 bc7cb1a1 2003-11-23 devnull
38 bc7cb1a1 2003-11-23 devnull void
39 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
40 bc7cb1a1 2003-11-23 devnull {
41 e1ad38bf 2007-05-19 devnull int r;
42 e1ad38bf 2007-05-19 devnull char *c;
43 bc7cb1a1 2003-11-23 devnull
44 bc7cb1a1 2003-11-23 devnull ac = argc; av = argv; ap = 1;
45 bc7cb1a1 2003-11-23 devnull if(EQ(argv[0],"[")) {
46 bc7cb1a1 2003-11-23 devnull if(!EQ(argv[--ac],"]"))
47 bc7cb1a1 2003-11-23 devnull synbad("] missing","");
48 bc7cb1a1 2003-11-23 devnull }
49 bc7cb1a1 2003-11-23 devnull argv[ac] = 0;
50 e1ad38bf 2007-05-19 devnull if (ac<=1)
51 e1ad38bf 2007-05-19 devnull exits("usage");
52 e1ad38bf 2007-05-19 devnull r = e();
53 e1ad38bf 2007-05-19 devnull /*
54 e1ad38bf 2007-05-19 devnull * nice idea but short-circuit -o and -a operators may have
55 e1ad38bf 2007-05-19 devnull * not consumed their right-hand sides.
56 e1ad38bf 2007-05-19 devnull */
57 e1ad38bf 2007-05-19 devnull if(0 && (c = nxtarg(1)) != nil)
58 e1ad38bf 2007-05-19 devnull synbad("unexpected operator/operand: ", c);
59 e1ad38bf 2007-05-19 devnull exits(r?0:"false");
60 bc7cb1a1 2003-11-23 devnull }
61 bc7cb1a1 2003-11-23 devnull
62 bc7cb1a1 2003-11-23 devnull char *
63 bc7cb1a1 2003-11-23 devnull nxtarg(int mt)
64 bc7cb1a1 2003-11-23 devnull {
65 bc7cb1a1 2003-11-23 devnull if(ap>=ac){
66 bc7cb1a1 2003-11-23 devnull if(mt){
67 bc7cb1a1 2003-11-23 devnull ap++;
68 bc7cb1a1 2003-11-23 devnull return(0);
69 bc7cb1a1 2003-11-23 devnull }
70 bc7cb1a1 2003-11-23 devnull synbad("argument expected","");
71 bc7cb1a1 2003-11-23 devnull }
72 bc7cb1a1 2003-11-23 devnull return(av[ap++]);
73 bc7cb1a1 2003-11-23 devnull }
74 bc7cb1a1 2003-11-23 devnull
75 bc7cb1a1 2003-11-23 devnull int
76 bc7cb1a1 2003-11-23 devnull nxtintarg(int *pans)
77 bc7cb1a1 2003-11-23 devnull {
78 bc7cb1a1 2003-11-23 devnull if(ap<ac && isint(av[ap], pans)){
79 bc7cb1a1 2003-11-23 devnull ap++;
80 bc7cb1a1 2003-11-23 devnull return 1;
81 bc7cb1a1 2003-11-23 devnull }
82 bc7cb1a1 2003-11-23 devnull return 0;
83 bc7cb1a1 2003-11-23 devnull }
84 bc7cb1a1 2003-11-23 devnull
85 bc7cb1a1 2003-11-23 devnull int
86 e1ad38bf 2007-05-19 devnull e(void)
87 e1ad38bf 2007-05-19 devnull {
88 bc7cb1a1 2003-11-23 devnull int p1;
89 bc7cb1a1 2003-11-23 devnull
90 bc7cb1a1 2003-11-23 devnull p1 = e1();
91 e1ad38bf 2007-05-19 devnull if (EQ(nxtarg(1), "-o"))
92 e1ad38bf 2007-05-19 devnull return(p1 || e());
93 bc7cb1a1 2003-11-23 devnull ap--;
94 bc7cb1a1 2003-11-23 devnull return(p1);
95 bc7cb1a1 2003-11-23 devnull }
96 bc7cb1a1 2003-11-23 devnull
97 bc7cb1a1 2003-11-23 devnull int
98 e1ad38bf 2007-05-19 devnull e1(void)
99 e1ad38bf 2007-05-19 devnull {
100 bc7cb1a1 2003-11-23 devnull int p1;
101 bc7cb1a1 2003-11-23 devnull
102 bc7cb1a1 2003-11-23 devnull p1 = e2();
103 e1ad38bf 2007-05-19 devnull if (EQ(nxtarg(1), "-a"))
104 e1ad38bf 2007-05-19 devnull return (p1 && e1());
105 bc7cb1a1 2003-11-23 devnull ap--;
106 bc7cb1a1 2003-11-23 devnull return(p1);
107 bc7cb1a1 2003-11-23 devnull }
108 bc7cb1a1 2003-11-23 devnull
109 bc7cb1a1 2003-11-23 devnull int
110 e1ad38bf 2007-05-19 devnull e2(void)
111 e1ad38bf 2007-05-19 devnull {
112 bc7cb1a1 2003-11-23 devnull if (EQ(nxtarg(0), "!"))
113 bc7cb1a1 2003-11-23 devnull return(!e2());
114 bc7cb1a1 2003-11-23 devnull ap--;
115 bc7cb1a1 2003-11-23 devnull return(e3());
116 bc7cb1a1 2003-11-23 devnull }
117 bc7cb1a1 2003-11-23 devnull
118 bc7cb1a1 2003-11-23 devnull int
119 e1ad38bf 2007-05-19 devnull e3(void)
120 e1ad38bf 2007-05-19 devnull {
121 e1ad38bf 2007-05-19 devnull int p1, int1, int2;
122 e1ad38bf 2007-05-19 devnull char *a, *p2;
123 bc7cb1a1 2003-11-23 devnull
124 bc7cb1a1 2003-11-23 devnull a = nxtarg(0);
125 bc7cb1a1 2003-11-23 devnull if(EQ(a, "(")) {
126 bc7cb1a1 2003-11-23 devnull p1 = e();
127 e1ad38bf 2007-05-19 devnull if(!EQ(nxtarg(0), ")"))
128 e1ad38bf 2007-05-19 devnull synbad(") expected","");
129 bc7cb1a1 2003-11-23 devnull return(p1);
130 bc7cb1a1 2003-11-23 devnull }
131 bc7cb1a1 2003-11-23 devnull
132 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-A"))
133 bc7cb1a1 2003-11-23 devnull return(hasmode(nxtarg(0), DMAPPEND));
134 bc7cb1a1 2003-11-23 devnull
135 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-L"))
136 bc7cb1a1 2003-11-23 devnull return(hasmode(nxtarg(0), DMEXCL));
137 bc7cb1a1 2003-11-23 devnull
138 e1ad38bf 2007-05-19 devnull if(EQ(a, "-T"))
139 e1ad38bf 2007-05-19 devnull return(hasmode(nxtarg(0), DMTMP));
140 e1ad38bf 2007-05-19 devnull
141 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-f"))
142 bc7cb1a1 2003-11-23 devnull return(isreg(nxtarg(0)));
143 bc7cb1a1 2003-11-23 devnull
144 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-d"))
145 bc7cb1a1 2003-11-23 devnull return(isdir(nxtarg(0)));
146 bc7cb1a1 2003-11-23 devnull
147 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-r"))
148 bc7cb1a1 2003-11-23 devnull return(tio(nxtarg(0), 4));
149 bc7cb1a1 2003-11-23 devnull
150 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-w"))
151 bc7cb1a1 2003-11-23 devnull return(tio(nxtarg(0), 2));
152 bc7cb1a1 2003-11-23 devnull
153 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-x"))
154 bc7cb1a1 2003-11-23 devnull return(tio(nxtarg(0), 1));
155 bc7cb1a1 2003-11-23 devnull
156 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-e"))
157 bc7cb1a1 2003-11-23 devnull return(tio(nxtarg(0), 0));
158 bc7cb1a1 2003-11-23 devnull
159 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-c"))
160 bc7cb1a1 2003-11-23 devnull return(0);
161 bc7cb1a1 2003-11-23 devnull
162 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-b"))
163 bc7cb1a1 2003-11-23 devnull return(0);
164 bc7cb1a1 2003-11-23 devnull
165 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-u"))
166 bc7cb1a1 2003-11-23 devnull return(0);
167 bc7cb1a1 2003-11-23 devnull
168 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-g"))
169 bc7cb1a1 2003-11-23 devnull return(0);
170 bc7cb1a1 2003-11-23 devnull
171 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-s"))
172 bc7cb1a1 2003-11-23 devnull return(fsizep(nxtarg(0)));
173 bc7cb1a1 2003-11-23 devnull
174 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-t"))
175 e1ad38bf 2007-05-19 devnull if(ap>=ac)
176 bc7cb1a1 2003-11-23 devnull return(isatty(1));
177 e1ad38bf 2007-05-19 devnull else if(nxtintarg(&int1))
178 bc7cb1a1 2003-11-23 devnull return(isatty(int1));
179 e1ad38bf 2007-05-19 devnull else
180 e1ad38bf 2007-05-19 devnull synbad("not a valid file descriptor number ", "");
181 bc7cb1a1 2003-11-23 devnull
182 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-n"))
183 bc7cb1a1 2003-11-23 devnull return(!EQ(nxtarg(0), ""));
184 bc7cb1a1 2003-11-23 devnull if(EQ(a, "-z"))
185 bc7cb1a1 2003-11-23 devnull return(EQ(nxtarg(0), ""));
186 bc7cb1a1 2003-11-23 devnull
187 bc7cb1a1 2003-11-23 devnull p2 = nxtarg(1);
188 bc7cb1a1 2003-11-23 devnull if (p2==0)
189 bc7cb1a1 2003-11-23 devnull return(!EQ(a,""));
190 bc7cb1a1 2003-11-23 devnull if(EQ(p2, "="))
191 bc7cb1a1 2003-11-23 devnull return(EQ(nxtarg(0), a));
192 bc7cb1a1 2003-11-23 devnull
193 bc7cb1a1 2003-11-23 devnull if(EQ(p2, "!="))
194 bc7cb1a1 2003-11-23 devnull return(!EQ(nxtarg(0), a));
195 bc7cb1a1 2003-11-23 devnull
196 e1ad38bf 2007-05-19 devnull if(EQ(p2, "-older"))
197 e1ad38bf 2007-05-19 devnull return(isolder(nxtarg(0), a));
198 e1ad38bf 2007-05-19 devnull
199 e1ad38bf 2007-05-19 devnull if(EQ(p2, "-ot"))
200 e1ad38bf 2007-05-19 devnull return(isolderthan(nxtarg(0), a));
201 e1ad38bf 2007-05-19 devnull
202 e1ad38bf 2007-05-19 devnull if(EQ(p2, "-nt"))
203 e1ad38bf 2007-05-19 devnull return(isnewerthan(nxtarg(0), a));
204 e1ad38bf 2007-05-19 devnull
205 bc7cb1a1 2003-11-23 devnull if(!isint(a, &int1))
206 e1ad38bf 2007-05-19 devnull synbad("unexpected operator/operand: ", p2);
207 bc7cb1a1 2003-11-23 devnull
208 bc7cb1a1 2003-11-23 devnull if(nxtintarg(&int2)){
209 bc7cb1a1 2003-11-23 devnull if(EQ(p2, "-eq"))
210 bc7cb1a1 2003-11-23 devnull return(int1==int2);
211 bc7cb1a1 2003-11-23 devnull if(EQ(p2, "-ne"))
212 bc7cb1a1 2003-11-23 devnull return(int1!=int2);
213 bc7cb1a1 2003-11-23 devnull if(EQ(p2, "-gt"))
214 bc7cb1a1 2003-11-23 devnull return(int1>int2);
215 bc7cb1a1 2003-11-23 devnull if(EQ(p2, "-lt"))
216 bc7cb1a1 2003-11-23 devnull return(int1<int2);
217 bc7cb1a1 2003-11-23 devnull if(EQ(p2, "-ge"))
218 bc7cb1a1 2003-11-23 devnull return(int1>=int2);
219 bc7cb1a1 2003-11-23 devnull if(EQ(p2, "-le"))
220 bc7cb1a1 2003-11-23 devnull return(int1<=int2);
221 bc7cb1a1 2003-11-23 devnull }
222 bc7cb1a1 2003-11-23 devnull
223 bc7cb1a1 2003-11-23 devnull synbad("unknown operator ",p2);
224 bc7cb1a1 2003-11-23 devnull return 0; /* to shut ken up */
225 bc7cb1a1 2003-11-23 devnull }
226 bc7cb1a1 2003-11-23 devnull
227 bc7cb1a1 2003-11-23 devnull int
228 bc7cb1a1 2003-11-23 devnull tio(char *a, int f)
229 bc7cb1a1 2003-11-23 devnull {
230 bc7cb1a1 2003-11-23 devnull return access (a, f) >= 0;
231 bc7cb1a1 2003-11-23 devnull }
232 bc7cb1a1 2003-11-23 devnull
233 f6d2cbfe 2011-08-16 rsc /*
234 f6d2cbfe 2011-08-16 rsc * note that the name strings pointed to by Dir members are
235 f6d2cbfe 2011-08-16 rsc * allocated with the Dir itself (by the same call to malloc),
236 f6d2cbfe 2011-08-16 rsc * but are not included in sizeof(Dir), so copying a Dir won't
237 f6d2cbfe 2011-08-16 rsc * copy the strings it points to.
238 f6d2cbfe 2011-08-16 rsc */
239 bc7cb1a1 2003-11-23 devnull
240 bc7cb1a1 2003-11-23 devnull int
241 bc7cb1a1 2003-11-23 devnull hasmode(char *f, ulong m)
242 bc7cb1a1 2003-11-23 devnull {
243 f6d2cbfe 2011-08-16 rsc int r;
244 f6d2cbfe 2011-08-16 rsc Dir *dir;
245 bc7cb1a1 2003-11-23 devnull
246 f6d2cbfe 2011-08-16 rsc dir = dirstat(f);
247 f6d2cbfe 2011-08-16 rsc if (dir == nil)
248 f6d2cbfe 2011-08-16 rsc return 0;
249 f6d2cbfe 2011-08-16 rsc r = (dir->mode & m) != 0;
250 f6d2cbfe 2011-08-16 rsc free(dir);
251 f6d2cbfe 2011-08-16 rsc return r;
252 bc7cb1a1 2003-11-23 devnull }
253 bc7cb1a1 2003-11-23 devnull
254 bc7cb1a1 2003-11-23 devnull int
255 bc7cb1a1 2003-11-23 devnull isdir(char *f)
256 bc7cb1a1 2003-11-23 devnull {
257 f6d2cbfe 2011-08-16 rsc return hasmode(f, DMDIR);
258 bc7cb1a1 2003-11-23 devnull }
259 bc7cb1a1 2003-11-23 devnull
260 bc7cb1a1 2003-11-23 devnull int
261 bc7cb1a1 2003-11-23 devnull isreg(char *f)
262 bc7cb1a1 2003-11-23 devnull {
263 f6d2cbfe 2011-08-16 rsc int r;
264 f6d2cbfe 2011-08-16 rsc Dir *dir;
265 bc7cb1a1 2003-11-23 devnull
266 f6d2cbfe 2011-08-16 rsc dir = dirstat(f);
267 f6d2cbfe 2011-08-16 rsc if (dir == nil)
268 f6d2cbfe 2011-08-16 rsc return 0;
269 f6d2cbfe 2011-08-16 rsc r = (dir->mode & DMDIR) == 0;
270 f6d2cbfe 2011-08-16 rsc free(dir);
271 f6d2cbfe 2011-08-16 rsc return r;
272 bc7cb1a1 2003-11-23 devnull }
273 bc7cb1a1 2003-11-23 devnull
274 bc7cb1a1 2003-11-23 devnull int
275 e1ad38bf 2007-05-19 devnull isatty(int fd)
276 e1ad38bf 2007-05-19 devnull {
277 f6d2cbfe 2011-08-16 rsc int r;
278 f6d2cbfe 2011-08-16 rsc Dir *d1, *d2;
279 e1ad38bf 2007-05-19 devnull
280 f6d2cbfe 2011-08-16 rsc d1 = dirfstat(fd);
281 f6d2cbfe 2011-08-16 rsc d2 = dirstat("/dev/cons");
282 f6d2cbfe 2011-08-16 rsc if (d1 == nil || d2 == nil)
283 f6d2cbfe 2011-08-16 rsc r = 0;
284 f6d2cbfe 2011-08-16 rsc else
285 f6d2cbfe 2011-08-16 rsc r = d1->type == d2->type && d1->dev == d2->dev &&
286 f6d2cbfe 2011-08-16 rsc d1->qid.path == d2->qid.path;
287 f6d2cbfe 2011-08-16 rsc free(d1);
288 f6d2cbfe 2011-08-16 rsc free(d2);
289 f6d2cbfe 2011-08-16 rsc return r;
290 e1ad38bf 2007-05-19 devnull }
291 e1ad38bf 2007-05-19 devnull
292 e1ad38bf 2007-05-19 devnull int
293 bc7cb1a1 2003-11-23 devnull fsizep(char *f)
294 bc7cb1a1 2003-11-23 devnull {
295 f6d2cbfe 2011-08-16 rsc int r;
296 f6d2cbfe 2011-08-16 rsc Dir *dir;
297 bc7cb1a1 2003-11-23 devnull
298 f6d2cbfe 2011-08-16 rsc dir = dirstat(f);
299 f6d2cbfe 2011-08-16 rsc if (dir == nil)
300 f6d2cbfe 2011-08-16 rsc return 0;
301 f6d2cbfe 2011-08-16 rsc r = dir->length > 0;
302 f6d2cbfe 2011-08-16 rsc free(dir);
303 f6d2cbfe 2011-08-16 rsc return r;
304 bc7cb1a1 2003-11-23 devnull }
305 bc7cb1a1 2003-11-23 devnull
306 bc7cb1a1 2003-11-23 devnull void
307 bc7cb1a1 2003-11-23 devnull synbad(char *s1, char *s2)
308 bc7cb1a1 2003-11-23 devnull {
309 bc7cb1a1 2003-11-23 devnull int len;
310 bc7cb1a1 2003-11-23 devnull
311 bc7cb1a1 2003-11-23 devnull write(2, "test: ", 6);
312 bc7cb1a1 2003-11-23 devnull if ((len = strlen(s1)) != 0)
313 bc7cb1a1 2003-11-23 devnull write(2, s1, len);
314 bc7cb1a1 2003-11-23 devnull if ((len = strlen(s2)) != 0)
315 bc7cb1a1 2003-11-23 devnull write(2, s2, len);
316 bc7cb1a1 2003-11-23 devnull write(2, "\n", 1);
317 bc7cb1a1 2003-11-23 devnull exits("bad syntax");
318 bc7cb1a1 2003-11-23 devnull }
319 bc7cb1a1 2003-11-23 devnull
320 bc7cb1a1 2003-11-23 devnull int
321 bc7cb1a1 2003-11-23 devnull isint(char *s, int *pans)
322 bc7cb1a1 2003-11-23 devnull {
323 bc7cb1a1 2003-11-23 devnull char *ep;
324 bc7cb1a1 2003-11-23 devnull
325 bc7cb1a1 2003-11-23 devnull *pans = strtol(s, &ep, 0);
326 bc7cb1a1 2003-11-23 devnull return (*ep == 0);
327 bc7cb1a1 2003-11-23 devnull }
328 e1ad38bf 2007-05-19 devnull
329 e1ad38bf 2007-05-19 devnull int
330 e1ad38bf 2007-05-19 devnull isolder(char *pin, char *f)
331 e1ad38bf 2007-05-19 devnull {
332 f6d2cbfe 2011-08-16 rsc int r;
333 e1ad38bf 2007-05-19 devnull ulong n, m;
334 f6d2cbfe 2011-08-16 rsc char *p = pin;
335 f6d2cbfe 2011-08-16 rsc Dir *dir;
336 e1ad38bf 2007-05-19 devnull
337 f6d2cbfe 2011-08-16 rsc dir = dirstat(f);
338 f6d2cbfe 2011-08-16 rsc if (dir == nil)
339 f6d2cbfe 2011-08-16 rsc return 0;
340 e1ad38bf 2007-05-19 devnull
341 e1ad38bf 2007-05-19 devnull /* parse time */
342 e1ad38bf 2007-05-19 devnull n = 0;
343 e1ad38bf 2007-05-19 devnull while(*p){
344 e1ad38bf 2007-05-19 devnull m = strtoul(p, &p, 0);
345 e1ad38bf 2007-05-19 devnull switch(*p){
346 e1ad38bf 2007-05-19 devnull case 0:
347 e1ad38bf 2007-05-19 devnull n = m;
348 e1ad38bf 2007-05-19 devnull break;
349 e1ad38bf 2007-05-19 devnull case 'y':
350 e1ad38bf 2007-05-19 devnull m *= 12;
351 e1ad38bf 2007-05-19 devnull /* fall through */
352 e1ad38bf 2007-05-19 devnull case 'M':
353 e1ad38bf 2007-05-19 devnull m *= 30;
354 e1ad38bf 2007-05-19 devnull /* fall through */
355 e1ad38bf 2007-05-19 devnull case 'd':
356 e1ad38bf 2007-05-19 devnull m *= 24;
357 e1ad38bf 2007-05-19 devnull /* fall through */
358 e1ad38bf 2007-05-19 devnull case 'h':
359 e1ad38bf 2007-05-19 devnull m *= 60;
360 e1ad38bf 2007-05-19 devnull /* fall through */
361 e1ad38bf 2007-05-19 devnull case 'm':
362 e1ad38bf 2007-05-19 devnull m *= 60;
363 e1ad38bf 2007-05-19 devnull /* fall through */
364 e1ad38bf 2007-05-19 devnull case 's':
365 e1ad38bf 2007-05-19 devnull n += m;
366 e1ad38bf 2007-05-19 devnull p++;
367 e1ad38bf 2007-05-19 devnull break;
368 e1ad38bf 2007-05-19 devnull default:
369 e1ad38bf 2007-05-19 devnull synbad("bad time syntax, ", pin);
370 e1ad38bf 2007-05-19 devnull }
371 e1ad38bf 2007-05-19 devnull }
372 e1ad38bf 2007-05-19 devnull
373 f6d2cbfe 2011-08-16 rsc r = dir->mtime + n < time(0);
374 f6d2cbfe 2011-08-16 rsc free(dir);
375 f6d2cbfe 2011-08-16 rsc return r;
376 e1ad38bf 2007-05-19 devnull }
377 e1ad38bf 2007-05-19 devnull
378 e1ad38bf 2007-05-19 devnull int
379 e1ad38bf 2007-05-19 devnull isolderthan(char *a, char *b)
380 e1ad38bf 2007-05-19 devnull {
381 f6d2cbfe 2011-08-16 rsc int r;
382 f6d2cbfe 2011-08-16 rsc Dir *ad, *bd;
383 e1ad38bf 2007-05-19 devnull
384 f6d2cbfe 2011-08-16 rsc ad = dirstat(a);
385 f6d2cbfe 2011-08-16 rsc bd = dirstat(b);
386 f6d2cbfe 2011-08-16 rsc if (ad == nil || bd == nil)
387 f6d2cbfe 2011-08-16 rsc r = 0;
388 f6d2cbfe 2011-08-16 rsc else
389 f6d2cbfe 2011-08-16 rsc r = ad->mtime > bd->mtime;
390 f6d2cbfe 2011-08-16 rsc free(ad);
391 f6d2cbfe 2011-08-16 rsc free(bd);
392 f6d2cbfe 2011-08-16 rsc return r;
393 e1ad38bf 2007-05-19 devnull }
394 e1ad38bf 2007-05-19 devnull
395 e1ad38bf 2007-05-19 devnull int
396 e1ad38bf 2007-05-19 devnull isnewerthan(char *a, char *b)
397 e1ad38bf 2007-05-19 devnull {
398 f6d2cbfe 2011-08-16 rsc int r;
399 f6d2cbfe 2011-08-16 rsc Dir *ad, *bd;
400 e1ad38bf 2007-05-19 devnull
401 f6d2cbfe 2011-08-16 rsc ad = dirstat(a);
402 f6d2cbfe 2011-08-16 rsc bd = dirstat(b);
403 f6d2cbfe 2011-08-16 rsc if (ad == nil || bd == nil)
404 f6d2cbfe 2011-08-16 rsc r = 0;
405 f6d2cbfe 2011-08-16 rsc else
406 f6d2cbfe 2011-08-16 rsc r = ad->mtime < bd->mtime;
407 f6d2cbfe 2011-08-16 rsc free(ad);
408 f6d2cbfe 2011-08-16 rsc free(bd);
409 f6d2cbfe 2011-08-16 rsc return r;
410 e1ad38bf 2007-05-19 devnull }