Blame src/ctests/shlib.c

Packit Service a1973e
/*
Packit Service a1973e
* File:    profile.c
Packit Service a1973e
* Author:  Philip Mucci
Packit Service a1973e
*          mucci@cs.utk.edu
Packit Service a1973e
*/
Packit Service a1973e
Packit Service a1973e
#include <stdio.h>
Packit Service a1973e
#include <stdlib.h>
Packit Service a1973e
#include <string.h>
Packit Service a1973e
#include <unistd.h>
Packit Service a1973e
Packit Service a1973e
#if (!defined(NO_DLFCN) && !defined(_BGL) && !defined(_BGP))
Packit Service a1973e
#include <dlfcn.h>
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
#include "papi.h"
Packit Service a1973e
#include "papi_test.h"
Packit Service a1973e
Packit Service a1973e
void print_shlib_info_map(const PAPI_shlib_info_t *shinfo, int quiet)
Packit Service a1973e
{
Packit Service a1973e
	PAPI_address_map_t *map = shinfo->map;
Packit Service a1973e
	int i;
Packit Service a1973e
	if (NULL == map) {
Packit Service a1973e
		test_fail(__FILE__, __LINE__, "PAPI_get_shared_lib_info", 1);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if (!quiet) for ( i = 0; i < shinfo->count; i++ ) {
Packit Service a1973e
		printf( "Library: %s\n", map->name );
Packit Service a1973e
		printf( "Text start: %p, Text end: %p\n", map->text_start,
Packit Service a1973e
				map->text_end );
Packit Service a1973e
		printf( "Data start: %p, Data end: %p\n", map->data_start,
Packit Service a1973e
				map->data_end );
Packit Service a1973e
		printf( "Bss start: %p, Bss end: %p\n", map->bss_start, map->bss_end );
Packit Service a1973e
Packit Service a1973e
		if ( strlen( &(map->name[0]) ) == 0 )
Packit Service a1973e
			test_fail( __FILE__, __LINE__, "PAPI_get_shared_lib_info", 1 );
Packit Service a1973e
		if ( ( map->text_start == 0x0 ) || ( map->text_end == 0x0 ) ||
Packit Service a1973e
			 ( map->text_start >= map->text_end ) )
Packit Service a1973e
			test_fail( __FILE__, __LINE__, "PAPI_get_shared_lib_info", 1 );
Packit Service a1973e
/*
Packit Service a1973e
       if ((map->data_start == 0x0) || (map->data_end == 0x0) ||
Packit Service a1973e
	   (map->data_start >= map->data_end))
Packit Service a1973e
	 test_fail(__FILE__, __LINE__, "PAPI_get_shared_lib_info",1);
Packit Service a1973e
       if (((map->bss_start) && (!map->bss_end)) ||
Packit Service a1973e
	   ((!map->bss_start) && (map->bss_end)) ||
Packit Service a1973e
	   (map->bss_start > map->bss_end))
Packit Service a1973e
	 test_fail(__FILE__, __LINE__, "PAPI_get_shared_lib_info",1);
Packit Service a1973e
*/
Packit Service a1973e
Packit Service a1973e
		map++;
Packit Service a1973e
	}
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
void display( char *msg )
Packit Service a1973e
{
Packit Service a1973e
	int i;
Packit Service a1973e
	for (i=0; i<64; i++)
Packit Service a1973e
	{
Packit Service a1973e
		printf( "%1d", (msg[i] ? 1 : 0) );
Packit Service a1973e
	}
Packit Service a1973e
	printf("\n");
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
int
Packit Service a1973e
main( int argc, char **argv )
Packit Service a1973e
{
Packit Service a1973e
	int retval,quiet;
Packit Service a1973e
Packit Service a1973e
	const PAPI_shlib_info_t *shinfo;
Packit Service a1973e
Packit Service a1973e
	/* Set TESTS_QUIET variable */
Packit Service a1973e
	quiet = tests_quiet( argc, argv );
Packit Service a1973e
Packit Service a1973e
	retval = PAPI_library_init( PAPI_VER_CURRENT );
Packit Service a1973e
	if (retval != PAPI_VER_CURRENT ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_library_init", retval );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( ( shinfo = PAPI_get_shared_lib_info(  ) ) == NULL ) {
Packit Service a1973e
		test_skip( __FILE__, __LINE__, "PAPI_get_shared_lib_info", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( ( shinfo->count == 0 ) && ( shinfo->map ) ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_get_shared_lib_info", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	print_shlib_info_map(shinfo, quiet);
Packit Service a1973e
Packit Service a1973e
	/* Needed for debugging, so you can ^Z and stop the process, */
Packit Service a1973e
	/* inspect /proc to see if it's right */
Packit Service a1973e
	sleep( 1 );
Packit Service a1973e
Packit Service a1973e
#ifndef NO_DLFCN
Packit Service a1973e
	{
Packit Service a1973e
Packit Service a1973e
	const char *_libname = "libcrypt.so";
Packit Service a1973e
	void *handle;
Packit Service a1973e
	void ( *setkey) (const char *key);
Packit Service a1973e
	void ( *encrypt) (char block[64], int edflag);
Packit Service a1973e
	char key[64]={
Packit Service a1973e
		1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
Packit Service a1973e
		1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
Packit Service a1973e
		1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
Packit Service a1973e
		1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
Packit Service a1973e
	}; /* bit pattern for key */
Packit Service a1973e
	char orig[64];      /* bit pattern for messages */
Packit Service a1973e
	char txt[64];      	    /* bit pattern for messages */
Packit Service a1973e
Packit Service a1973e
	int oldcount;
Packit Service a1973e
Packit Service a1973e
	handle = dlopen( _libname, RTLD_NOW );
Packit Service a1973e
	if ( !handle ) {
Packit Service a1973e
		printf( "dlopen: %s\n", dlerror(  ) );
Packit Service a1973e
		if (!quiet) printf( "Did you forget to set the environmental "
Packit Service a1973e
			"variable LIBPATH (in AIX) or "
Packit Service a1973e
			"LD_LIBRARY_PATH (in linux) ?\n" );
Packit Service a1973e
			test_fail( __FILE__, __LINE__, "dlopen", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	setkey = dlsym( handle, "setkey" );
Packit Service a1973e
	encrypt = dlsym( handle, "encrypt" );
Packit Service a1973e
	if ( setkey == NULL || encrypt == NULL) {
Packit Service a1973e
		if (!quiet) printf( "dlsym: %s\n", dlerror(  ) );
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "dlsym", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	memset(orig,0,64);
Packit Service a1973e
	memcpy(txt,orig,64);
Packit Service a1973e
	setkey(key);
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf("original  ");
Packit Service a1973e
		display(txt);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	encrypt(txt, 0);   /* encode */
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf("encrypted ");
Packit Service a1973e
		display(txt);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if (!memcmp(txt,orig,64)) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "encode", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	encrypt(txt, 1);   /* decode */
Packit Service a1973e
Packit Service a1973e
	if (!quiet) {
Packit Service a1973e
		printf("decrypted ");
Packit Service a1973e
		display(txt);
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if (memcmp(txt,orig,64)) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "decode", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	oldcount = shinfo->count;
Packit Service a1973e
Packit Service a1973e
	if ( ( shinfo = PAPI_get_shared_lib_info(  ) ) == NULL ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_get_shared_lib_info", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	/* Needed for debugging, so you can ^Z and stop the process, */
Packit Service a1973e
	/* inspect /proc to see if it's right */
Packit Service a1973e
	sleep( 1 );
Packit Service a1973e
Packit Service a1973e
	if ( ( shinfo->count == 0 ) && ( shinfo->map ) ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_get_shared_lib_info", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	if ( shinfo->count <= oldcount ) {
Packit Service a1973e
		test_fail( __FILE__, __LINE__, "PAPI_get_shared_lib_info", 1 );
Packit Service a1973e
	}
Packit Service a1973e
Packit Service a1973e
	print_shlib_info_map(shinfo, quiet);
Packit Service a1973e
Packit Service a1973e
	/* Needed for debugging, so you can ^Z and stop the process, */
Packit Service a1973e
	/* inspect /proc to see if it's right */
Packit Service a1973e
	sleep( 1 );
Packit Service a1973e
Packit Service a1973e
	dlclose( handle );
Packit Service a1973e
Packit Service a1973e
	}
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
	test_pass( __FILE__ );
Packit Service a1973e
Packit Service a1973e
	return 0;
Packit Service a1973e
Packit Service a1973e
}