b2248288eaaf28a601a9ad79fe5dd101f5f6a7ac
[gnupg.git] / jnlib / mischelp.c
1 /* mischelp.c - Miscellaneous helper functions
2  * Copyright (C) 1998, 2000, 2001, 2006 Free Software Foundation, Inc.
3  *
4  * This file is part of JNLIB.
5  *
6  * JNLIB is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 3 of
9  * the License, or (at your option) any later version.
10  *
11  * JNLIB is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <time.h>
24
25 #include "libjnlib-config.h"
26 #include "mischelp.h"
27
28 /* A dummy function to prevent an empty compilation unit.  Some
29    compilers bail out in this case. */
30 time_t
31 libjnlib_dummy_mischelp_func (void)
32 {
33   return time (NULL);
34 }
35
36
37 /*
38   timegm() is a GNU function that might not be available everywhere.
39   It's basically the inverse of gmtime() - you give it a struct tm,
40   and get back a time_t.  It differs from mktime() in that it handles
41   the case where the struct tm is UTC and the local environment isn't.
42
43   Note, that this replacement implementaion is not thread-safe!
44
45   Some BSDs don't handle the putenv("foo") case properly, so we use
46   unsetenv if the platform has it to remove environment variables.
47 */
48 #ifndef HAVE_TIMEGM
49 time_t
50 timegm (struct tm *tm)
51 {
52   time_t answer;
53   char *zone;
54
55   zone=getenv("TZ");
56   putenv("TZ=UTC");
57   tzset();
58   answer=mktime(tm);
59   if(zone)
60     {
61       static char *old_zone;
62
63       if (!old_zone)
64         {
65           old_zone = malloc(3+strlen(zone)+1);
66           if (old_zone)
67             {
68               strcpy(old_zone,"TZ=");
69               strcat(old_zone,zone);
70             }
71         }
72       if (old_zone)
73         putenv (old_zone);      
74     }
75   else
76 #ifdef HAVE_UNSETENV
77     unsetenv("TZ");
78 #else
79     putenv("TZ");
80 #endif
81
82   tzset();
83   return answer;
84 }
85 #endif /*!HAVE_TIMEGM*/
86