Back to index

glibc  2.9
Functions | Variables
idn-stub.c File Reference
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
#include <gnu/lib-names.h>
#include <bits/libc-lock.h>
#include "idna.h"

Go to the source code of this file.

Functions

static void load_dso (void)
int __idna_to_unicode_lzlz (const char *input, char **output, int flags)
int __idna_to_ascii_lz (const char *input, char **output, int flags)
 libc_freeres_fn (unload_libidn)

Variables

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)

Function Documentation

int __idna_to_ascii_lz ( const char *  input,
char **  output,
int  flags 
)

Definition at line 110 of file idn-stub.c.

{
  /* 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);
}

Here is the call graph for this function:

Here is the caller graph for this function:

int __idna_to_unicode_lzlz ( const char *  input,
char **  output,
int  flags 
)

Definition at line 75 of file idn-stub.c.

{
  /* 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);
}

Here is the call graph for this function:

Here is the caller graph for this function:

libc_freeres_fn ( unload_libidn  )

Definition at line 136 of file idn-stub.c.

{
  if (h != NULL && h != (void *) 1l)
    {
      __libc_dlclose (h);
      h = (void *) 1l;
    }
}

Here is the call graph for this function:

static void load_dso ( void  ) [static]

Definition at line 41 of file idn-stub.c.

{
  /* 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);
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

void* h [static]

Definition at line 33 of file idn-stub.c.

int(* to_ascii_lz)(const char *input, char **output, int flags) [static]

Definition at line 36 of file idn-stub.c.

int(* to_unicode_lzlz)(const char *input, char **output, int flags) [static]

Definition at line 37 of file idn-stub.c.