95 lines
2.5 KiB
C
95 lines
2.5 KiB
C
|
/****************************************************************
|
||
|
* *
|
||
|
* Copyright 2009, 2011 Fidelity Information Services, Inc *
|
||
|
* *
|
||
|
* This source code contains the intellectual property *
|
||
|
* of its copyright holder(s), and is made available *
|
||
|
* under a license. If you do not know the terms of *
|
||
|
* the license, please stop and do not read further. *
|
||
|
* *
|
||
|
****************************************************************/
|
||
|
|
||
|
#include "mdef.h"
|
||
|
|
||
|
#include "gtm_string.h"
|
||
|
#include "gtm_limits.h"
|
||
|
|
||
|
#include <dlfcn.h>
|
||
|
|
||
|
#include "lv_val.h" /* needed for "fgncal.h" */
|
||
|
#include "fgncal.h" /* needed for COPY_DLLERR_MSG() */
|
||
|
#include "gtmmsg.h"
|
||
|
#include "gtm_stdio.h"
|
||
|
#include "gtm_stdlib.h"
|
||
|
#include "real_len.h"
|
||
|
#include "gtmcrypt.h"
|
||
|
|
||
|
#ifndef GTM_DIST
|
||
|
#define GTM_DIST "gtm_dist"
|
||
|
#endif
|
||
|
|
||
|
GBLREF char dl_err[MAX_ERRSTR_LEN];
|
||
|
GBLREF int4 gbl_encryption_ecode;
|
||
|
|
||
|
void gtmcrypt_entry()
|
||
|
{
|
||
|
char *libname, err_msg[MAX_ERRSTR_LEN];
|
||
|
void_ptr_t handle;
|
||
|
char_ptr_t err_str;
|
||
|
char *gtmcryptlib_fname[] = {
|
||
|
GTMCRYPT_INIT_FNAME,
|
||
|
GTMCRYPT_CLOSE_FNAME,
|
||
|
GTMCRYPT_HASH_GEN_FNAME,
|
||
|
GTMCRYPT_ENCODE_FNAME,
|
||
|
GTMCRYPT_DECODE_FNAME,
|
||
|
GTMCRYPT_GETKEY_BY_NAME,
|
||
|
GTMCRYPT_GETKEY_BY_HASH,
|
||
|
GTMCRYPT_STRERROR
|
||
|
};
|
||
|
void **gtmcryptlib_fptr[] = {
|
||
|
(void **)>mcrypt_init_fnptr,
|
||
|
(void **)>mcrypt_close_fnptr,
|
||
|
(void **)>mcrypt_hash_gen_fnptr,
|
||
|
(void **)>mcrypt_encode_fnptr,
|
||
|
(void **)>mcrypt_decode_fnptr,
|
||
|
(void **)>mcrypt_getkey_by_name_fnptr,
|
||
|
(void **)>mcrypt_getkey_by_hash_fnptr,
|
||
|
(void **)>mcrypt_strerror_fnptr
|
||
|
};
|
||
|
int findx;
|
||
|
int num_dlsyms = SIZEOF(gtmcryptlib_fptr) / SIZEOF(gtmcryptlib_fptr[0]); /* number of functions in library */
|
||
|
void *fptr;
|
||
|
char *gtm_dist_path;
|
||
|
char libpath[GTM_PATH_MAX];
|
||
|
|
||
|
error_def(ERR_CRYPTDLNOOPEN);
|
||
|
error_def(ERR_GTMDISTUNDEF);
|
||
|
if (NULL == (gtm_dist_path = getenv(GTM_DIST)))
|
||
|
rts_error(VARLSTCNT(1) ERR_GTMDISTUNDEF);
|
||
|
|
||
|
memset(libpath, 0, GTM_PATH_MAX);
|
||
|
SNPRINTF(libpath, GTM_PATH_MAX, "%s/%s/%s", gtm_dist_path, "plugin", GTMCRYPT_LIBNAME);
|
||
|
|
||
|
gbl_encryption_ecode = 0;
|
||
|
handle = dlopen(libpath, GTMCRYPT_LIBFLAGS);
|
||
|
if (NULL == handle)
|
||
|
{
|
||
|
COPY_DLLERR_MSG(err_str, dl_err);
|
||
|
gbl_encryption_ecode = ERR_CRYPTDLNOOPEN; /* library initialization failed */
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
for(findx = 0; findx < num_dlsyms; ++findx)
|
||
|
{
|
||
|
fptr = (void *)dlsym(handle, gtmcryptlib_fname[findx]);
|
||
|
if (NULL == fptr)
|
||
|
{
|
||
|
COPY_DLLERR_MSG(err_str, dl_err);
|
||
|
gbl_encryption_ecode = ERR_CRYPTDLNOOPEN; /* library initialization failed */
|
||
|
return;
|
||
|
}
|
||
|
*gtmcryptlib_fptr[findx] = fptr;
|
||
|
}
|
||
|
return;
|
||
|
}
|