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