Currently the DSO_METHOD interface has one entry point to bind all
"symbols" including functions (of all prototypes( and variables. Whilst casting any function type to another violates ANSI C (I believe), it is a necessary evil in shared-library APIs. However, it is quite conceivable that functions in general and data symbols could very well be represented differently to each other on some systems, as Bodo said; > Since the function/object distinction is a lot more likely to be > important on real-life platforms supporting DSO *and* it can be quite > easily done *and* it will silence compilers that don't like > assignments from void pointers to function pointer variables, why > not do it? I agree. So this change splits the "dso_bind" handler in DSO_METHOD into "dso_bind_var" and "dso_bind_func". Similarly the exported function DSO_bind() has been split in two. I've also put together changes for the various DSO_METHOD implementations, but so far only DSO_dlfcn() has been tested. BTW: The prototype for dso_bind had been a bit strange so I've taken the opportunity to change its shape (in both variations). Also, the README has been updated - particularly with a note about using customised native name-translation for shared libraries (and that you can't do it yet).
This commit is contained in:
parent
d3ed8ceb3d
commit
e9a68cfbc3
@ -1,12 +1,15 @@
|
||||
TODO
|
||||
----
|
||||
|
||||
Get a fix on how the paths should be handled. For now, flags == 0
|
||||
and this is currently just passing strings directly onto the
|
||||
underlying system calls and letting them do what they want with
|
||||
the paths. However, it may be desirable to implement flags that
|
||||
control the way the loading is performed (or attempted), and I
|
||||
invisage that DSO_ctrl() will be used to control this.
|
||||
Find a way where name-translation can be done in a way that is
|
||||
sensitive to particular methods (ie. generic code could still do
|
||||
different path/filename substitutions on win32 to what it does on
|
||||
*nix) but doesn't assume some canonical form. Already one case
|
||||
exists where the "blah -> (libblah.so,blah.dll)" mapping doesn't
|
||||
suffice. I suspect a callback with an enumerated (or string?)
|
||||
parameter could be the way to go here ... DSO_ctrl the callback
|
||||
into place and it can be invoked to handle name translation with
|
||||
some clue to the calling code as to what kind of system it is.
|
||||
|
||||
NOTES
|
||||
-----
|
||||
@ -18,5 +21,4 @@ according to their man page, prefer developers to move to that.
|
||||
I'll leave Richard's changes there as I guess dso_dl is needed
|
||||
for HPUX10.20.
|
||||
|
||||
[G-T]
|
||||
|
||||
|
@ -80,6 +80,8 @@ extern "C" {
|
||||
*/
|
||||
#define DSO_FLAG_NAME_TRANSLATION 0x01
|
||||
|
||||
typedef void (*DSO_FUNC_TYPE)(void);
|
||||
|
||||
typedef struct dso_st DSO;
|
||||
|
||||
typedef struct dso_meth_st
|
||||
@ -89,13 +91,22 @@ typedef struct dso_meth_st
|
||||
int (*dso_load)(DSO *dso, const char *filename);
|
||||
/* Unloads a shared library */
|
||||
int (*dso_unload)(DSO *dso);
|
||||
/* Binds a function, variable, or whatever */
|
||||
int (*dso_bind)(DSO *dso, const char *symname, void **symptr);
|
||||
/* Binds a variable */
|
||||
void *(*dso_bind_var)(DSO *dso, const char *symname);
|
||||
/* Binds a function - assumes a return type of DSO_FUNC_TYPE.
|
||||
* This should be cast to the real function prototype by the
|
||||
* caller. Platforms that don't have compatible representations
|
||||
* for different prototypes (this is possible within ANSI C)
|
||||
* are highly unlikely to have shared libraries at all, let
|
||||
* alone a DSO_METHOD implemented for them. */
|
||||
DSO_FUNC_TYPE (*dso_bind_func)(DSO *dso, const char *symname);
|
||||
|
||||
/* I don't think this would actually be used in any circumstances. */
|
||||
#if 0
|
||||
/* Unbinds a symbol */
|
||||
int (*dso_unbind)(DSO *dso, char *symname, void *symptr);
|
||||
/* Unbinds a variable */
|
||||
int (*dso_unbind_var)(DSO *dso, char *symname, void *symptr);
|
||||
/* Unbinds a function */
|
||||
int (*dso_unbind_func)(DSO *dso, char *symname, DSO_FUNC_TYPE symptr);
|
||||
#endif
|
||||
/* The generic (yuck) "ctrl()" function. NB: Negative return
|
||||
* values (rather than zero) indicate errors. */
|
||||
@ -146,9 +157,11 @@ DSO_METHOD *DSO_set_method(DSO *dso, DSO_METHOD *meth);
|
||||
* DSO_ctrl(dso, DSO_CTRL_SET_FLAGS, flags, NULL); */
|
||||
DSO *DSO_load(DSO *dso, const char *filename, DSO_METHOD *meth, int flags);
|
||||
|
||||
/* This function binds to a function, variable, whatever inside a
|
||||
* shared library. */
|
||||
void *DSO_bind(DSO *dso, const char *symname);
|
||||
/* This function binds to a variable inside a shared library. */
|
||||
void *DSO_bind_var(DSO *dso, const char *symname);
|
||||
|
||||
/* This function binds to a function inside a shared library. */
|
||||
DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname);
|
||||
|
||||
/* This method is the default, but will beg, borrow, or steal whatever
|
||||
* method should be the default on any particular platform (including
|
||||
@ -182,35 +195,39 @@ void ERR_load_DSO_strings(void);
|
||||
/* Error codes for the DSO functions. */
|
||||
|
||||
/* Function codes. */
|
||||
#define DSO_F_DLFCN_BIND 100
|
||||
#define DSO_F_DLFCN_LOAD 101
|
||||
#define DSO_F_DLFCN_UNLOAD 102
|
||||
#define DSO_F_DLFCN_CTRL 103
|
||||
#define DSO_F_DL_BIND 104
|
||||
#define DSO_F_DL_LOAD 105
|
||||
#define DSO_F_DL_UNLOAD 106
|
||||
#define DSO_F_DLFCN_BIND_FUNC 100
|
||||
#define DSO_F_DLFCN_BIND_VAR 101
|
||||
#define DSO_F_DLFCN_CTRL 102
|
||||
#define DSO_F_DLFCN_LOAD 103
|
||||
#define DSO_F_DLFCN_UNLOAD 104
|
||||
#define DSO_F_DL_BIND_FUNC 105
|
||||
#define DSO_F_DL_BIND_VAR 106
|
||||
#define DSO_F_DL_CTRL 107
|
||||
#define DSO_F_DSO_BIND 108
|
||||
#define DSO_F_DSO_FREE 109
|
||||
#define DSO_F_DSO_LOAD 110
|
||||
#define DSO_F_DSO_NEW_METHOD 111
|
||||
#define DSO_F_DSO_UP 112
|
||||
#define DSO_F_DSO_CTRL 113
|
||||
#define DSO_F_WIN32_BIND 114
|
||||
#define DSO_F_WIN32_LOAD 115
|
||||
#define DSO_F_WIN32_UNLOAD 116
|
||||
#define DSO_F_WIN32_CTRL 117
|
||||
#define DSO_F_DL_LOAD 108
|
||||
#define DSO_F_DL_UNLOAD 109
|
||||
#define DSO_F_DSO_BIND_FUNC 110
|
||||
#define DSO_F_DSO_BIND_VAR 111
|
||||
#define DSO_F_DSO_CTRL 112
|
||||
#define DSO_F_DSO_FREE 113
|
||||
#define DSO_F_DSO_LOAD 114
|
||||
#define DSO_F_DSO_NEW_METHOD 115
|
||||
#define DSO_F_DSO_UP 116
|
||||
#define DSO_F_WIN32_BIND_FUNC 117
|
||||
#define DSO_F_WIN32_BIND_VAR 118
|
||||
#define DSO_F_WIN32_CTRL 119
|
||||
#define DSO_F_WIN32_LOAD 120
|
||||
#define DSO_F_WIN32_UNLOAD 121
|
||||
|
||||
/* Reason codes. */
|
||||
#define DSO_R_FINISH_FAILED 100
|
||||
#define DSO_R_LOAD_FAILED 101
|
||||
#define DSO_R_NULL_HANDLE 102
|
||||
#define DSO_R_STACK_ERROR 103
|
||||
#define DSO_R_SYM_FAILURE 104
|
||||
#define DSO_R_UNLOAD_FAILED 105
|
||||
#define DSO_R_UNSUPPORTED 106
|
||||
#define DSO_R_UNKNOWN_COMMAND 107
|
||||
#define DSO_R_CTRL_FAILED 108
|
||||
#define DSO_R_CTRL_FAILED 100
|
||||
#define DSO_R_FINISH_FAILED 101
|
||||
#define DSO_R_LOAD_FAILED 102
|
||||
#define DSO_R_NULL_HANDLE 103
|
||||
#define DSO_R_STACK_ERROR 104
|
||||
#define DSO_R_SYM_FAILURE 105
|
||||
#define DSO_R_UNKNOWN_COMMAND 106
|
||||
#define DSO_R_UNLOAD_FAILED 107
|
||||
#define DSO_R_UNSUPPORTED 108
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -74,9 +74,11 @@ DSO_METHOD *DSO_METHOD_dl(void)
|
||||
|
||||
static int dl_load(DSO *dso, const char *filename);
|
||||
static int dl_unload(DSO *dso);
|
||||
static int dl_bind(DSO *dso, const char *symname, void **symptr);
|
||||
static void *dl_bind_var(DSO *dso, const char *symname);
|
||||
static DSO_FUNC_TYPE dl_bind_func(DSO *dso, const char *symname);
|
||||
#if 0
|
||||
static int dl_unbind(DSO *dso, char *symname, void *symptr);
|
||||
static int dl_unbind_var(DSO *dso, char *symname, void *symptr);
|
||||
static int dl_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr);
|
||||
static int dl_init(DSO *dso);
|
||||
static int dl_finish(DSO *dso);
|
||||
#endif
|
||||
@ -86,10 +88,12 @@ static DSO_METHOD dso_meth_dl = {
|
||||
"OpenSSL 'dl' shared library method",
|
||||
dl_load,
|
||||
dl_unload,
|
||||
dl_bind,
|
||||
dl_bind_var,
|
||||
dl_bind_func,
|
||||
/* For now, "unbind" doesn't exist */
|
||||
#if 0
|
||||
NULL, /* unbind */
|
||||
NULL, /* unbind_var */
|
||||
NULL, /* unbind_func */
|
||||
#endif
|
||||
dl_ctrl,
|
||||
NULL, /* init */
|
||||
@ -162,34 +166,62 @@ static int dl_unload(DSO *dso)
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int dl_bind(DSO *dso, const char *symname, void **symptr)
|
||||
static void *dl_bind_var(DSO *dso, const char *symname)
|
||||
{
|
||||
shl_t ptr;
|
||||
void *sym;
|
||||
|
||||
if((dso == NULL) || (symptr == NULL) || (symname == NULL))
|
||||
if((dso == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_DL_BIND,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(0);
|
||||
DSOerr(DSO_F_DL_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(NULL);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_DL_BIND,DSO_R_STACK_ERROR);
|
||||
return(0);
|
||||
DSOerr(DSO_F_DL_BIND_VAR,DSO_R_STACK_ERROR);
|
||||
return(NULL);
|
||||
}
|
||||
ptr = (shl_t)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
|
||||
if(ptr == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DL_BIND,DSO_R_NULL_HANDLE);
|
||||
return(0);
|
||||
DSOerr(DSO_F_DL_BIND_VAR,DSO_R_NULL_HANDLE);
|
||||
return(NULL);
|
||||
}
|
||||
if (shl_findsym(ptr, symname, TYPE_UNDEFINED, &sym) < 0)
|
||||
{
|
||||
DSOerr(DSO_F_DL_BIND,DSO_R_SYM_FAILURE);
|
||||
return(0);
|
||||
DSOerr(DSO_F_DL_BIND_VAR,DSO_R_SYM_FAILURE);
|
||||
return(NULL);
|
||||
}
|
||||
*symptr = sym;
|
||||
return(1);
|
||||
return(sym);
|
||||
}
|
||||
|
||||
static DSO_FUNC_TYPE dl_bind_func(DSO *dso, const char *symname)
|
||||
{
|
||||
shl_t ptr;
|
||||
void *sym;
|
||||
|
||||
if((dso == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_DL_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(NULL);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_DL_BIND_FUNC,DSO_R_STACK_ERROR);
|
||||
return(NULL);
|
||||
}
|
||||
ptr = (shl_t)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
|
||||
if(ptr == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DL_BIND_FUNC,DSO_R_NULL_HANDLE);
|
||||
return(NULL);
|
||||
}
|
||||
if (shl_findsym(ptr, symname, TYPE_UNDEFINED, &sym) < 0)
|
||||
{
|
||||
DSOerr(DSO_F_DL_BIND_FUNC,DSO_R_SYM_FAILURE);
|
||||
return(NULL);
|
||||
}
|
||||
return((DSO_FUNC_TYPE)sym);
|
||||
}
|
||||
|
||||
static int dl_ctrl(DSO *dso, int cmd, long larg, void *parg)
|
||||
|
@ -76,7 +76,8 @@ DSO_METHOD *DSO_METHOD_dlfcn(void)
|
||||
|
||||
static int dlfcn_load(DSO *dso, const char *filename);
|
||||
static int dlfcn_unload(DSO *dso);
|
||||
static int dlfcn_bind(DSO *dso, const char *symname, void **symptr);
|
||||
static void *dlfcn_bind_var(DSO *dso, const char *symname);
|
||||
static DSO_FUNC_TYPE dlfcn_bind_func(DSO *dso, const char *symname);
|
||||
#if 0
|
||||
static int dlfcn_unbind(DSO *dso, char *symname, void *symptr);
|
||||
static int dlfcn_init(DSO *dso);
|
||||
@ -88,10 +89,12 @@ static DSO_METHOD dso_meth_dlfcn = {
|
||||
"OpenSSL 'dlfcn' shared library method",
|
||||
dlfcn_load,
|
||||
dlfcn_unload,
|
||||
dlfcn_bind,
|
||||
dlfcn_bind_var,
|
||||
dlfcn_bind_func,
|
||||
/* For now, "unbind" doesn't exist */
|
||||
#if 0
|
||||
NULL, /* unbind */
|
||||
NULL, /* unbind_var */
|
||||
NULL, /* unbind_func */
|
||||
#endif
|
||||
dlfcn_ctrl,
|
||||
NULL, /* init */
|
||||
@ -167,34 +170,63 @@ static int dlfcn_unload(DSO *dso)
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int dlfcn_bind(DSO *dso, const char *symname, void **symptr)
|
||||
static void *dlfcn_bind_var(DSO *dso, const char *symname)
|
||||
{
|
||||
void *ptr, *sym;
|
||||
|
||||
if((dso == NULL) || (symptr == NULL) || (symname == NULL))
|
||||
if((dso == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_BIND,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(0);
|
||||
DSOerr(DSO_F_DLFCN_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(NULL);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_BIND,DSO_R_STACK_ERROR);
|
||||
return(0);
|
||||
DSOerr(DSO_F_DLFCN_BIND_VAR,DSO_R_STACK_ERROR);
|
||||
return(NULL);
|
||||
}
|
||||
ptr = (void *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
|
||||
if(ptr == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_BIND,DSO_R_NULL_HANDLE);
|
||||
return(0);
|
||||
DSOerr(DSO_F_DLFCN_BIND_VAR,DSO_R_NULL_HANDLE);
|
||||
return(NULL);
|
||||
}
|
||||
sym = dlsym(ptr, symname);
|
||||
if(sym == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_BIND,DSO_R_SYM_FAILURE);
|
||||
return(0);
|
||||
DSOerr(DSO_F_DLFCN_BIND_VAR,DSO_R_SYM_FAILURE);
|
||||
return(NULL);
|
||||
}
|
||||
*symptr = sym;
|
||||
return(1);
|
||||
return(sym);
|
||||
}
|
||||
|
||||
static DSO_FUNC_TYPE dlfcn_bind_func(DSO *dso, const char *symname)
|
||||
{
|
||||
void *ptr;
|
||||
DSO_FUNC_TYPE sym;
|
||||
|
||||
if((dso == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(NULL);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_STACK_ERROR);
|
||||
return(NULL);
|
||||
}
|
||||
ptr = (void *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
|
||||
if(ptr == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_NULL_HANDLE);
|
||||
return(NULL);
|
||||
}
|
||||
sym = (DSO_FUNC_TYPE)dlsym(ptr, symname);
|
||||
if(sym == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_SYM_FAILURE);
|
||||
return(NULL);
|
||||
}
|
||||
return(sym);
|
||||
}
|
||||
|
||||
static long dlfcn_ctrl(DSO *dso, int cmd, long larg, void *parg)
|
||||
|
@ -66,38 +66,42 @@
|
||||
#ifndef NO_ERR
|
||||
static ERR_STRING_DATA DSO_str_functs[]=
|
||||
{
|
||||
{ERR_PACK(0,DSO_F_DLFCN_BIND,0), "dlfcn_bind"},
|
||||
{ERR_PACK(0,DSO_F_DLFCN_LOAD,0), "dlfcn_load"},
|
||||
{ERR_PACK(0,DSO_F_DLFCN_UNLOAD,0), "dlfcn_unload"},
|
||||
{ERR_PACK(0,DSO_F_DLFCN_CTRL,0), "dlfcn_ctrl"},
|
||||
{ERR_PACK(0,DSO_F_DL_BIND,0), "dl_bind"},
|
||||
{ERR_PACK(0,DSO_F_DL_LOAD,0), "dl_load"},
|
||||
{ERR_PACK(0,DSO_F_DL_UNLOAD,0), "dl_unload"},
|
||||
{ERR_PACK(0,DSO_F_DL_CTRL,0), "dl_ctrl"},
|
||||
{ERR_PACK(0,DSO_F_DSO_BIND,0), "DSO_bind"},
|
||||
{ERR_PACK(0,DSO_F_DLFCN_BIND_FUNC,0), "DLFCN_BIND_FUNC"},
|
||||
{ERR_PACK(0,DSO_F_DLFCN_BIND_VAR,0), "DLFCN_BIND_VAR"},
|
||||
{ERR_PACK(0,DSO_F_DLFCN_CTRL,0), "DLFCN_CTRL"},
|
||||
{ERR_PACK(0,DSO_F_DLFCN_LOAD,0), "DLFCN_LOAD"},
|
||||
{ERR_PACK(0,DSO_F_DLFCN_UNLOAD,0), "DLFCN_UNLOAD"},
|
||||
{ERR_PACK(0,DSO_F_DL_BIND_FUNC,0), "DL_BIND_FUNC"},
|
||||
{ERR_PACK(0,DSO_F_DL_BIND_VAR,0), "DL_BIND_VAR"},
|
||||
{ERR_PACK(0,DSO_F_DL_CTRL,0), "DL_CTRL"},
|
||||
{ERR_PACK(0,DSO_F_DL_LOAD,0), "DL_LOAD"},
|
||||
{ERR_PACK(0,DSO_F_DL_UNLOAD,0), "DL_UNLOAD"},
|
||||
{ERR_PACK(0,DSO_F_DSO_BIND_FUNC,0), "DSO_bind_func"},
|
||||
{ERR_PACK(0,DSO_F_DSO_BIND_VAR,0), "DSO_bind_var"},
|
||||
{ERR_PACK(0,DSO_F_DSO_CTRL,0), "DSO_ctrl"},
|
||||
{ERR_PACK(0,DSO_F_DSO_FREE,0), "DSO_free"},
|
||||
{ERR_PACK(0,DSO_F_DSO_LOAD,0), "DSO_load"},
|
||||
{ERR_PACK(0,DSO_F_DSO_NEW_METHOD,0), "DSO_new_method"},
|
||||
{ERR_PACK(0,DSO_F_DSO_UP,0), "DSO_up"},
|
||||
{ERR_PACK(0,DSO_F_DSO_CTRL,0), "DSO_ctrl"},
|
||||
{ERR_PACK(0,DSO_F_WIN32_BIND,0), "win32_bind"},
|
||||
{ERR_PACK(0,DSO_F_WIN32_LOAD,0), "win32_load"},
|
||||
{ERR_PACK(0,DSO_F_WIN32_UNLOAD,0), "win32_unload"},
|
||||
{ERR_PACK(0,DSO_F_WIN32_CTRL,0), "win32_ctrl"},
|
||||
{ERR_PACK(0,DSO_F_WIN32_BIND_FUNC,0), "WIN32_BIND_FUNC"},
|
||||
{ERR_PACK(0,DSO_F_WIN32_BIND_VAR,0), "WIN32_BIND_VAR"},
|
||||
{ERR_PACK(0,DSO_F_WIN32_CTRL,0), "WIN32_CTRL"},
|
||||
{ERR_PACK(0,DSO_F_WIN32_LOAD,0), "WIN32_LOAD"},
|
||||
{ERR_PACK(0,DSO_F_WIN32_UNLOAD,0), "WIN32_UNLOAD"},
|
||||
{0,NULL}
|
||||
};
|
||||
|
||||
static ERR_STRING_DATA DSO_str_reasons[]=
|
||||
{
|
||||
{DSO_R_CTRL_FAILED ,"control command failed"},
|
||||
{DSO_R_FINISH_FAILED ,"cleanup method function failed"},
|
||||
{DSO_R_LOAD_FAILED ,"could not load the shared library"},
|
||||
{DSO_R_NULL_HANDLE ,"a null shared library handle was used"},
|
||||
{DSO_R_STACK_ERROR ,"the meth_data stack is corrupt"},
|
||||
{DSO_R_SYM_FAILURE ,"could not bind to the requested symbol name"},
|
||||
{DSO_R_UNKNOWN_COMMAND ,"unknown control command"},
|
||||
{DSO_R_UNLOAD_FAILED ,"could not unload the shared library"},
|
||||
{DSO_R_UNSUPPORTED ,"functionality not supported"},
|
||||
{DSO_R_UNKNOWN_COMMAND ,"unknown control command"},
|
||||
{DSO_R_CTRL_FAILED ,"control command failed"},
|
||||
{0,NULL}
|
||||
};
|
||||
|
||||
|
@ -236,23 +236,46 @@ DSO *DSO_load(DSO *dso, const char *filename, DSO_METHOD *meth, int flags)
|
||||
return(ret);
|
||||
}
|
||||
|
||||
void *DSO_bind(DSO *dso, const char *symname)
|
||||
void *DSO_bind_var(DSO *dso, const char *symname)
|
||||
{
|
||||
void *ret = NULL;
|
||||
|
||||
if((dso == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_DSO_BIND,ERR_R_PASSED_NULL_PARAMETER);
|
||||
DSOerr(DSO_F_DSO_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(NULL);
|
||||
}
|
||||
if(dso->meth->dso_bind == NULL)
|
||||
if(dso->meth->dso_bind_var == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DSO_BIND,DSO_R_UNSUPPORTED);
|
||||
DSOerr(DSO_F_DSO_BIND_VAR,DSO_R_UNSUPPORTED);
|
||||
return(NULL);
|
||||
}
|
||||
if(!dso->meth->dso_bind(dso, symname, &ret))
|
||||
if((ret = dso->meth->dso_bind_var(dso, symname)) == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DSO_BIND,DSO_R_SYM_FAILURE);
|
||||
DSOerr(DSO_F_DSO_BIND_VAR,DSO_R_SYM_FAILURE);
|
||||
return(NULL);
|
||||
}
|
||||
/* Success */
|
||||
return(ret);
|
||||
}
|
||||
|
||||
DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname)
|
||||
{
|
||||
DSO_FUNC_TYPE ret = NULL;
|
||||
|
||||
if((dso == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_DSO_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(NULL);
|
||||
}
|
||||
if(dso->meth->dso_bind_func == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DSO_BIND_FUNC,DSO_R_UNSUPPORTED);
|
||||
return(NULL);
|
||||
}
|
||||
if((ret = dso->meth->dso_bind_func(dso, symname)) == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DSO_BIND_FUNC,DSO_R_SYM_FAILURE);
|
||||
return(NULL);
|
||||
}
|
||||
/* Success */
|
||||
|
@ -67,10 +67,12 @@ static DSO_METHOD dso_meth_null = {
|
||||
"NULL shared library method",
|
||||
NULL, /* load */
|
||||
NULL, /* unload */
|
||||
NULL, /* bind */
|
||||
NULL, /* bind_var */
|
||||
NULL, /* bind_func */
|
||||
/* For now, "unbind" doesn't exist */
|
||||
#if 0
|
||||
NULL, /* unbind */
|
||||
NULL, /* unbind_var */
|
||||
NULL, /* unbind_func */
|
||||
#endif
|
||||
NULL, /* ctrl */
|
||||
NULL, /* init */
|
||||
|
@ -73,9 +73,11 @@ DSO_METHOD *DSO_METHOD_win32(void)
|
||||
|
||||
static int win32_load(DSO *dso, const char *filename);
|
||||
static int win32_unload(DSO *dso);
|
||||
static int win32_bind(DSO *dso, const char *symname, void **symptr);
|
||||
static void *win32_bind_var(DSO *dso, const char *symname);
|
||||
static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname);
|
||||
#if 0
|
||||
static int win32_unbind(DSO *dso, char *symname, void *symptr);
|
||||
static int win32_unbind_var(DSO *dso, char *symname, void *symptr);
|
||||
static int win32_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr);
|
||||
static int win32_init(DSO *dso);
|
||||
static int win32_finish(DSO *dso);
|
||||
#endif
|
||||
@ -85,10 +87,12 @@ static DSO_METHOD dso_meth_win32 = {
|
||||
"OpenSSL 'win32' shared library method",
|
||||
win32_load,
|
||||
win32_unload,
|
||||
win32_bind,
|
||||
win32_bind_var,
|
||||
win32_bind_func,
|
||||
/* For now, "unbind" doesn't exist */
|
||||
#if 0
|
||||
NULL, /* unbind */
|
||||
NULL, /* unbind_var */
|
||||
NULL, /* unbind_func */
|
||||
#endif
|
||||
win32_ctrl,
|
||||
NULL, /* init */
|
||||
@ -180,35 +184,66 @@ static int win32_unload(DSO *dso)
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int win32_bind(DSO *dso, const char *symname, void **symptr)
|
||||
/* Using GetProcAddress for variables? TODO: Check this out in
|
||||
* the Win32 API docs, there's probably a variant for variables. */
|
||||
static void *win32_bind_var(DSO *dso, const char *symname)
|
||||
{
|
||||
HINSTANCE *ptr;
|
||||
void *sym;
|
||||
|
||||
if((dso == NULL) || (symptr == NULL) || (symname == NULL))
|
||||
if((dso == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_BIND,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(0);
|
||||
DSOerr(DSO_F_WIN32_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(NULL);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_BIND,DSO_R_STACK_ERROR);
|
||||
return(0);
|
||||
DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_STACK_ERROR);
|
||||
return(NULL);
|
||||
}
|
||||
ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
|
||||
if(ptr == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_BIND,DSO_R_NULL_HANDLE);
|
||||
return(0);
|
||||
DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_NULL_HANDLE);
|
||||
return(NULL);
|
||||
}
|
||||
sym = GetProcAddress(*ptr, symname);
|
||||
if(sym == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_BIND,DSO_R_SYM_FAILURE);
|
||||
return(0);
|
||||
DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_SYM_FAILURE);
|
||||
return(NULL);
|
||||
}
|
||||
*symptr = sym;
|
||||
return(1);
|
||||
return(sym);
|
||||
}
|
||||
|
||||
static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname)
|
||||
{
|
||||
HINSTANCE *ptr;
|
||||
void *sym;
|
||||
|
||||
if((dso == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(NULL);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_STACK_ERROR);
|
||||
return(NULL);
|
||||
}
|
||||
ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
|
||||
if(ptr == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_NULL_HANDLE);
|
||||
return(NULL);
|
||||
}
|
||||
sym = GetProcAddress(*ptr, symname);
|
||||
if(sym == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_SYM_FAILURE);
|
||||
return(NULL);
|
||||
}
|
||||
return((DSO_FUNC_TYPE)sym);
|
||||
}
|
||||
|
||||
static long win32_ctrl(DSO *dso, int cmd, long larg, void *parg)
|
||||
|
@ -1765,7 +1765,7 @@ DSO_get_default_method 2265
|
||||
DSO_get_method 2266
|
||||
DSO_set_method 2267
|
||||
DSO_load 2268
|
||||
DSO_bind 2269
|
||||
DSO_bind_var 2269
|
||||
DSO_METHOD_null 2270
|
||||
DSO_METHOD_openssl 2271
|
||||
DSO_METHOD_dlfcn 2272
|
||||
@ -1809,3 +1809,4 @@ X509_email_free 2405
|
||||
i2d_RSA_NET 2406
|
||||
d2i_RSA_NET_2 2407
|
||||
d2i_RSA_NET 2408
|
||||
DSO_bind_func 2409
|
||||
|
Loading…
x
Reference in New Issue
Block a user