From 01859b1c24e97f30325a3ce189739e66811c40a4 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 8 Mar 2004 03:55:39 +0000 Subject: ChangeLog for libidn. 2004-03-07 Simon Josefsson * Banner: New file. * Makefile: New file. * Version: New file. * configure: New file. * idn-stub.c: New file. * gunibreak.h: New file. Copied from Libidn. * gunicomp.h: New file. Copied from Libidn. * gunidecomp.h: New file. Copied from Libidn. * idna.h: New file. Copied from Libidn. * idna.c: New file. Copied from Libidn. * nfkc.c: New file. Copied from Libidn. * profiles.c: New file. Copied from Libidn. * punycode.c: New file. Copied from Libidn. * punycode.h: New file. Copied from Libidn. * rfc3454.c: New file. Copied from Libidn. * stringprep.c: New file. Copied from Libidn. * stringprep.h: New file. Copied from Libidn. * toutf8.c: New file. Copied from Libidn. Modified for use in glibc. --- libidn/idn-stub.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 libidn/idn-stub.c (limited to 'libidn/idn-stub.c') diff --git a/libidn/idn-stub.c b/libidn/idn-stub.c new file mode 100644 index 0000000000..f2a11611ef --- /dev/null +++ b/libidn/idn-stub.c @@ -0,0 +1,86 @@ +/* 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include + +/* Get specification for idna_to_ascii_lz. */ +#include "idna.h" + +/* Handle of the libidn DSO. */ +static void *h; + + +/* 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 = strdup (input); + return *output == NULL ? IDNA_MALLOC_ERROR : IDNA_SUCCESS; + } + + static int (*to_ascii_lz) (const char *input, char **output, int flags); + + 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"); + if (to_ascii_lz == NULL) + { + __libc_dlclose (h); + h = (void *) 1l; + } + } + } + + if (h == (void *) 1l) + return IDNA_DLOPEN_ERROR; + + return to_ascii_lz (input, output, flags); +} + + +libc_freeres_fn (unload_libidn) +{ + if (h != NULL && h != (void *) 1l) + { + __libc_dlclose (h); + h = (void *) 1l; + } +} -- cgit v1.2.3