summaryrefslogtreecommitdiff
path: root/libidn/idn-stub.c
diff options
context:
space:
mode:
Diffstat (limited to 'libidn/idn-stub.c')
-rw-r--r--libidn/idn-stub.c142
1 files changed, 0 insertions, 142 deletions
diff --git a/libidn/idn-stub.c b/libidn/idn-stub.c
deleted file mode 100644
index fb67f74b8d..0000000000
--- a/libidn/idn-stub.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* idn-stub.c --- Stub to dlopen libcidn.so and invoke idna_to_ascii_lz.
- * Copyright (C) 2003, 2004 Simon Josefsson
- *
- * This file is part of GNU Libidn.
- *
- * GNU Libidn is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * GNU Libidn is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with GNU Libidn; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <dlfcn.h>
-#include <gnu/lib-names.h>
-#include <libc-lock.h>
-
-/* Get specification for idna_to_ascii_lz. */
-#include "idna.h"
-
-/* Handle of the libidn DSO. */
-static void *h;
-
-
-static int (*to_ascii_lz) (const char *input, char **output, int flags);
-static int (*to_unicode_lzlz) (const char *input, char **output, int flags);
-
-
-static void
-load_dso (void)
-{
- /* Lock protecting the DSO loading. */
- __libc_lock_define_initialized (static, lock);
-
- __libc_lock_lock (lock);
-
- /* Retest in case some other thread arrived here at the same time. */
- if (h == NULL)
- {
- h = __libc_dlopen (LIBCIDN_SO);
-
- if (h == NULL)
- h = (void *) 1l;
- else
- {
- /* Get the function we are interested in. */
- to_ascii_lz = __libc_dlsym (h, "idna_to_ascii_lz");
- to_unicode_lzlz = __libc_dlsym (h, "idna_to_unicode_lzlz");
- if (to_ascii_lz == NULL || to_unicode_lzlz == NULL)
- {
- __libc_dlclose (h);
- h = (void *) 1l;
- }
- }
- }
-
- __libc_lock_unlock (lock);
-}
-
-
-/* Stub to dlopen libcidn.so and invoke the real idna_to_ascii_lz, or
- return IDNA_DLOPEN_ERROR on failure. */
-int
-__idna_to_unicode_lzlz (const char *input, char **output, int flags)
-{
- /* If the input string contains no "xn--" prefix for a component of
- the name we can pass it up right away. */
- const char *cp = input;
- while (*cp != '\0')
- {
- if (strncmp (cp, IDNA_ACE_PREFIX, strlen (IDNA_ACE_PREFIX)) == 0)
- break;
-
- /* On to the next part of the name. */
- cp = __strchrnul (cp, '.');
- if (*cp == '.')
- ++cp;
- }
-
- if (*cp == '\0')
- {
- *output = (char *) input;
- return IDNA_SUCCESS;
- }
-
- if (h == NULL)
- load_dso ();
-
- if (h == (void *) 1l)
- return IDNA_DLOPEN_ERROR;
-
- return to_unicode_lzlz (input, output, flags);
-}
-
-
-/* Stub to dlopen libcidn.so and invoke the real idna_to_ascii_lz, or
- return IDNA_DLOPEN_ERROR on failure. */
-int
-__idna_to_ascii_lz (const char *input, char **output, int flags)
-{
- /* If the input string contains no non-ASCII character the output
- string will be the same. No valid locale encoding does not have
- this property. */
- const char *cp = input;
- while (*cp != '\0' && isascii (*cp))
- ++cp;
-
- if (*cp == '\0')
- {
- *output = (char *) input;
- return IDNA_SUCCESS;
- }
-
- if (h == NULL)
- load_dso ();
-
- if (h == (void *) 1l)
- return IDNA_DLOPEN_ERROR;
-
- return to_ascii_lz (input, output, flags);
-}
-
-
-#if IS_IN (libc)
-libc_freeres_fn (unload_libidn)
-{
- if (h != NULL && h != (void *) 1l)
- {
- __libc_dlclose (h);
- h = (void *) 1l;
- }
-}
-#endif