#include "../dlfcn/dlfcn.h"
#include <stdio.h>
#include <stdlib.h>

static int
do_test (void)
{
  int result = 0;

  /* This is a test for correct handling of dlopen failures for library that
     is loaded with RTLD_NODELETE flag.  The first dlopen should fail because
     of undefined symbols in shared library.  The second dlopen then verifies
     that library was properly unloaded.  */
  if (dlopen ("tst-nodelete-rtldmod.so", RTLD_NOW | RTLD_NODELETE) != NULL
      || dlopen ("tst-nodelete-rtldmod.so", RTLD_LAZY | RTLD_NOLOAD) != NULL)
    {
      printf ("RTLD_NODELETE test failed\n");
      result = 1;
    }

  /* This is a test for correct handling of dlopen failures for library that
     is linked with '-z nodelete' option and hence has DF_1_NODELETE flag.
     The first dlopen should fail because of undefined symbols in shared
     library.  The second dlopen then verifies that library was properly
     unloaded.  */
  if (dlopen ("tst-nodelete-zmod.so", RTLD_NOW) != NULL
      || dlopen ("tst-nodelete-zmod.so", RTLD_LAZY | RTLD_NOLOAD) != NULL)
    {
      printf ("-z nodelete test failed\n");
      result = 1;
    }

   /* This is a test for correct handling of dlopen failures for library
     with unique symbols.  The first dlopen should fail because of undefined
     symbols in shared library.  The second dlopen then verifies that library
     was properly unloaded.  */
  if (dlopen ("tst-nodelete-uniquemod.so", RTLD_NOW) != NULL
      || dlopen ("tst-nodelete-uniquemod.so", RTLD_LAZY | RTLD_NOLOAD) != NULL)
    {
      printf ("Unique symbols test failed\n");
      result = 1;
    }

  if (result == 0)
    printf ("SUCCESS\n");

  return result;
}

#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"