aboutsummaryrefslogtreecommitdiffstats
path: root/src/w32-ce.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/w32-ce.c')
-rw-r--r--src/w32-ce.c507
1 files changed, 0 insertions, 507 deletions
diff --git a/src/w32-ce.c b/src/w32-ce.c
deleted file mode 100644
index e326bfef..00000000
--- a/src/w32-ce.c
+++ /dev/null
@@ -1,507 +0,0 @@
-/* w32-ce.h
- Copyright (C) 2010 g10 Code GmbH
- Copyright (C) 1991,92,97,2000,02 Free Software Foundation, Inc.
-
- This file is part of GPGME.
-
- GPGME 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 2.1 of
- the License, or (at your option) any later version.
-
- GPGME 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 <https://www.gnu.org/licenses/>.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-
-#include <gpg-error.h>
-
-#define _WIN32_IE 0x0400 /* Required for SHGetSpecialFolderPathW. */
-
-/* We need to include the windows stuff here prior to shlobj.h so that
- we get the right winsock version. This is usually done in w32-ce.h
- but that header also redefines some Windows functions which we need
- to avoid unless having included shlobj.h. */
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#include <windows.h>
-#include <shlobj.h>
-
-#include "w32-ce.h"
-
-/* Return a malloced string encoded in UTF-8 from the wide char input
- string STRING. Caller must free this value. Returns NULL and sets
- ERRNO on failure. Calling this function with STRING set to NULL is
- not defined. */
-char *
-wchar_to_utf8 (const wchar_t *string)
-{
- int n;
- char *result;
-
- n = WideCharToMultiByte (CP_UTF8, 0, string, -1, NULL, 0, NULL, NULL);
- if (n < 0)
- {
- gpg_err_set_errno (EINVAL);
- return NULL;
- }
-
- result = malloc (n+1);
- if (!result)
- return NULL;
-
- n = WideCharToMultiByte (CP_UTF8, 0, string, -1, result, n, NULL, NULL);
- if (n < 0)
- {
- free (result);
- gpg_err_set_errno (EINVAL);
- result = NULL;
- }
- return result;
-}
-
-
-/* Return a malloced wide char string from an UTF-8 encoded input
- string STRING. Caller must free this value. Returns NULL and sets
- ERRNO on failure. Calling this function with STRING set to NULL is
- not defined. */
-wchar_t *
-utf8_to_wchar (const char *string)
-{
- int n;
- size_t nbytes;
- wchar_t *result;
-
- n = MultiByteToWideChar (CP_UTF8, 0, string, -1, NULL, 0);
- if (n < 0)
- {
- gpg_err_set_errno (EINVAL);
- return NULL;
- }
-
- nbytes = (size_t)(n+1) * sizeof(*result);
- if (nbytes / sizeof(*result) != (n+1))
- {
- gpg_err_set_errno (ENOMEM);
- return NULL;
- }
- result = malloc (nbytes);
- if (!result)
- return NULL;
-
- n = MultiByteToWideChar (CP_UTF8, 0, string, -1, result, n);
- if (n < 0)
- {
- free (result);
- gpg_err_set_errno (EINVAL);
- result = NULL;
- }
- return result;
-}
-
-
-#define MAX_ENV 30
-
-char *environ[MAX_ENV + 1];
-
-char *
-getenv (const char *name)
-{
- static char *past_result;
- char **envp;
-
- if (past_result)
- {
- free (past_result);
- past_result = NULL;
- }
-
-#if 0
- if (! strcmp (name, "DBUS_VERBOSE"))
- return past_result = get_verbose_setting ();
- else if (! strcmp (name, "HOMEPATH"))
- return past_result = find_my_documents_folder ();
- else if (! strcmp (name, "DBUS_DATADIR"))
- return past_result = find_inst_subdir ("share");
-#endif
-
- for (envp = environ; *envp != 0; envp++)
- {
- const char *varp = name;
- char *ep = *envp;
-
- while (*varp == *ep && *varp != '\0')
- {
- ++ep;
- ++varp;
- };
-
- if (*varp == '\0' && *ep == '=')
- return ep + 1;
- }
-
- return NULL;
-}
-
-
-void
-GetSystemTimeAsFileTime (LPFILETIME ftp)
-{
- SYSTEMTIME st;
- GetSystemTime (&st);
- SystemTimeToFileTime (&st, ftp);
-}
-
-
-BOOL
-DeleteFileA (LPCSTR lpFileName)
-{
- wchar_t *filename;
- BOOL result;
- int err;
-
- filename = utf8_to_wchar (lpFileName);
- if (!filename)
- return FALSE;
-
- result = DeleteFileW (filename);
-
- err = GetLastError ();
- free (filename);
- SetLastError (err);
- return result;
-}
-
-
-HANDLE
-CreateFileA (LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwSharedMode,
- LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
- HANDLE hTemplateFile)
-{
- wchar_t *filename;
- HANDLE result;
- int err;
-
- filename = utf8_to_wchar (lpFileName);
- if (!filename)
- return INVALID_HANDLE_VALUE;
-
- result = CreateFileW (filename, dwDesiredAccess, dwSharedMode,
- lpSecurityAttributes, dwCreationDisposition,
- dwFlagsAndAttributes, hTemplateFile);
-
- err = GetLastError ();
- free (filename);
- SetLastError (err);
- return result;
-}
-
-
-BOOL
-CreateProcessA (LPCSTR pszImageName, LPSTR pszCmdLine,
- LPSECURITY_ATTRIBUTES psaProcess,
- LPSECURITY_ATTRIBUTES psaThread, BOOL fInheritHandles,
- DWORD fdwCreate, PVOID pvEnvironment, LPCSTR pszCurDir,
- LPSTARTUPINFOA psiStartInfo,
- LPPROCESS_INFORMATION pProcInfo)
-{
- wchar_t *image_name = NULL;
- wchar_t *cmd_line = NULL;
- BOOL result;
- int err;
-
- assert (psaProcess == NULL);
- assert (psaThread == NULL);
- assert (fInheritHandles == FALSE);
- assert (pvEnvironment == NULL);
- assert (pszCurDir == NULL);
- /* psiStartInfo is generally not NULL. */
-
- if (pszImageName)
- {
- image_name = utf8_to_wchar (pszImageName);
- if (!image_name)
- return 0;
- }
- if (pszCmdLine)
- {
- cmd_line = utf8_to_wchar (pszCmdLine);
- if (!cmd_line)
- {
- if (image_name)
- free (image_name);
- return 0;
- }
- }
-
- result = CreateProcessW (image_name, cmd_line, NULL, NULL, FALSE,
- fdwCreate, NULL, NULL, NULL, pProcInfo);
-
- err = GetLastError ();
- free (image_name);
- free (cmd_line);
- SetLastError (err);
- return result;
-}
-
-
-LONG
-RegOpenKeyExA (HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions,
- REGSAM samDesired, PHKEY phkResult)
-{
- wchar_t *subkey;
- LONG result;
- int err;
-
- if (lpSubKey)
- {
- subkey = utf8_to_wchar (lpSubKey);
- if (!subkey)
- return 0;
- }
- else
- subkey = NULL;
-
- result = RegOpenKeyEx (hKey, subkey, ulOptions, samDesired, phkResult);
-
- err = GetLastError ();
- free (subkey);
- SetLastError (err);
- return result;
-}
-
-
-LONG WINAPI
-RegQueryValueExA (HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved,
- LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData)
-{
- wchar_t *name;
- LONG err;
- void *data;
- DWORD data_len;
- DWORD type;
-
- if (lpValueName)
- {
- name = utf8_to_wchar (lpValueName);
- if (!name)
- return GetLastError ();
- }
- else
- name = NULL;
-
- data_len = 0;
- err = RegQueryValueExW (hKey, name, lpReserved, lpType, NULL, &data_len);
- if (err || !lpcbData)
- {
- free (name);
- return err;
- }
-
- data = malloc (data_len + sizeof (wchar_t));
- if (!data)
- {
- free (name);
- return ERROR_NOT_ENOUGH_MEMORY;
- }
-
- err = RegQueryValueExW (hKey, name, lpReserved, &type, data, &data_len);
- if (lpType)
- *lpType = type;
- free (name);
- /* If err is ERROR_MORE_DATA, there probably was a race condition.
- We can punt this to the caller just as well. */
- if (err)
- return err;
-
- /* NOTE: REG_MULTI_SZ and REG_EXPAND_SZ not supported, because they
- are not needed in this module. */
- if (type == REG_SZ)
- {
- char *data_c;
- int data_c_len;
-
- /* This is valid since we allocated one more above. */
- ((char*)data)[data_len] = '\0';
- ((char*)data)[data_len + 1] = '\0';
-
- data_c = wchar_to_utf8 ((wchar_t*) data);
- if (!data_c)
- return GetLastError();
-
- data_c_len = strlen (data_c) + 1;
- assert (data_c_len <= data_len + sizeof (wchar_t));
- memcpy (data, data_c, data_c_len);
- data_len = data_c_len;
- free (data_c);
- }
-
- /* DATA and DATA_LEN now contain the result. */
- if (lpData)
- {
- if (data_len > *lpcbData)
- err = ERROR_MORE_DATA;
- else
- memcpy (lpData, data, data_len);
- }
- *lpcbData = data_len;
- return err;
-}
-
-
-DWORD
-GetTempPathA (DWORD nBufferLength, LPSTR lpBuffer)
-{
- wchar_t dummy[1];
- DWORD len;
-
- len = GetTempPathW (0, dummy);
- if (len == 0)
- return 0;
-
- assert (len <= MAX_PATH);
-
- /* Better be safe than sorry. MSDN doesn't say if len is with or
- without terminating 0. */
- len++;
-
- {
- wchar_t *buffer_w;
- DWORD len_w;
- char *buffer_c;
- DWORD len_c;
-
- buffer_w = malloc (sizeof (wchar_t) * len);
- if (! buffer_w)
- return 0;
-
- len_w = GetTempPathW (len, buffer_w);
- /* Give up if we still can't get at it. */
- if (len_w == 0 || len_w >= len)
- {
- free (buffer_w);
- return 0;
- }
-
- /* Better be really safe. */
- buffer_w[len_w] = '\0';
-
- buffer_c = wchar_to_utf8 (buffer_w);
- free (buffer_w);
- if (! buffer_c)
- return 0;
-
- /* strlen is correct (not _mbstrlen), because we want storage and
- not string length. */
- len_c = strlen (buffer_c) + 1;
- if (len_c > nBufferLength)
- return len_c;
-
- strcpy (lpBuffer, buffer_c);
- free (buffer_c);
- return len_c - 1;
- }
-}
-
-
-/* The symbol is named SHGetSpecialFolderPath and not
- SHGetSpecialFolderPathW but shlobj.h from cegcc redefines it to *W
- which is a bug. Work around it. */
-#ifdef __MINGW32CE__
-# undef SHGetSpecialFolderPath
-#endif
-BOOL
-SHGetSpecialFolderPathA (HWND hwndOwner, LPSTR lpszPath, int nFolder,
- BOOL fCreate)
-{
- wchar_t path[MAX_PATH];
- char *path_c;
- BOOL result;
-
- path[0] = (wchar_t) 0;
- result = SHGetSpecialFolderPath (hwndOwner, path, nFolder, fCreate);
- /* Note: May return false even if succeeds. */
-
- path[MAX_PATH - 1] = (wchar_t) 0;
- path_c = wchar_to_utf8 (path);
- if (! path_c)
- return 0;
-
- strncpy (lpszPath, path_c, MAX_PATH);
- free (path_c);
- lpszPath[MAX_PATH - 1] = '\0';
- return result;
-}
-
-/* Replacement for the access function. Note that we can't use fopen
- here because wince might now allow to have a shared read for an
- executable; it is better to to read the file attributes.
-
- Limitation: Only F_OK is supported.
-*/
-int
-_gpgme_wince_access (const char *fname, int mode)
-{
- DWORD attr;
- wchar_t *wfname;
-
- (void)mode;
-
- wfname = utf8_to_wchar (fname);
- if (!wfname)
- return -1;
-
- attr = GetFileAttributes (wfname);
- free (wfname);
- if (attr == (DWORD)(-1))
- {
- gpg_err_set_errno (ENOENT);
- return -1;
- }
- return 0;
-}
-
-
-/* Perform a binary search for KEY in BASE which has NMEMB elements
- of SIZE bytes each. The comparisons are done by (*COMPAR)().
- Code taken from glibc-2.6. */
-void *
-_gpgme_wince_bsearch (const void *key, const void *base,
- size_t nmemb, size_t size,
- int (*compar) (const void *, const void *))
-{
- size_t l, u, idx;
- const void *p;
- int comparison;
-
- l = 0;
- u = nmemb;
- while (l < u)
- {
- idx = (l + u) / 2;
- p = (void *) (((const char *) base) + (idx * size));
- comparison = (*compar) (key, p);
- if (comparison < 0)
- u = idx;
- else if (comparison > 0)
- l = idx + 1;
- else
- return (void *) p;
- }
-
- return NULL;
-}
-