Index: fusl/src/time/getdate.c |
diff --git a/fusl/src/time/getdate.c b/fusl/src/time/getdate.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..89f21699125655eb27b1efa780a4e6f7ef0755de |
--- /dev/null |
+++ b/fusl/src/time/getdate.c |
@@ -0,0 +1,45 @@ |
+#include <time.h> |
+#include <pthread.h> |
+#include <errno.h> |
+#include <stdio.h> |
+#include <stdlib.h> |
+ |
+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, "rbe"); |
+ 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; |
+} |