• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <time.h>
2 #include <pthread.h>
3 #include <errno.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 
7 int getdate_err;
8 
getdate(const char * s)9 struct 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 	if (ferror(f)) getdate_err = 5;
41 	else getdate_err = 7;
42 out:
43 	if (f) fclose(f);
44 	pthread_setcancelstate(cs, 0);
45 	return ret;
46 }
47