diff options
author | Werner Koch <[email protected]> | 2010-03-10 12:24:58 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2010-03-10 12:24:58 +0000 |
commit | d8b1099d01ebc1d305d47ec6dcb326980ad56396 (patch) | |
tree | cb92563d8b116872c34ad26dcdacfd02ed3da04a /jnlib/mischelp.c | |
parent | Fix for latest libgpg-error. (diff) | |
download | gnupg-d8b1099d01ebc1d305d47ec6dcb326980ad56396.tar.gz gnupg-d8b1099d01ebc1d305d47ec6dcb326980ad56396.zip |
Merged jnlib into common.
Diffstat (limited to 'jnlib/mischelp.c')
-rw-r--r-- | jnlib/mischelp.c | 197 |
1 files changed, 0 insertions, 197 deletions
diff --git a/jnlib/mischelp.c b/jnlib/mischelp.c deleted file mode 100644 index e06be21f2..000000000 --- a/jnlib/mischelp.c +++ /dev/null @@ -1,197 +0,0 @@ -/* mischelp.c - Miscellaneous helper functions - * Copyright (C) 1998, 2000, 2001, 2006, 2007 Free Software Foundation, Inc. - * - * This file is part of JNLIB. - * - * JNLIB is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * JNLIB is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#ifdef HAVE_W32_SYSTEM -# define WIN32_LEAN_AND_MEAN -# include <windows.h> -#else /*!HAVE_W32_SYSTEM*/ -# include <sys/types.h> -# include <sys/stat.h> -# include <unistd.h> -#endif /*!HAVE_W32_SYSTEM*/ -#include <errno.h> - -#include "libjnlib-config.h" -#include "stringhelp.h" -#include "utf8conv.h" -#include "mischelp.h" - - -/* Because we can't use our jnlib_free macro in inline functions we - provide this wrapper. */ -void -_jnlib_free (void *p) -{ - if (p) - jnlib_free (p); -} - - -/* Check whether the files NAME1 and NAME2 are identical. This is for - example achieved by comparing the inode numbers of the files. */ -int -same_file_p (const char *name1, const char *name2) -{ - int yes; - - /* First try a shortcut. */ - if (!compare_filenames (name1, name2)) - yes = 1; - else - { -#ifdef HAVE_W32_SYSTEM - HANDLE file1, file2; - BY_HANDLE_FILE_INFORMATION info1, info2; - -#ifdef HAVE_W32CE_SYSTEM - { - wchar_t *wname = utf8_to_wchar (name1); - if (wname) - file1 = CreateFile (wname, 0, 0, NULL, OPEN_EXISTING, 0, NULL); - else - file1 = INVALID_HANDLE_VALUE; - jnlib_free (wname); - } -#else - file1 = CreateFile (name1, 0, 0, NULL, OPEN_EXISTING, 0, NULL); -#endif - if (file1 == INVALID_HANDLE_VALUE) - yes = 0; /* If we can't open the file, it is not the same. */ - else - { -#ifdef HAVE_W32CE_SYSTEM - { - wchar_t *wname = utf8_to_wchar (name2); - if (wname) - file2 = CreateFile (wname, 0, 0, NULL, OPEN_EXISTING, 0, NULL); - else - file2 = INVALID_HANDLE_VALUE; - jnlib_free (wname); - } -#else - file2 = CreateFile (name2, 0, 0, NULL, OPEN_EXISTING, 0, NULL); -#endif - if (file2 == INVALID_HANDLE_VALUE) - yes = 0; /* If we can't open the file, it is not the same. */ - else - { - yes = (GetFileInformationByHandle (file1, &info1) - && GetFileInformationByHandle (file2, &info2) - && info1.dwVolumeSerialNumber==info2.dwVolumeSerialNumber - && info1.nFileIndexHigh == info2.nFileIndexHigh - && info1.nFileIndexLow == info2.nFileIndexLow); - CloseHandle (file2); - } - CloseHandle (file1); - } -#else /*!HAVE_W32_SYSTEM*/ - struct stat info1, info2; - - yes = (!stat (name1, &info1) && !stat (name2, &info2) - && info1.st_dev == info2.st_dev && info1.st_ino == info2.st_ino); -#endif /*!HAVE_W32_SYSTEM*/ - } - return yes; -} - - -/* - timegm() is a GNU function that might not be available everywhere. - It's basically the inverse of gmtime() - you give it a struct tm, - and get back a time_t. It differs from mktime() in that it handles - the case where the struct tm is UTC and the local environment isn't. - - Note, that this replacement implementation might not be thread-safe! - - Some BSDs don't handle the putenv("foo") case properly, so we use - unsetenv if the platform has it to remove environment variables. -*/ -#ifndef HAVE_TIMEGM -time_t -timegm (struct tm *tm) -{ -#ifdef HAVE_W32_SYSTEM - /* This one is thread safe. */ - SYSTEMTIME st; - FILETIME ft; - unsigned long long cnsecs; - - st.wYear = tm->tm_year + 1900; - st.wMonth = tm->tm_mon + 1; - st.wDay = tm->tm_mday; - st.wHour = tm->tm_hour; - st.wMinute = tm->tm_min; - st.wSecond = tm->tm_sec; - st.wMilliseconds = 0; /* Not available. */ - st.wDayOfWeek = 0; /* Ignored. */ - - /* System time is UTC thus the conversion is pretty easy. */ - if (!SystemTimeToFileTime (&st, &ft)) - { - jnlib_set_errno (EINVAL); - return (time_t)(-1); - } - - cnsecs = (((unsigned long long)ft.dwHighDateTime << 32) - | ft.dwLowDateTime); - cnsecs -= 116444736000000000ULL; /* The filetime epoch is 1601-01-01. */ - return (time_t)(cnsecs / 10000000ULL); - -#else /* (Non thread safe implementation!) */ - - time_t answer; - char *zone; - - zone=getenv("TZ"); - putenv("TZ=UTC"); - tzset(); - answer=mktime(tm); - if(zone) - { - static char *old_zone; - - if (!old_zone) - { - old_zone = malloc(3+strlen(zone)+1); - if (old_zone) - { - strcpy(old_zone,"TZ="); - strcat(old_zone,zone); - } - } - if (old_zone) - putenv (old_zone); - } - else -#ifdef HAVE_UNSETENV - unsetenv("TZ"); -#else - putenv("TZ"); -#endif - - tzset(); - return answer; -#endif -} -#endif /*!HAVE_TIMEGM*/ - |