#include #include #include #include #include int getdate_err; struct tm *getdate(const char *s) { static struct tm tmbuf; struct tm *ret = 0; char *datemsk = getenv("DATEMSK"); FILE *f = 0; char fmt[100], *p; int cs; pthread_setcancelstate(PTHREAD_CANCEL_DEFERRED, &cs); if (!datemsk) { getdate_err = 1; goto out; } f = fopen(datemsk, "r"); if (!f) { if (errno == ENOMEM) getdate_err = 6; else getdate_err = 2; goto out; } while (fgets(fmt, sizeof fmt, f)) { p = strptime(s, fmt, &tmbuf); if (p && !*p) { ret = &tmbuf; goto out; } } getdate_err = 7; out: if (f) fclose(f); pthread_setcancelstate(cs, 0); return ret; }