diff options
Diffstat (limited to 'ACE/tests/Unload_libACE.cpp')
-rw-r--r-- | ACE/tests/Unload_libACE.cpp | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/ACE/tests/Unload_libACE.cpp b/ACE/tests/Unload_libACE.cpp new file mode 100644 index 00000000000..8d30c021f08 --- /dev/null +++ b/ACE/tests/Unload_libACE.cpp @@ -0,0 +1,266 @@ +// $Id$ + +// ============================================================================ +// +// = LIBRARY +// tests +// +// = FILENAME +// Unload_libACE.cpp +// +// = DESCRIPTION +// This is a simple test of library unloading that uses +// an application which has _not_ been linked with libACE +// but uses dlopen() to dynamically load libACE +// and then uses dlclose() to unload it. +// +// = AUTHORS +// David Smith <dts@prismtech.com> and Don Sharp <Donald.Sharp@prismtech.com> +// +// ============================================================================ + +#include <stdio.h> + +#undef UNLOAD_LIBACE_TEST + +#if defined (__GNUC__) +#if !defined (ACE_VXWORKS) && !defined (__MINGW32__) && !defined (__CYGWIN32__) +#define UNLOAD_LIBACE_TEST 1 +#endif /* !ACE_VXWORKS && !__MINGW32__ && !CYGWIN32 */ +#endif /* __GNUC__ */ + +#if defined (__hpux) || defined (__SUNPRO_CC) +#define UNLOAD_LIBACE_TEST 1 +#endif /* (__hpux) || (__SUNPRO_CC) */ + +#if defined (ACE_AS_STATIC_LIBS) +#undef UNLOAD_LIBACE_TEST +#endif /* ACE_AS_STATIC_LIBS */ + +#ifdef UNLOAD_LIBACE_TEST + +#include <errno.h> +#include <dlfcn.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +#define TIME_STAMP_FIELD_WIDTH 32 + +static char * +time_stamp (char date_and_time[], int date_and_timelen, int format) +{ + static char const *const month_name[] = + { + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + }; + + static char const *const day_of_week_name[] = + { + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + }; + + char *ts = NULL; + + if (date_and_timelen >= TIME_STAMP_FIELD_WIDTH) + { + time_t timeval; + struct tm *now; + + time (&timeval); + now = localtime (&timeval); /* Get current local time. */ + + if (format == 'Y') + { + sprintf (date_and_time, + "%3s %3s %2d %04d %02d:%02d:%02d.%06d", + day_of_week_name[now->tm_wday], + month_name[now->tm_mon], + (int) now->tm_mday, + (int) now->tm_year + 1900, + (int) now->tm_hour, + (int) now->tm_min, (int) now->tm_sec, (int) 0); + } + else /* 'T' */ + { + sprintf (date_and_time, + "%3s %2d %02d:%02d:%02d.%03d %04d", + month_name[now->tm_mon], + (int) now->tm_mday, + (int) now->tm_hour, + (int) now->tm_min, + (int) now->tm_sec, (int) 0, + (int) now->tm_year + 1900); + } + + ts = date_and_time; + } + return ts; +} + +int +main (int, char **) +{ + char const *const program = "UnloadLibACE"; + + int status = 0; + void *handle = NULL; + char *ace_root = NULL; + char tbuf[BUFSIZ]; + char ybuf[BUFSIZ]; + FILE *logfp = NULL; + + if ((logfp = fopen ("log/UnloadLibACE.log", "w")) != NULL) + { + setvbuf (logfp, NULL, _IONBF, 0); + // reassign stdout/stderr to log file + int fdno = fileno (logfp); + + dup2 (fdno, fileno (stdout)); + dup2 (fdno, fileno (stderr)); + setvbuf (stdout, NULL, _IONBF, 0); + setvbuf (stderr, NULL, _IONBF, 0); + fflush (stdout); + fflush (stderr); + + printf ("%s@LM_DEBUG@ Starting %s test at %s\n", + time_stamp (tbuf, BUFSIZ, 'T'), + program, time_stamp (ybuf, BUFSIZ, 'Y')); + + if ((ace_root = getenv ("ACE_ROOT")) != NULL) + { + char buf[BUFSIZ]; + + strcpy (buf, ace_root); + strcat (buf, "/lib/lib"); +#if defined (ACE_LIB_NAME) + strcat (buf, ACE_LIB_NAME); +#else + strcat (buf, "ACE"); +#endif /* ACE_LIB_NAME */ +#if defined (__hpux) && !(defined (__ia64) && (__ia64 == 1)) + strcat (buf, ".sl"); +#else + strcat (buf, ".so"); +#endif /* (__hpux) */ + + handle = dlopen (buf, RTLD_LAZY); + if (handle == NULL) + { + // is it because of "No such file or directory" ? + if (errno != ENOENT) + { + fprintf (stderr, + "%s@LM_ERROR@ dlopen() returned NULL\n", + time_stamp (tbuf, BUFSIZ, 'T')); + fprintf (stderr, + "%s@LM_ERROR@ dlerror() says: %s\n", + time_stamp (tbuf, BUFSIZ, 'T'), dlerror ()); + status = 1; + } + else + { + printf ("%s@LM_DEBUG@ dlopen() did not find %s\n", + time_stamp (tbuf, BUFSIZ, 'T'), buf); + status = 0; + } + } + else if (dlclose (handle) != 0) + { + fprintf (stderr, + "%s@LM_ERROR@ dlclose() failed : %s\n", + time_stamp (tbuf, BUFSIZ, 'T'), strerror (errno)); + status = 1; + } + } + else + { + fprintf (stderr, + "%s@LM_ERROR@ ACE_ROOT environment variable not set\n", + time_stamp (tbuf, BUFSIZ, 'T')); + status = 1; + } + + fflush (stdout); + fflush (stderr); + fflush (logfp); + + fclose (logfp); + } + else + { + // Couldn't go into the log file !!! + printf ("%s@LM_DEBUG@ Starting %s test at %s\n", + time_stamp (tbuf, BUFSIZ, 'T'), + program, time_stamp (ybuf, BUFSIZ, 'Y')); + + fprintf (stderr, + "%s@LM_ERROR@ Could not open log/UnloadLibACE.log : %s\n", + time_stamp (tbuf, BUFSIZ, 'T'), strerror (errno)); + status = 1; + } + + printf ("%s@LM_DEBUG@ Ending %s test at %s\n", + time_stamp (tbuf, BUFSIZ, 'T'), + program, time_stamp (ybuf, BUFSIZ, 'Y')); + + fflush (stderr); + fflush (stdout); + fclose (stdout); + fclose (stderr); + + // Don't change this since we do NOT want to use ACE for this test! + exit (status); + return 0; +} +#else +# if defined (WIN32) && defined (ACE_USES_WCHAR) +// Borrow include list from ace_wchar.h +# if defined (ACE_HAS_WINCE) +# include /**/ <wtypes.h> +# elif !defined (__BORLANDC__) +# include /**/ <wchar.h> +# endif /* ACE_HAS_WINCE || __BORLANDC__ */ + +int +wmain (int, wchar_t **) +#else +int +main (int, char **) +#endif /* (WIN32) && (ACE_USES_WCHAR) */ +{ + char const *const program = "UnloadLibACE"; + + FILE *logfp = NULL; + + if ((logfp = fopen ("log/UnloadLibACE.log", "w")) != NULL) + { + fprintf (logfp, "@LM_DEBUG@ Starting %s test\n", program); + fprintf (logfp, "@LM_DEBUG@ %s test not implemented for this platform\n", + program); + fprintf (logfp, "@LM_DEBUG@ Ending %s test\n", program); + + fflush (logfp); + fclose (logfp); + } + return 0; +} +#endif /* UNLOAD_LIBACE_TEST */ |