Might now build for CE using MSC.

This commit is contained in:
Werner Koch 2010-11-02 20:17:57 +00:00
parent 987993a38d
commit 753375ffcf
6 changed files with 141 additions and 18 deletions

View File

@ -1,5 +1,18 @@
2010-11-02 Werner Koch <wk@g10code.com> 2010-11-02 Werner Koch <wk@g10code.com>
* data-fd.c (read, write, lseek) [W32CE && ! __MINGW32CE__]: New.
Taken from Pedro Alves Public Domain code.
* w32-ce.h (SHGetSpecialFolderPath): Remove our defines and
prototypes. We use the system provided prototypes now.
* w32-ce.c: Include shlobj.h
(_WIN32_IE): Define to 0x0400
(CreateFileA): New.
* w32-util.c: Explicitly include windows headers before util.h.
(_gpgme_w32ce_get_debug_envvar): Do not use wchar_t strings for
read_w32_registry_string.
(mkstemp): Use CreateFile instead of open.
* w32-io.c (handle_to_fd, fd_tohandle): Add. We need them for W32. * w32-io.c (handle_to_fd, fd_tohandle): Add. We need them for W32.
* w32-util.c (_WIN32_IE): Define to 0x0400. * w32-util.c (_WIN32_IE): Define to 0x0400.

View File

@ -102,7 +102,6 @@ else
uiserver_components = uiserver_components =
endif endif
# These are the source files common to all library versions. We used # These are the source files common to all library versions. We used
# to build a non-installed library for that, but that does not work # to build a non-installed library for that, but that does not work
# correctly on all platforms (in particular, one can not specify the # correctly on all platforms (in particular, one can not specify the

View File

@ -30,6 +30,62 @@
#include "debug.h" #include "debug.h"
#include "data.h" #include "data.h"
#if defined(HAVE_W32CE_SYSTEM) && !defined(__MINGW32CE__)
/* We need to provide replacements for read, write and lseek. They
are taken from the cegcc runtime files, written by Pedro Alves
<pedro_alves@portugalmail.pt> in Feb 2007 and placed in the public
domain. (cf. cegcc/src/mingw/mingwex/wince/) */
#include <windows.h>
static int
read (int fildes, void *buf, unsigned int bufsize)
{
DWORD NumberOfBytesRead;
if (bufsize > 0x7fffffff)
bufsize = 0x7fffffff;
if (!ReadFile ((HANDLE) fildes, buf, bufsize, &NumberOfBytesRead, NULL))
return -1;
return (int) NumberOfBytesRead;
}
static int
write (int fildes, const void *buf, unsigned int bufsize)
{
DWORD NumberOfBytesWritten;
if (bufsize > 0x7fffffff)
bufsize = 0x7fffffff;
if (!WriteFile ((HANDLE) fildes, buf, bufsize, &NumberOfBytesWritten, NULL))
return -1;
return (int) NumberOfBytesWritten;
}
static long
lseek (int fildes, long offset, int whence)
{
DWORD mode;
switch (whence)
{
case SEEK_SET:
mode = FILE_BEGIN;
break;
case SEEK_CUR:
mode = FILE_CURRENT;
break;
case SEEK_END:
mode = FILE_END;
break;
default:
/* Specify an invalid mode so SetFilePointer catches it. */
mode = (DWORD)-1;
}
return (long) SetFilePointer ((HANDLE) fildes, offset, NULL, mode);
}
#endif /*HAVE_W32CE_SYSTEM && !__MINGW32CE__*/
static ssize_t static ssize_t
fd_read (gpgme_data_t dh, void *buffer, size_t size) fd_read (gpgme_data_t dh, void *buffer, size_t size)

View File

@ -28,8 +28,18 @@
#include <gpg-error.h> #include <gpg-error.h>
#include "w32-ce.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 /* Return a malloced string encoded in UTF-8 from the wide char input
string STRING. Caller must free this value. Returns NULL and sets string STRING. Caller must free this value. Returns NULL and sets
@ -175,6 +185,31 @@ DeleteFileA (LPCSTR lpFileName)
} }
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 BOOL
CreateProcessA (LPCSTR pszImageName, LPSTR pszCmdLine, CreateProcessA (LPCSTR pszImageName, LPSTR pszCmdLine,
LPSECURITY_ATTRIBUTES psaProcess, LPSECURITY_ATTRIBUTES psaProcess,
@ -382,6 +417,12 @@ GetTempPathA (DWORD nBufferLength, LPSTR lpBuffer)
} }
/* 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 BOOL
SHGetSpecialFolderPathA (HWND hwndOwner, LPSTR lpszPath, int nFolder, SHGetSpecialFolderPathA (HWND hwndOwner, LPSTR lpszPath, int nFolder,
BOOL fCreate) BOOL fCreate)
@ -391,7 +432,7 @@ SHGetSpecialFolderPathA (HWND hwndOwner, LPSTR lpszPath, int nFolder,
BOOL result; BOOL result;
path[0] = (wchar_t) 0; path[0] = (wchar_t) 0;
result = SHGetSpecialFolderPathW (hwndOwner, path, nFolder, fCreate); result = SHGetSpecialFolderPath (hwndOwner, path, nFolder, fCreate);
/* Note: May return false even if succeeds. */ /* Note: May return false even if succeeds. */
path[MAX_PATH - 1] = (wchar_t) 0; path[MAX_PATH - 1] = (wchar_t) 0;

