getdate.c 717 B

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