common: Require an installed libiconv.
authorWerner Koch <wk@gnupg.org>
Tue, 18 Feb 2014 14:20:49 +0000 (15:20 +0100)
committerWerner Koch <wk@gnupg.org>
Wed, 26 Feb 2014 13:03:57 +0000 (14:03 +0100)
* common/utf8conv.c: Remove dynload.h.
(load_libiconv): Remove.  Remove all calls to it.
--

The iconv functions are standard feature on most systems and in any
case libiconv can be used to provide the functions.  The old code used
to dlopen iconv.dll on Windows.  This goes back to GnuPG-1 which was
designed as a one-binary program without any hard dependencies.
GnuPG2 however demands a lot of libraries anyway and thus there is no
more need for the fragile code to load a possible wrong version of
iconv.dll at runtime.

common/utf8conv.c
configure.ac

index a45bb63..fa08b04 100644 (file)
 #include <langinfo.h>
 #endif
 #include <errno.h>
-#if !defined HAVE_W32_SYSTEM && !defined HAVE_ANDROID_SYSTEM
+#ifndef HAVE_ANDROID_SYSTEM
 # include <iconv.h>
 #endif
 
 #include "libjnlib-config.h"
 #include "stringhelp.h"
-#include "dynload.h"
 #include "utf8conv.h"
 
 #ifndef MB_LEN_MAX
@@ -53,7 +52,7 @@
 
 static const char *active_charset_name = "iso-8859-1";
 static int no_translation;     /* Set to true if we let simply pass through. */
-static int use_iconv;          /* iconv comversion fucntions required. */
+static int use_iconv;          /* iconv conversion functions required. */
 
 
 #ifdef HAVE_ANDROID_SYSTEM
@@ -87,70 +86,7 @@ iconv_close (iconv_t cd)
   (void)cd;
   return 0;
 }
-
-
-static int
-load_libiconv (void)
-{
-  return -1;
-}
-
-#elif defined HAVE_W32_SYSTEM
-/* Under W32 we dlopen the iconv dll and don't require any iconv
-   related headers at all.  However we need to define some stuff.  */
-typedef void *iconv_t;
-#ifndef ICONV_CONST
-#define ICONV_CONST
-#endif
-static iconv_t (* __stdcall iconv_open) (const char *tocode,
-                                         const char *fromcode);
-static size_t  (* __stdcall iconv) (iconv_t cd,
-                                    char **inbuf, size_t *inbytesleft,
-                                    char **outbuf, size_t *outbytesleft);
-static int     (* __stdcall iconv_close) (iconv_t cd);
-
-static int
-load_libiconv (void)
-{
-#ifdef HAVE_W32CE_SYSTEM
-  return -1; /* FIXME No libiconv yet - Need to investigate whether it
-                is at all required.  */
-#else
-  static int done;
-
-  if (!done)
-    {
-      void *handle;
-
-      done = 1; /* Do it right now because we might get called recursivly
-                   through gettext.  */
-
-      handle = dlopen ("iconv.dll", RTLD_LAZY);
-      if (handle)
-        {
-          iconv_open  = dlsym (handle, "libiconv_open");
-          if (iconv_open)
-            iconv = dlsym (handle, "libiconv");
-          if (iconv)
-            iconv_close = dlsym (handle, "libiconv_close");
-        }
-      if (!handle || !iconv_close)
-        {
-          log_info (_("error loading '%s': %s\n"),
-                     "iconv.dll",  dlerror ());
-          log_info (_("please see %s for more information\n"),
-                    "http://www.gnupg.org/download/iconv.html");
-          iconv_open = NULL;
-          iconv = NULL;
-          iconv_close = NULL;
-          if (handle)
-            dlclose (handle);
-        }
-    }
-  return iconv_open? 0: -1;
-#endif
-}
-#endif /*HAVE_W32_SYSTEM*/
+#endif /*HAVE_ANDROID_SYSTEM*/
 
 
 /* Error handler for iconv failures. This is needed to not clutter the
@@ -332,11 +268,6 @@ set_native_charset (const char *newset)
     {
       iconv_t cd;
 
-#if defined HAVE_W32_SYSTEM || defined HAVE_ANDROID_SYSTEM
-      if (load_libiconv ())
-        return -1;
-#endif /*HAVE_W32_SYSTEM || HAVE_ANDROID_SYSTEM*/
-
       cd = iconv_open (full_newset, "utf-8");
       if (cd == (iconv_t)-1)
         {
@@ -758,11 +689,6 @@ utf8_to_native (const char *string, size_t length, int delim)
 jnlib_iconv_t
 jnlib_iconv_open (const char *tocode, const char *fromcode)
 {
-#if defined HAVE_W32_SYSTEM || defined HAVE_ANDROID_SYSTEM
-  if (load_libiconv ())
-    return (jnlib_iconv_t)(-1);
-#endif /*HAVE_W32_SYSTEM || HAVE_ANDROID_SYSTEM*/
-
   return (jnlib_iconv_t)iconv_open (tocode, fromcode);
 }
 
@@ -774,12 +700,6 @@ jnlib_iconv (jnlib_iconv_t cd,
              const char **inbuf, size_t *inbytesleft,
              char **outbuf, size_t *outbytesleft)
 {
-
-#if defined HAVE_W32_SYSTEM || defined HAVE_ANDROID_SYSTEM
-  if (load_libiconv ())
-    return 0;
-#endif /*HAVE_W32_SYSTEM || HAVE_ANDROID_SYSTEM*/
-
   return iconv ((iconv_t)cd, (char**)inbuf, inbytesleft, outbuf, outbytesleft);
 }
 
@@ -788,11 +708,6 @@ jnlib_iconv (jnlib_iconv_t cd,
 int
 jnlib_iconv_close (jnlib_iconv_t cd)
 {
-#if defined HAVE_W32_SYSTEM || defined HAVE_ANDROID_SYSTEM
-  if (load_libiconv ())
-    return 0;
-#endif /*HAVE_W32_SYSTEM || HAVE_ANDROID_SYSTEM*/
-
   return iconv_close ((iconv_t)cd);
 }
 
@@ -867,4 +782,4 @@ utf8_to_wchar (const char *string)
     }
   return result;
 }
-#endif /*HAVE_W32_SYSTEM || HAVE_ANDROID_SYSTEM*/
+#endif /*HAVE_W32_SYSTEM*/
index 4abeeb0..dc4d1ae 100644 (file)
@@ -1168,6 +1168,7 @@ AC_DEFINE_UNQUOTED(PRINTABLE_OS_NAME, "$PRINTABLE_OS_NAME",
 AM_ICONV
 
 
+
 #
 # Check for gettext
 #
@@ -1785,6 +1786,17 @@ if test "$have_npth" = "no"; then
 ***]])
 fi
 
+if test "$am_func_iconv" != yes; then
+    die=yes
+    AC_MSG_NOTICE([[
+***
+*** The system does not provide a working iconv function.  Please
+*** install a suitable library; for example GNU Libiconv which is
+*** available at:
+***   http://ftp.gnu.org/gnu/libiconv/
+***]])
+fi
+
 if test "$die" = "yes"; then
     AC_MSG_ERROR([[
 ***