ctime_r.c revision 356345
1/* taken from ldns 1.6.1 */
2#include "config.h"
3#ifdef HAVE_TIME_H
4#include <time.h>
5#endif
6#include "util/locks.h"
7
8/** the lock for ctime buffer */
9static lock_basic_type ctime_lock;
10/** has it been inited */
11static int ctime_r_init = 0;
12
13/** cleanup ctime_r on exit */
14static void
15ctime_r_cleanup(void)
16{
17	if(ctime_r_init) {
18		ctime_r_init = 0;
19		lock_basic_destroy(&ctime_lock);
20	}
21}
22
23char *ctime_r(const time_t *timep, char *buf)
24{
25	char* result;
26	if(!ctime_r_init) {
27		/* still small race where this init can be done twice,
28		 * which is mostly harmless */
29		ctime_r_init = 1;
30		lock_basic_init(&ctime_lock);
31		atexit(&ctime_r_cleanup);
32	}
33	lock_basic_lock(&ctime_lock);
34	result = ctime(timep);
35	if(buf && result) {
36		if(strlen(result) > 10 && result[7]==' ' && result[8]=='0')
37			result[8]=' '; /* fix error in windows ctime */
38		strcpy(buf, result);
39	}
40	lock_basic_unlock(&ctime_lock);
41	return result;
42}
43