/* Tests for loading and unloading of iconv modules.
   Copyright (C) 2000-2014 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Ulrich Drepper <drepper@cygnus.com>, 2000.

   The GNU C Library 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.

   The GNU C Library 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 the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <iconv.h>
#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>


/* How many load/unload operations do we do.  */
#define TEST_ROUNDS	5000


enum state { unloaded, loaded };

struct
{
  const char *name;
  enum state state;
  iconv_t cd;
} modules[] =
{
#define MODULE(Name) { .name = #Name, .state = unloaded }
  MODULE (ISO-8859-1),
  MODULE (ISO-8859-2),
  MODULE (ISO-8859-3),
  MODULE (ISO-8859-4),
  MODULE (ISO-8859-5),
  MODULE (ISO-8859-6),
  MODULE (ISO-8859-15),
  MODULE (EUC-JP),
  MODULE (EUC-KR),
  MODULE (EUC-CN),
  MODULE (EUC-TW),
  MODULE (SJIS),
  MODULE (UHC),
  MODULE (KOI8-R),
  MODULE (BIG5),
  MODULE (BIG5HKSCS)
};
#define nmodules (sizeof (modules) / sizeof (modules[0]))


/* The test data.  */
static const char inbuf[] =
"The first step is the function to create a handle.\n"
"\n"
" - Function: iconv_t iconv_open (const char *TOCODE, const char\n"
"          *FROMCODE)\n"
"     The `iconv_open' function has to be used before starting a\n"
"     conversion.  The two parameters this function takes determine the\n"
"     source and destination character set for the conversion and if the\n"
"     implementation has the possibility to perform such a conversion the\n"
"     function returns a handle.\n"
"\n"
"     If the wanted conversion is not available the function returns\n"
"     `(iconv_t) -1'.  In this case the global variable `errno' can have\n"
"     the following values:\n"
"\n"
"    `EMFILE'\n"
"          The process already has `OPEN_MAX' file descriptors open.\n"
"\n"
"    `ENFILE'\n"
"          The system limit of open file is reached.\n"
"\n"
"    `ENOMEM'\n"
"          Not enough memory to carry out the operation.\n"
"\n"
"    `EINVAL'\n"
"          The conversion from FROMCODE to TOCODE is not supported.\n"
"\n"
"     It is not possible to use the same descriptor in different threads\n"
"     to perform independent conversions.  Within the data structures\n"
"     associated with the descriptor there is information about the\n"
"     conversion state.  This must not be messed up by using it in\n"
"     different conversions.\n"
"\n"
"     An `iconv' descriptor is like a file descriptor as for every use a\n"
"     new descriptor must be created.  The descriptor does not stand for\n"
"     all of the conversions from FROMSET to TOSET.\n"
"\n"
"     The GNU C library implementation of `iconv_open' has one\n"
"     significant extension to other implementations.  To ease the\n"
"     extension of the set of available conversions the implementation\n"
"     allows storing the necessary files with data and code in\n"
"     arbitrarily many directories.  How this extension has to be\n"
"     written will be explained below (*note glibc iconv\n"
"     Implementation::).  Here it is only important to say that all\n"
"     directories mentioned in the `GCONV_PATH' environment variable are\n"
"     considered if they contain a file `gconv-modules'.  These\n"
"     directories need not necessarily be created by the system\n"
"     administrator.  In fact, this extension is introduced to help users\n"
"     writing and using their own, new conversions.  Of course this does\n"
"     not work for security reasons in SUID binaries; in this case only\n"
"     the system directory is considered and this normally is\n"
"     `PREFIX/lib/gconv'.  The `GCONV_PATH' environment variable is\n"
"     examined exactly once at the first call of the `iconv_open'\n"
"     function.  Later modifications of the variable have no effect.\n";


int
main (void)
{
  size_t count = TEST_ROUNDS;
  int result = 0;

  mtrace ();

  /* Just a seed.  */
  srandom (TEST_ROUNDS);

  while (count--)
    {
      int idx = random () % nmodules;

      if (modules[idx].state == unloaded)
	{
	  char outbuf[10000];
	  char *inptr = (char *) inbuf;
	  size_t insize = sizeof (inbuf) - 1;
	  char *outptr = outbuf;
	  size_t outsize = sizeof (outbuf);

	  /* Load the module and do the conversion.  */
	  modules[idx].cd = iconv_open ("UTF-8", modules[idx].name);

	  if (modules[idx].cd == (iconv_t) -1)
	    {
	      printf ("opening of %s failed: %m\n", modules[idx].name);
	      result = 1;
	      break;
	    }

	  modules[idx].state = loaded;

	  /* Now a simple test.  */
	  if (iconv (modules[idx].cd, &inptr, &insize, &outptr, &outsize) != 0
	      || *inptr != '\0')
	    {
	      printf ("conversion with %s failed\n", modules[idx].name);
	      result = 1;
	    }
	}
      else
	{
	  /* Unload the module.  */
	  if (iconv_close (modules[idx].cd) != 0)
	    {
	      printf ("closing of %s failed: %m\n", modules[idx].name);
	      result = 1;
	      break;
	    }

	  modules[idx].state = unloaded;
	}
    }

  for (count = 0; count < nmodules; ++count)
    if (modules[count].state == loaded && iconv_close (modules[count].cd) != 0)
      {
	printf ("closing of %s failed: %m\n", modules[count].name);
	result = 1;
      }

  return result;
}
