aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcus Brinkmann <[email protected]>2010-10-29 18:10:11 +0000
committerMarcus Brinkmann <[email protected]>2010-10-29 18:10:11 +0000
commit19baf7bb927f0fbd0a6fe7d6056b541456a8e7c1 (patch)
tree31bf096de68b572885ee2e7a4d03833c8c922563
parent * build.mk (ce_defines): Fix line continuation. (diff)
downloadlibgpg-error-19baf7bb927f0fbd0a6fe7d6056b541456a8e7c1.tar.gz
libgpg-error-19baf7bb927f0fbd0a6fe7d6056b541456a8e7c1.zip
2010-10-29 Marcus Brinkmann <[email protected]>
* src/w32-gettext.c: Guard include of <sys/types.h>. Do not include <sys/stat.h>. (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.
-rw-r--r--ChangeLog11
-rw-r--r--src/init.c6
-rw-r--r--src/w32-gettext.c71
3 files changed, 69 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index 6ecb4b1..52f6be1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2010-10-29 Marcus Brinkmann <[email protected]>
+
+ * src/w32-gettext.c: Guard include of <sys/types.h>. Do not
+ include <sys/stat.h>.
+ (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.
+
2010-10-28 Werner Koch <[email protected]>
* contrib/conf-w32ce-msc/build.mk: New.
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 <string.h>
#include <errno.h>
#include <ctype.h>
+#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
-#include <sys/stat.h>
+#endif
#include <stdint.h>
#ifndef HAVE_W32CE_SYSTEM
# include <locale.h>
@@ -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. */