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-util.c (_WIN32_IE): Define to 0x0400.
uiserver_components =
endif
-
# 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
# correctly on all platforms (in particular, one can not specify the
#include "debug.h"
#include "data.h"
+
+\f
+#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__*/
+
+
\f
static ssize_t
fd_read (gpgme_data_t dh, void *buffer, size_t size)
#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
string STRING. Caller must free this value. Returns NULL and sets
}
+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,
}
+/* 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)
BOOL result;
path[0] = (wchar_t) 0;
- result = SHGetSpecialFolderPathW (hwndOwner, path, nFolder, fCreate);
+ result = SHGetSpecialFolderPath (hwndOwner, path, nFolder, fCreate);
/* Note: May return false even if succeeds. */
path[MAX_PATH - 1] = (wchar_t) 0;
#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
char *getenv (const char *name);
#define DeleteFileA _gpgme_wince_DeleteFileA
BOOL DeleteFileA(LPCSTR);
+#define CreateFileA _gpgme_wince_CreateFileA
+HANDLE CreateFileA (LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES,
+ DWORD, DWORD, HANDLE);
+
#define CreateProcessA _gpgme_wince_CreateProcessA
BOOL CreateProcessA(LPCSTR,LPSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCSTR,LPSTARTUPINFOA,LPPROCESS_INFORMATION);
#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 "util.h"
#include "ath.h"
#include "sema.h"
#include "debug.h"
static uint64_t value;
uint64_t random_time_bits;
unsigned int count;
- int fd = -1;
+ HANDLE fd = INVALID_HANDLE_VALUE;
int save_errno = errno;
/* A lower bound on the number of temporary files to attempt to
v /= 62;
XXXXXX[5] = letters[v % 62];
- fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
- if (fd >= 0)
+ fd = CreateFileA (tmpl,
+ 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);
- return fd;
+ return (int)fd;
}
- else if (errno != EEXIST)
- return -1;
+ else if (GetLastError () != ERROR_FILE_EXISTS)
+ {
+ gpg_err_set_errno (EIO);
+ return -1;
+ }
}
/* We got out of the loop because we ran out of combinations to try. */
{
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)
{
free (tmp);