Add --logger-fd alias.
[gnupg.git] / jnlib / mischelp.c
1 /* mischelp.c - Miscellaneous helper functions
2  * Copyright (C) 1998, 2000, 2001, 2006, 2007 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 #ifdef HAVE_W32_SYSTEM
25 # define WIN32_LEAN_AND_MEAN
26 # include <windows.h>
27 #else /*!HAVE_W32_SYSTEM*/
28 # include <sys/types.h>
29 # include <sys/stat.h>
30 # include <unistd.h>
31 #endif /*!HAVE_W32_SYSTEM*/
32
33 #include "libjnlib-config.h"
34 #include "stringhelp.h"
35 #include "mischelp.h"
36
37
38 /* Check whether the files NAME1 and NAME2 are identical.  This is for
39    example achieved by comparing the inode numbers of the files.  */
40 int
41 same_file_p (const char *name1, const char *name2)
42 {
43   int yes;
44       
45   /* First try a shortcut.  */
46   if (!compare_filenames (name1, name2))
47     yes = 1;
48   else
49     {
50 #ifdef HAVE_W32_SYSTEM  
51       HANDLE file1, file2;
52       BY_HANDLE_FILE_INFORMATION info1, info2;
53       
54       file1 = CreateFile (name1, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
55       if (file1 == INVALID_HANDLE_VALUE)
56         yes = 0; /* If we can't open the file, it is not the same.  */
57       else
58         {
59           file2 = CreateFile (name2, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
60           if (file1 == INVALID_HANDLE_VALUE)
61             yes = 0; /* If we can't open the file, it is not the same.  */
62           else
63             {
64               yes = (GetFileInformationByHandle (file1, &info1)
65                      && GetFileInformationByHandle (file2, &info2)
66                      && info1.dwVolumeSerialNumber==info2.dwVolumeSerialNumber
67                      && info1.nFileIndexHigh == info2.nFileIndexHigh
68                      && info1.nFileIndexLow == info2.nFileIndexLow);
69               CloseHandle (file2);
70             }
71           CloseHandle (file1);
72         }
73 #else /*!HAVE_W32_SYSTEM*/
74       struct stat info1, info2;
75       
76       yes = (!stat (name1, &info1) && !stat (name2, &info2)
77              && info1.st_dev == info2.st_dev && info1.st_ino == info2.st_ino);
78 #endif /*!HAVE_W32_SYSTEM*/
79     }
80   return yes;
81 }
82
83
84 /*
85   timegm() is a GNU function that might not be available everywhere.
86   It's basically the inverse of gmtime() - you give it a struct tm,
87   and get back a time_t.  It differs from mktime() in that it handles
88   the case where the struct tm is UTC and the local environment isn't.
89
90   Note, that this replacement implementaion is not thread-safe!
91
92   Some BSDs don't handle the putenv("foo") case properly, so we use
93   unsetenv if the platform has it to remove environment variables.
94 */
95 #ifndef HAVE_TIMEGM
96 time_t
97 timegm (struct tm *tm)
98 {
99   time_t answer;
100   char *zone;
101
102   zone=getenv("TZ");
103   putenv("TZ=UTC");
104   tzset();
105   answer=mktime(tm);
106   if(zone)
107     {
108       static char *old_zone;
109
110       if (!old_zone)
111         {
112           old_zone = malloc(3+strlen(zone)+1);
113           if (old_zone)
114             {
115               strcpy(old_zone,"TZ=");
116               strcat(old_zone,zone);
117             }
118         }
119       if (old_zone)
120         putenv (old_zone);      
121     }
122   else
123 #ifdef HAVE_UNSETENV
124     unsetenv("TZ");
125 #else
126     putenv("TZ");
127 #endif
128
129   tzset();
130   return answer;
131 }
132 #endif /*!HAVE_TIMEGM*/
133