From 19baf7bb927f0fbd0a6fe7d6056b541456a8e7c1 Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Fri, 29 Oct 2010 18:10:11 +0000 Subject: 2010-10-29 Marcus Brinkmann * src/w32-gettext.c: Guard include of . Do not include . (CreateFileA) [HAVE_W32CE_SYSTEM]: New wrapper function. (load_domain): Use native Windows API. * src/init.c (TLS_OUT_OF_INDEXES) [HAVE_W32CE_SYSTEM, !TLS_OUT_OF_INDEXES]: Define it. (abort) [!__MINGW32CE__]: Define it. --- src/init.c | 6 +++++ src/w32-gettext.c | 71 ++++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 58 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/init.c b/src/init.c index d1ea44c..10f8e43 100644 --- a/src/init.c +++ b/src/init.c @@ -33,6 +33,12 @@ #ifdef HAVE_W32CE_SYSTEM # include "mkw32errmap.map.c" /* Generated map_w32codes () */ +# ifndef TLS_OUT_OF_INDEXES +# define TLS_OUT_OF_INDEXES 0xFFFFFFFF +# endif +# ifndef __MINGW32CE__ +# define abort() exit(1) +# endif #endif diff --git a/src/w32-gettext.c b/src/w32-gettext.c index 0d0c1eb..8a67ce7 100644 --- a/src/w32-gettext.c +++ b/src/w32-gettext.c @@ -30,8 +30,9 @@ #include #include #include +#ifdef HAVE_SYS_TYPES_H #include -#include +#endif #include #ifndef HAVE_W32CE_SYSTEM # include @@ -52,6 +53,36 @@ #include "init.h" #include "gpg-error.h" +#ifdef HAVE_W32CE_SYSTEM +/* Forward declaration. */ +static wchar_t *utf8_to_wchar (const char *string, size_t length, size_t *retlen); + +static HANDLE +CreateFileA (LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwSharedMode, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, + HANDLE hTemplateFile) +{ + wchar_t *filename; + HANDLE result; + int err; + size_t size; + + filename = utf8_to_wchar (lpFileName, -1, &size); + if (!filename) + return INVALID_HANDLE_VALUE; + + result = CreateFileW (filename, dwDesiredAccess, dwSharedMode, + lpSecurityAttributes, dwCreationDisposition, + dwFlagsAndAttributes, hTemplateFile); + + err = GetLastError (); + free (filename); + SetLastError (err); + return result; +} +#endif + /* localname.c from gettext BEGIN. */ @@ -611,7 +642,9 @@ static const char * my_nl_locale_name (const char *categoryname) { +#ifndef HAVE_W32CE_SYSTEM const char *retval; +#endif LCID lcid; LANGID langid; int primary, sub; @@ -1194,31 +1227,28 @@ free_domain (struct loaded_domain *domain) static struct loaded_domain * load_domain (const char *filename) { - FILE *fp; - size_t size; - struct stat st; + HANDLE fh; + DWORD size; struct mo_file_header *data = NULL; struct loaded_domain *domain = NULL; size_t to_read; char *read_ptr; - - fp = fopen (filename, "rb"); - if (!fp) - { - return NULL; - } - if (fstat (fileno (fp), &st) - || (size = (size_t) st.st_size) != st.st_size - || size < sizeof (struct mo_file_header)) + + fh = CreateFileA (filename, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + if (fh == INVALID_HANDLE_VALUE) + return NULL; + + size = GetFileSize (fh, NULL); + if (size == INVALID_FILE_SIZE) { - fclose (fp); + CloseHandle (fh); return NULL; } data = (2*size <= size)? NULL : jnlib_malloc (2*size); if (!data) { - fclose (fp); + CloseHandle (fh); return NULL; } @@ -1226,10 +1256,13 @@ load_domain (const char *filename) read_ptr = (char *) data; do { - long int nb = fread (read_ptr, 1, to_read, fp); - if (nb < to_read) + BOOL res; + DWORD nb; + + res = ReadFile (fh, read_ptr, to_read, &nb, NULL); + if (! res || nb < to_read) { - fclose (fp); + CloseHandle (fh); jnlib_free (data); return NULL; } @@ -1237,7 +1270,7 @@ load_domain (const char *filename) to_read -= nb; } while (to_read > 0); - fclose (fp); + CloseHandle (fh); /* Using the magic number we can test whether it really is a message catalog file. */ -- cgit v1.2.3