summaryrefslogtreecommitdiff
path: root/compat/ctime_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'compat/ctime_r.c')
-rw-r--r--compat/ctime_r.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/compat/ctime_r.c b/compat/ctime_r.c
new file mode 100644
index 000000000000..2594dc17e76f
--- /dev/null
+++ b/compat/ctime_r.c
@@ -0,0 +1,42 @@
+/* taken from ldns 1.6.1 */
+#include "config.h"
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+#include "util/locks.h"
+
+/** the lock for ctime buffer */
+static lock_basic_t ctime_lock;
+/** has it been inited */
+static int ctime_r_init = 0;
+
+/** cleanup ctime_r on exit */
+static void
+ctime_r_cleanup(void)
+{
+ if(ctime_r_init) {
+ ctime_r_init = 0;
+ lock_basic_destroy(&ctime_lock);
+ }
+}
+
+char *ctime_r(const time_t *timep, char *buf)
+{
+ char* result;
+ if(!ctime_r_init) {
+ /* still small race where this init can be done twice,
+ * which is mostly harmless */
+ ctime_r_init = 1;
+ lock_basic_init(&ctime_lock);
+ atexit(&ctime_r_cleanup);
+ }
+ lock_basic_lock(&ctime_lock);
+ result = ctime(timep);
+ if(buf && result) {
+ if(strlen(result) > 10 && result[7]==' ' && result[8]=='0')
+ result[8]=' '; /* fix error in windows ctime */
+ strcpy(buf, result);
+ }
+ lock_basic_unlock(&ctime_lock);
+ return result;
+}