View File

@ -33,13 +33,6 @@ typedef int pid_t;
#include <windows.h> #include <windows.h>
/* shlobj.h declares these only for _WIN32_IE that we don't want to define.
In any case, with mingw32ce we only get a SHGetSpecialFolderPath. */
#define SHGetSpecialFolderPathW SHGetSpecialFolderPath
BOOL WINAPI SHGetSpecialFolderPathA(HWND,LPSTR,int,BOOL);
BOOL WINAPI SHGetSpecialFolderPathW(HWND,LPWSTR,int,BOOL);
#define getenv _gpgme_wince_getenv #define getenv _gpgme_wince_getenv
char *getenv (const char *name); char *getenv (const char *name);
@ -55,6 +48,10 @@ void GetSystemTimeAsFileTime (LPFILETIME ftp);
#define DeleteFileA _gpgme_wince_DeleteFileA #define DeleteFileA _gpgme_wince_DeleteFileA
BOOL DeleteFileA(LPCSTR); BOOL DeleteFileA(LPCSTR);
#define CreateFileA _gpgme_wince_CreateFileA
HANDLE CreateFileA (LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES,
DWORD, DWORD, HANDLE);
#define CreateProcessA _gpgme_wince_CreateProcessA #define CreateProcessA _gpgme_wince_CreateProcessA
BOOL CreateProcessA(LPCSTR,LPSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCSTR,LPSTARTUPINFOA,LPPROCESS_INFORMATION); BOOL CreateProcessA(LPCSTR,LPSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCSTR,LPSTARTUPINFOA,LPPROCESS_INFORMATION);

View File

@ -42,8 +42,16 @@
#define _WIN32_IE 0x0400 /* Required for SHGetSpecialFolderPathA. */ #define _WIN32_IE 0x0400 /* Required for SHGetSpecialFolderPathA. */
#include "util.h" /* 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 util.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 <shlobj.h>
#include "util.h"
#include "ath.h" #include "ath.h"
#include "sema.h" #include "sema.h"
#include "debug.h" #include "debug.h"
@ -488,7 +496,7 @@ mkstemp (char *tmpl)
static uint64_t value; static uint64_t value;
uint64_t random_time_bits; uint64_t random_time_bits;
unsigned int count; unsigned int count;
int fd = -1; HANDLE fd = INVALID_HANDLE_VALUE;
int save_errno = errno; int save_errno = errno;
/* A lower bound on the number of temporary files to attempt to /* A lower bound on the number of temporary files to attempt to
@ -544,15 +552,24 @@ mkstemp (char *tmpl)
v /= 62; v /= 62;
XXXXXX[5] = letters[v % 62]; XXXXXX[5] = letters[v % 62];
fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); fd = CreateFileA (tmpl,
if (fd >= 0) GENERIC_WRITE|GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (fd != INVALID_HANDLE_VALUE)
{ {
gpg_err_set_errno (save_errno); gpg_err_set_errno (save_errno);
return fd; return (int)fd;
} }
else if (errno != EEXIST) else if (GetLastError () != ERROR_FILE_EXISTS)
{
gpg_err_set_errno (EIO);
return -1; return -1;
} }
}
/* We got out of the loop because we ran out of combinations to try. */ /* We got out of the loop because we ran out of combinations to try. */
gpg_err_set_errno (EEXIST); gpg_err_set_errno (EEXIST);
@ -608,7 +625,7 @@ _gpgme_w32ce_get_debug_envvar (void)
{ {
char *tmp; char *tmp;
tmp = read_w32_registry_string (NULL, L"\\Software\\GNU\\gpgme", L"debug"); tmp = read_w32_registry_string (NULL, "\\Software\\GNU\\gpgme", "debug");
if (tmp && !*tmp) if (tmp && !*tmp)
{ {
free (tmp); free (tmp);