Pth tweaks and improved estream.c
[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 2.1 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, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19  * 02110-1301, USA.
20  */
21
22 #include <config.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <time.h>
26
27 #include "libjnlib-config.h"
28 #include "mischelp.h"
29
30 /* A dummy function to prevent an empty compilation unit.  Some
31    compilers bail out in this case. */
32 time_t
33 libjnlib_dummy_mischelp_func (void)
34 {
35   return time (NULL);
36 }
37
38
39 /*
40   timegm() is a GNU function that might not be available everywhere.
41   It's basically the inverse of gmtime() - you give it a struct tm,
42   and get back a time_t.  It differs from mktime() in that it handles
43   the case where the struct tm is UTC and the local environment isn't.
44
45   Note, that this replacement implementaion is not thread-safe!
46
47   Some BSDs don't handle the putenv("foo") case properly, so we use
48   unsetenv if the platform has it to remove environment variables.
49 */
50 #ifndef HAVE_TIMEGM
51 time_t
52 timegm (struct tm *tm)
53 {
54   time_t answer;
55   char *zone;
56
57   zone=getenv("TZ");
58   putenv("TZ=UTC");
59   tzset();
60   answer=mktime(tm);
61   if(zone)
62     {
63       static char *old_zone;
64
65       if (!old_zone)
66         {
67           old_zone = malloc(3+strlen(zone)+1);
68           if (old_zone)
69             {
70               strcpy(old_zone,"TZ=");
71               strcat(old_zone,zone);
72             }
73         }
74       if (old_zone)
75         putenv (old_zone);      
76     }
77   else
78 #ifdef HAVE_UNSETENV
79     unsetenv("TZ");
80 #else
81     putenv("TZ");
82 #endif
83
84   tzset();
85   return answer;
86 }
87 #endif /*!HAVE_TIMEGM*/
88