aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/dso/dso_lib.c
diff options
context:
space:
mode:
authorGeoff Thorpe <geoff@openssl.org>2000-06-16 10:45:36 +0000
committerGeoff Thorpe <geoff@openssl.org>2000-06-16 10:45:36 +0000
commite9a68cfbc38922e167697cf385e664b6dd7493bd (patch)
tree81dca625d177d3428504390dff3c27cb6772d9d2 /crypto/dso/dso_lib.c
parentd3ed8ceb3d5f4f6318e96a147433cb1b09bec211 (diff)
downloadopenssl-e9a68cfbc38922e167697cf385e664b6dd7493bd.tar.gz
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).
Diffstat (limited to 'crypto/dso/dso_lib.c')
-rw-r--r--crypto/dso/dso_lib.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/crypto/dso/dso_lib.c b/crypto/dso/dso_lib.c
index 861f5fb84e..d1d50cc5e6 100644
--- a/crypto/dso/dso_lib.c
+++ b/crypto/dso/dso_lib.c
@@ -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 */