1#include <time.h>
2#include <pthread.h>
3#include <errno.h>
4#include <stdio.h>
5#include <stdlib.h>
6
7int getdate_err;
8
9struct tm *getdate(const char *s)
10{
11	static struct tm tmbuf;
12	struct tm *ret = 0;
13	char *datemsk = getenv("DATEMSK");
14	FILE *f = 0;
15	char fmt[100], *p;
16	int cs;
17
18	pthread_setcancelstate(PTHREAD_CANCEL_DEFERRED, &cs);
19
20	if (!datemsk) {
21		getdate_err = 1;
22		goto out;
23	}
24
25	f = fopen(datemsk, "rbe");
26	if (!f) {
27		if (errno == ENOMEM) getdate_err = 6;
28		else getdate_err = 2;
29		goto out;
30	}
31
32	while (fgets(fmt, sizeof fmt, f)) {
33		p = strptime(s, fmt, &tmbuf);
34		if (p && !*p) {
35			ret = &tmbuf;
36			goto out;
37		}
38	}
39
40	getdate_err = 7;
41out:
42	if (f) fclose(f);
43	pthread_setcancelstate(cs, 0);
44	return ret;
45}
46