aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--NEWS2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/gpg-error.c40
-rw-r--r--src/gpg-extra/errno.h60
-rw-r--r--src/init.c89
6 files changed, 128 insertions, 71 deletions
diff --git a/ChangeLog b/ChangeLog
index 57a9e8f..b522c35 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2010-01-18 Werner Koch <[email protected]>
+ * src/init.c (wchar_to_utf8, utf8_to_wchar): New.
+
+ * src/gpg-error.c (main): Add option --list.
+
+2010-01-18 Werner Koch <[email protected]>
+
* ltmain.sh (wrappers_required): Don't set for mingw32ce.
* tests/Makefile.am (extra_includes): New.
diff --git a/NEWS b/NEWS
index 11b630a..1e2a5ed 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ Noteworthy changes in version 1.8
* Preliminary support for WindowsCE.
+ * New option --list for gpg-error.
+
* Interface changes relative to the 1.7 release:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GPG_ERR_NOT_ENABLED NEW.
diff --git a/src/Makefile.am b/src/Makefile.am
index 8e2a319..d948021 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -48,7 +48,7 @@ EXTRA_DIST = mkstrtable.awk err-sources.h.in err-codes.h.in \
BUILT_SOURCES = err-sources.h err-codes.h code-to-errno.h code-from-errno.h \
err-sources-sym.h err-codes-sym.h errnos-sym.h gpg-error.h \
- gpg-error.def gpg-extra/errno.h extra-h.in
+ gpg-error.def extra-h.in $(extra_headers)
tmp_files = _mkerrcodes.h _gpg-error.def.h mkw32errmap.tab.h
diff --git a/src/gpg-error.c b/src/gpg-error.c
index eefd672..6cfe292 100644
--- a/src/gpg-error.c
+++ b/src/gpg-error.c
@@ -462,6 +462,10 @@ int
main (int argc, char *argv[])
{
int i = 1;
+ int listmode = 0;
+ const char *source_sym;
+ const char *error_sym;
+ gpg_error_t err;
#ifndef GPG_ERR_INITIALIZED
gpg_err_init ();
@@ -481,18 +485,46 @@ main (int argc, char *argv[])
fputs ("gpg-error (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stdout);
exit (0);
}
+ else if (argc == 2 && !strcmp (argv[1], "--list"))
+ {
+ listmode = 1;
+ }
+ if (listmode)
+ {
+ for (i=0; i < GPG_ERR_SOURCE_DIM; i++)
+ {
+ /* We use error code 1 because gpg_err_make requires a
+ non-zero error code. */
+ err = gpg_err_make (i, 1);
+ err -= 1;
+ source_sym = gpg_strsource_sym (err);
+ if (source_sym)
+ printf ("%u = (%u, -) = (%s, -) = (%s, -)\n",
+ err, gpg_err_source (err),
+ source_sym, gpg_strsource (err));
+ }
+ for (i=0; i < GPG_ERR_CODE_DIM; i++)
+ {
+ err = gpg_err_make (GPG_ERR_SOURCE_UNKNOWN, i);
+ error_sym = gpg_strerror_sym (err);
+ if (error_sym)
+ printf ("%u = (-, %u) = (-, %s) = (-, %s)\n",
+ err, gpg_err_code (err),
+ error_sym, gpg_strerror (err));
+ }
+
+ i = argc; /* Don't run the usual stuff. */
+ }
while (i < argc)
{
- gpg_error_t err;
-
if (get_err_from_number (argv[i], &err)
|| get_err_from_symbol (argv[i], &err)
|| get_err_from_str (argv[i], &err))
{
- const char *source_sym = gpg_strsource_sym (err);
- const char *error_sym = gpg_strerror_sym (err);
+ source_sym = gpg_strsource_sym (err);
+ error_sym = gpg_strerror_sym (err);
printf ("%u = (%u, %u) = (%s, %s) = (%s, %s)\n",
err, gpg_err_source (err), gpg_err_code (err),
diff --git a/src/gpg-extra/errno.h b/src/gpg-extra/errno.h
deleted file mode 100644
index 7670fda..0000000
--- a/src/gpg-extra/errno.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* errno.h - WindowsCE errno.h substitute
- Copyright (C) 2010 g10 Code GmbH
-
- This file is free software; as a special exception the author gives
- unlimited permission to copy and/or distribute it, with or without
- modifications, as long as this notice is preserved.
-
- This file is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY, to the extent permitted by law; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE.
-
- +++ Do not edit! File has been generated by mkw32errmap.c +++
-
- This file is intended to be used with ming32ce-gcc to implement an
- errno substitute under WindowsCE. It must be included via gcc's
- -idirafter option. The gpg-error-config script emits the
- appropriate option snippet. The actual implementation of the errno
- related functions are part of libgpg-error. A separate header file
- is required because errno.h is often included before gpg-error.h.
- */
-
-#ifndef _GPG_ERROR_EXTRA_ERRNO_H
-#define _GPG_ERROR_EXTRA_ERRNO_H
-
-/* Due to peculiarities in W32 we can't implement ERRNO as an
- writable lvalue. This also allows us to easily find places
- where ERRNO is being written to. See also gpg_err_set_errno. */
-int _gpg_w32ce_get_errno (void);
-#define errno (_gpg_w32ce_get_errno ())
-
-#define ENOENT 2
-#define EMFILE 4
-#define EACCES 5
-#define EBADF 6
-#define ENOMEM 8
-#define EXDEV 17
-#define ENFILE 18
-#define EROFS 19
-#define ENOLCK 36
-#define ENOSYS 50
-#define EEXIST 80
-#define EPERM 82
-#define EINVAL 87
-#define EINTR 104
-#define EPIPE 109
-#define ENOSPC 112
-#define ENOTEMPTY 145
-#define EBUSY 170
-#define ENAMETOOLONG 206
-#define EAGAIN 234
-#define ENOTDIR 267
-#define ERANGE 534
-#define ENXIO 1006
-#define EFAULT 1067
-#define EIO 1117
-#define EDEADLOCK 1131
-#define ENODEV 1200
-
-#endif /*_GPG_ERROR_EXTRA_ERRNO_H*/
diff --git a/src/init.c b/src/init.c
index c9e0047..5a5ac90 100644
--- a/src/init.c
+++ b/src/init.c
@@ -35,13 +35,16 @@
/* Locale directory support. */
#if HAVE_W32_SYSTEM
+
+/* 119 bytes for an error message should be enough. With this size we
+ can assume that the allocation does not take up more than 128 bytes
+ per thread. */
+#define STRBUFFER_SIZE 120
+
/* The TLS space definition. */
struct tls_space_s
{
- /* 119 bytes for an error message should be enough. With this size
- we can assume that the allocation does not take up more than 128
- bytes per thread. */
- char strerror_buffer[120];
+ char strerror_buffer[STRBUFFER_SIZE];
};
static int tls_index; /* Index for the TLS functions. */
@@ -82,6 +85,68 @@ gpg_err_init (void)
#include <windows.h>
+/* Return a malloced string encoded in UTF-8 from the wide char input
+ string STRING. Caller must free this value. Returns NULL on
+ failure. Caller may use GetLastError to get the actual error
+ number. The result of calling this function with STRING set to
+ NULL is not defined. */
+static char *
+wchar_to_utf8 (const wchar_t *string)
+{
+ int n;
+ char *result;
+
+ /* Note, that CP_UTF8 is not defined in Windows versions earlier
+ than NT. */
+ n = WideCharToMultiByte (CP_UTF8, 0, string, -1, NULL, 0, NULL, NULL);
+ if (n < 0)
+ return NULL;
+
+ result = malloc (n+1);
+ if (result)
+ {
+ n = WideCharToMultiByte (CP_UTF8, 0, string, -1, result, n, NULL, NULL);
+ if (n < 0)
+ {
+ free (result);
+ result = NULL;
+ }
+ }
+ return result;
+}
+
+
+/* Return a malloced wide char string from an UTF-8 encoded input
+ string STRING. Caller must free this value. Returns NULL on
+ failure. Caller may use GetLastError to get the actual error
+ number. The result of calling this function with STRING set to
+ NULL is not defined. */
+static wchar_t *
+utf8_to_wchar (const char *string)
+{
+ int n;
+ wchar_t *result;
+
+ n = MultiByteToWideChar (CP_UTF8, 0, string, -1, NULL, 0);
+ if (n < 0)
+ return NULL;
+
+ result = malloc ((n+1) * sizeof *result);
+ if (result)
+ {
+ n = MultiByteToWideChar (CP_UTF8, 0, string, -1, result, n);
+ if (n < 0)
+ {
+ free (result);
+ result = NULL;
+ }
+ return NULL;
+ }
+ return result;
+}
+
+
+
static HKEY
get_root_key(const char *root)
{
@@ -295,13 +360,25 @@ char *
_gpg_w32ce_strerror (int err)
{
struct tls_space_s *tls = get_tls ();
+ wchar_t tmpbuf[STRBUFFER_SIZE];
+ int n;
if (err == -1)
err = _gpg_w32ce_get_errno ();
- if (!FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
+ if (FormatMessageW (FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
- tls->strerror_buffer, sizeof tls->strerror_buffer -1,
+ tmpbuf, STRBUFFER_SIZE -1,
NULL))
+ {
+ n = WideCharToMultiByte (CP_UTF8, 0, tmpbuf, -1,
+ tls->strerror_buffer,
+ sizeof tls->strerror_buffer -1,
+ NULL, NULL);
+ }
+ else
+ n = -1;
+
+ if (n < 0)
snprintf (tls->strerror_buffer, sizeof tls->strerror_buffer -1,
"[w32err=%d]", err);
return tls->strerror_buffer;