Might now build for CE using MSC.
This commit is contained in:
parent
987993a38d
commit
753375ffcf
@ -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.
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
45
src/w32-ce.c
45
src/w32-ce.c
@ -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;
|
||||||
|
11
src/w32-ce.h
11
src/w32-ce.h
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user