This is a set of startup code for the DSO support, it's not yet linked into
the build process (an upcoming commit no doubt), and is very much *new* code - what that means is that it compiles ok - usually. It certainly doesn't mean it runs well or even properly yet. Please don't muck round with this unless you're looking to help out and hunt bugs. :-) Currently this code doesn't have any support for controlling the "load" behaviour (eg. paths, filename translations, etc). That'll be handled using DSO_ctrl() and various flags, once we work out a sensible set of flags.
This commit is contained in:
parent
02859fb74a
commit
8f4fac7f96
116
crypto/dso/Makefile.ssl
Normal file
116
crypto/dso/Makefile.ssl
Normal file
@ -0,0 +1,116 @@
|
||||
#
|
||||
# SSLeay/crypto/dso/Makefile
|
||||
#
|
||||
|
||||
DIR= dso
|
||||
TOP= ../..
|
||||
CC= cc
|
||||
INCLUDES= -I.. -I../../include
|
||||
CFLAG=-g
|
||||
INSTALL_PREFIX=
|
||||
OPENSSLDIR= /usr/local/ssl
|
||||
INSTALLTOP=/usr/local/ssl
|
||||
MAKE= make -f Makefile.ssl
|
||||
MAKEDEPEND= $(TOP)/util/domd $(TOP)
|
||||
MAKEFILE= Makefile.ssl
|
||||
AR= ar r
|
||||
|
||||
CFLAGS= $(INCLUDES) $(CFLAG)
|
||||
|
||||
GENERAL=Makefile
|
||||
TEST=
|
||||
APPS=
|
||||
|
||||
LIB=$(TOP)/libcrypto.a
|
||||
LIBSRC= dso_dl.c dso_dlfcn.c dso_err.c dso_lib.c dso_null.c \
|
||||
dso_openssl.c dso_win32.c
|
||||
LIBOBJ= dso_dl.o dso_dlfcn.o dso_err.o dso_lib.o dso_null.o \
|
||||
dso_openssl.o dso_win32.o
|
||||
|
||||
SRC= $(LIBSRC)
|
||||
|
||||
EXHEADER= dso.h
|
||||
HEADER= $(EXHEADER)
|
||||
|
||||
ALL= $(GENERAL) $(SRC) $(HEADER)
|
||||
|
||||
top:
|
||||
(cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
|
||||
|
||||
all: lib
|
||||
|
||||
lib: $(LIBOBJ)
|
||||
$(AR) $(LIB) $(LIBOBJ)
|
||||
$(RANLIB) $(LIB)
|
||||
@touch lib
|
||||
|
||||
files:
|
||||
$(PERL) $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
|
||||
|
||||
links:
|
||||
@$(TOP)/util/point.sh Makefile.ssl Makefile
|
||||
@$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
|
||||
@$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST)
|
||||
@$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS)
|
||||
|
||||
install:
|
||||
@for i in $(EXHEADER) ; \
|
||||
do \
|
||||
(cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
|
||||
chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
|
||||
done;
|
||||
|
||||
tags:
|
||||
ctags $(SRC)
|
||||
|
||||
tests:
|
||||
|
||||
lint:
|
||||
lint -DLINT $(INCLUDES) $(SRC)>fluff
|
||||
|
||||
depend:
|
||||
$(MAKEDEPEND) $(INCLUDES) $(DEPFLAG) $(PROGS) $(LIBSRC)
|
||||
|
||||
dclean:
|
||||
$(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
|
||||
mv -f Makefile.new $(MAKEFILE)
|
||||
|
||||
clean:
|
||||
rm -f *.o */*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
|
||||
|
||||
# DO NOT DELETE THIS LINE -- make depend depends on it.
|
||||
|
||||
dso_dlfcn.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
dso_dlfcn.o: ../../include/openssl/crypto.h ../../include/openssl/dso.h
|
||||
dso_dlfcn.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||
dso_dlfcn.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||
dso_dlfcn.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
|
||||
dso_dlfcn.o: ../../include/openssl/stack.h ../cryptlib.h
|
||||
dso_err.o: ../../include/openssl/crypto.h ../../include/openssl/dso.h
|
||||
dso_err.o: ../../include/openssl/err.h ../../include/openssl/opensslv.h
|
||||
dso_err.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
|
||||
dso_lib.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
dso_lib.o: ../../include/openssl/crypto.h ../../include/openssl/dso.h
|
||||
dso_lib.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||
dso_lib.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||
dso_lib.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
|
||||
dso_lib.o: ../../include/openssl/stack.h ../cryptlib.h
|
||||
dso_null.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
dso_null.o: ../../include/openssl/crypto.h ../../include/openssl/dso.h
|
||||
dso_null.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||
dso_null.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||
dso_null.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
|
||||
dso_null.o: ../../include/openssl/stack.h ../cryptlib.h
|
||||
dso_openssl.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
dso_openssl.o: ../../include/openssl/crypto.h ../../include/openssl/dso.h
|
||||
dso_openssl.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||
dso_openssl.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||
dso_openssl.o: ../../include/openssl/opensslv.h
|
||||
dso_openssl.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
|
||||
dso_openssl.o: ../cryptlib.h
|
||||
dso_win32.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
dso_win32.o: ../../include/openssl/crypto.h ../../include/openssl/dso.h
|
||||
dso_win32.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
|
||||
dso_win32.o: ../../include/openssl/err.h ../../include/openssl/opensslconf.h
|
||||
dso_win32.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
|
||||
dso_win32.o: ../../include/openssl/stack.h ../cryptlib.h
|
22
crypto/dso/README
Normal file
22
crypto/dso/README
Normal file
@ -0,0 +1,22 @@
|
||||
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.
|
||||
|
||||
NOTES
|
||||
-----
|
||||
|
||||
I've checked out HPUX (well, version 11 at least) and shl_t is
|
||||
a pointer type so it's safe to use in the way it has been in
|
||||
dso_dl.c. On the other hand, HPUX11 support dlfcn too and
|
||||
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]
|
||||
|
191
crypto/dso/dso.h
Normal file
191
crypto/dso/dso.h
Normal file
@ -0,0 +1,191 @@
|
||||
/* dso.h */
|
||||
/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
|
||||
* project 2000.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2000 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HEADER_DSO_H
|
||||
#define HEADER_DSO_H
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct dso_st DSO;
|
||||
|
||||
typedef struct dso_meth_st
|
||||
{
|
||||
const char *name;
|
||||
/* Loads a shared library */
|
||||
int (*dso_load)(DSO *dso, char *filename);
|
||||
/* Unloads a shared library */
|
||||
int (*dso_unload)(DSO *dso);
|
||||
/* Binds a function, variable, or whatever */
|
||||
int (*dso_bind)(DSO *dso, char *symname, void **symptr);
|
||||
|
||||
/* 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);
|
||||
#endif
|
||||
|
||||
int (*init)(DSO *dso);
|
||||
int (*finish)(DSO *dso);
|
||||
} DSO_METHOD;
|
||||
|
||||
/**********************************************************************/
|
||||
/* The low-level handle type used to refer to a loaded shared library */
|
||||
|
||||
struct dso_st
|
||||
{
|
||||
DSO_METHOD *meth;
|
||||
/* Standard dlopen uses a (void *). Win32 uses a HANDLE. VMS
|
||||
* doesn't use anything but will need to cache the filename
|
||||
* for use in the dso_bind handler. All in all, let each
|
||||
* method control its own destiny. "Handles" and such go in
|
||||
* a STACK. */
|
||||
STACK *meth_data;
|
||||
int references;
|
||||
int flags;
|
||||
/* For use by applications etc ... use this for your bits'n'pieces,
|
||||
* don't touch meth_data! */
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
};
|
||||
|
||||
|
||||
DSO * DSO_new(void);
|
||||
DSO * DSO_new_method(DSO_METHOD *method);
|
||||
int DSO_free(DSO *dso);
|
||||
int DSO_flags(DSO *dso);
|
||||
int DSO_up(DSO *dso);
|
||||
|
||||
void DSO_set_default_method(DSO_METHOD *meth);
|
||||
DSO_METHOD *DSO_get_default_method(void);
|
||||
DSO_METHOD *DSO_get_method(DSO *dso);
|
||||
DSO_METHOD *DSO_set_method(DSO *dso, DSO_METHOD *meth);
|
||||
|
||||
/* The all-singing all-dancing load function, you normally pass NULL
|
||||
* for the last two parameters. Use DSO_up and DSO_free for reference
|
||||
* count handling. */
|
||||
DSO *DSO_load(DSO *dso, char *filename, DSO_METHOD *meth);
|
||||
|
||||
/* This function binds to a function, variable, whatever inside a
|
||||
* shared library. */
|
||||
void *DSO_bind(DSO *dso, char *symname);
|
||||
|
||||
/* This method is the default, but will beg, borrow, or steal whatever
|
||||
* method should be the default on any particular platform (including
|
||||
* DSO_METH_null() if necessary). */
|
||||
DSO_METHOD *DSO_METHOD_openssl(void);
|
||||
|
||||
/* This method is defined for all platforms - if a platform has no
|
||||
* DSO support then this will be the only method! */
|
||||
DSO_METHOD *DSO_METHOD_null(void);
|
||||
|
||||
/* If DSO_DLFCN is defined, the standard dlfcn.h-style functions
|
||||
* (dlopen, dlclose, dlsym, etc) will be used and incorporated into
|
||||
* this method. If not, this method will return NULL. */
|
||||
DSO_METHOD *DSO_METHOD_dlfcn(void);
|
||||
|
||||
/* If DSO_DL is defined, the standard dl.h-style functions (shl_load,
|
||||
* shl_unload, shl_findsym, etc) will be used and incorporated into
|
||||
* this method. If not, this method will return NULL. */
|
||||
DSO_METHOD *DSO_METHOD_dl(void);
|
||||
|
||||
/* If WIN32 is defined, use DLLs. If not, return NULL. */
|
||||
DSO_METHOD *DSO_METHOD_win32(void);
|
||||
|
||||
void ERR_load_DSO_strings(void);
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
/* The following lines are auto generated by the script mkerr.pl. Any changes
|
||||
* made after this point may be overwritten when the script is next run.
|
||||
*/
|
||||
|
||||
/* 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_DL_BIND 103
|
||||
#define DSO_F_DL_LOAD 104
|
||||
#define DSO_F_DL_UNLOAD 105
|
||||
#define DSO_F_DSO_BIND 106
|
||||
#define DSO_F_DSO_FREE 107
|
||||
#define DSO_F_DSO_LOAD 108
|
||||
#define DSO_F_DSO_NEW_METHOD 109
|
||||
#define DSO_F_DSO_UP 110
|
||||
#define DSO_F_WIN32_BIND 111
|
||||
#define DSO_F_WIN32_LOAD 112
|
||||
#define DSO_F_WIN32_UNLOAD 113
|
||||
|
||||
/* 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
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
182
crypto/dso/dso_dl.c
Normal file
182
crypto/dso/dso_dl.c
Normal file
@ -0,0 +1,182 @@
|
||||
/* dso_dl.c */
|
||||
/* Written by Richard Levitte (levitte@openssl.org) for the OpenSSL
|
||||
* project 2000.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2000 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "cryptlib.h"
|
||||
#include <openssl/dso.h>
|
||||
|
||||
#ifndef DSO_DL
|
||||
DSO_METHOD *DSO_METHOD_dl(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#else
|
||||
|
||||
#include <dl.h>
|
||||
|
||||
static int dl_load(DSO *dso, char *filename);
|
||||
static int dl_unload(DSO *dso);
|
||||
static int dl_bind(DSO *dso, char *symname, void **symptr);
|
||||
#if 0
|
||||
static int dl_unbind(DSO *dso, char *symname, void *symptr);
|
||||
static int dl_init(DSO *dso);
|
||||
static int dl_finish(DSO *dso);
|
||||
#endif
|
||||
|
||||
static DSO_METHOD dso_meth_dl = {
|
||||
"OpenSSL 'dl' shared library method",
|
||||
dl_load,
|
||||
dl_unload,
|
||||
dl_bind,
|
||||
/* For now, "unbind" doesn't exist */
|
||||
#if 0
|
||||
NULL, /* unbind */
|
||||
#endif
|
||||
NULL, /* init */
|
||||
NULL /* finish */
|
||||
};
|
||||
|
||||
DSO_METHOD *DSO_METHOD_dl(void)
|
||||
{
|
||||
return(&dso_meth_dl);
|
||||
}
|
||||
|
||||
/* For this DSO_METHOD, our meth_data STACK will contain;
|
||||
* (i) the handle (shl_t) returned from shl_load().
|
||||
* NB: I checked on HPUX11 and shl_t is itself a pointer
|
||||
* type so the cast is safe.
|
||||
*/
|
||||
|
||||
static int dl_load(DSO *dso, char *filename)
|
||||
{
|
||||
shl_t ptr;
|
||||
|
||||
ptr = shl_load(filename, BIND_IMMEDIATE, NULL);
|
||||
if(ptr == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DL_LOAD,DSO_R_LOAD_FAILED);
|
||||
return(0);
|
||||
}
|
||||
if(!sk_push(dso->meth_data, (char *)ptr))
|
||||
{
|
||||
DSOerr(DSO_F_DL_LOAD,DSO_R_STACK_ERROR);
|
||||
shl_unload(ptr);
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int dl_unload(DSO *dso)
|
||||
{
|
||||
shl_t ptr;
|
||||
if(dso == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DL_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(0);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_DL_UNLOAD,DSO_R_STACK_ERROR);
|
||||
return(0);
|
||||
}
|
||||
/* Is this statement legal? */
|
||||
ptr = (shl_t)sk_pop(dso->meth_data);
|
||||
if(ptr == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DL_UNLOAD,DSO_R_NULL_HANDLE);
|
||||
/* Should push the value back onto the stack in
|
||||
* case of a retry. */
|
||||
sk_push(dso->meth_data, (char *)ptr);
|
||||
return(0);
|
||||
}
|
||||
shl_unload(ptr);
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int dl_bind(DSO *dso, char *symname, void **symptr)
|
||||
{
|
||||
shl_t ptr;
|
||||
void *sym;
|
||||
|
||||
if((dso == NULL) || (symptr == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_DL_BIND,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(0);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_DL_BIND,DSO_R_STACK_ERROR);
|
||||
return(0);
|
||||
}
|
||||
/* Is this actually legal? */
|
||||
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);
|
||||
}
|
||||
if (shl_findsym(ptr, symname, TYPE_UNDEFINED, &sym) < 0)
|
||||
{
|
||||
DSOerr(DSO_F_DL_BIND,DSO_R_SYM_FAILURE);
|
||||
return(0);
|
||||
}
|
||||
*symptr = sym;
|
||||
return(1);
|
||||
}
|
||||
|
||||
#endif /* DSO_DL */
|
179
crypto/dso/dso_dlfcn.c
Normal file
179
crypto/dso/dso_dlfcn.c
Normal file
@ -0,0 +1,179 @@
|
||||
/* dso_dlfcn.c */
|
||||
/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
|
||||
* project 2000.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2000 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "cryptlib.h"
|
||||
#include <openssl/dso.h>
|
||||
|
||||
#ifndef DSO_DLFCN
|
||||
DSO_METHOD *DSO_METHOD_dlfcn(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#else
|
||||
|
||||
#include <dlfcn.h>
|
||||
|
||||
static int dlfcn_load(DSO *dso, char *filename);
|
||||
static int dlfcn_unload(DSO *dso);
|
||||
static int dlfcn_bind(DSO *dso, char *symname, void **symptr);
|
||||
#if 0
|
||||
static int dlfcn_unbind(DSO *dso, char *symname, void *symptr);
|
||||
static int dlfcn_init(DSO *dso);
|
||||
static int dlfcn_finish(DSO *dso);
|
||||
#endif
|
||||
|
||||
static DSO_METHOD dso_meth_dlfcn = {
|
||||
"OpenSSL 'dlfcn' shared library method",
|
||||
dlfcn_load,
|
||||
dlfcn_unload,
|
||||
dlfcn_bind,
|
||||
/* For now, "unbind" doesn't exist */
|
||||
#if 0
|
||||
NULL, /* unbind */
|
||||
#endif
|
||||
NULL, /* init */
|
||||
NULL /* finish */
|
||||
};
|
||||
|
||||
DSO_METHOD *DSO_METHOD_dlfcn(void)
|
||||
{
|
||||
return(&dso_meth_dlfcn);
|
||||
}
|
||||
|
||||
/* For this DSO_METHOD, our meth_data STACK will contain;
|
||||
* (i) the handle (void*) returned from dlopen().
|
||||
*/
|
||||
|
||||
static int dlfcn_load(DSO *dso, char *filename)
|
||||
{
|
||||
void *ptr;
|
||||
|
||||
ptr = dlopen(filename, RTLD_NOW);
|
||||
if(ptr == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_LOAD,DSO_R_LOAD_FAILED);
|
||||
return(0);
|
||||
}
|
||||
if(!sk_push(dso->meth_data, (char *)ptr))
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_LOAD,DSO_R_STACK_ERROR);
|
||||
dlclose(ptr);
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int dlfcn_unload(DSO *dso)
|
||||
{
|
||||
void *ptr;
|
||||
if(dso == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(0);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_UNLOAD,DSO_R_STACK_ERROR);
|
||||
return(0);
|
||||
}
|
||||
ptr = (void *)sk_pop(dso->meth_data);
|
||||
if(ptr == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_UNLOAD,DSO_R_NULL_HANDLE);
|
||||
/* Should push the value back onto the stack in
|
||||
* case of a retry. */
|
||||
sk_push(dso->meth_data, (char *)ptr);
|
||||
return(0);
|
||||
}
|
||||
/* For now I'm not aware of any errors associated with dlclose() */
|
||||
dlclose(ptr);
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int dlfcn_bind(DSO *dso, char *symname, void **symptr)
|
||||
{
|
||||
void *ptr, *sym;
|
||||
|
||||
if((dso == NULL) || (symptr == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_BIND,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(0);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_BIND,DSO_R_STACK_ERROR);
|
||||
return(0);
|
||||
}
|
||||
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);
|
||||
}
|
||||
sym = dlsym(ptr, symname);
|
||||
if(sym == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DLFCN_BIND,DSO_R_SYM_FAILURE);
|
||||
return(0);
|
||||
}
|
||||
*symptr = sym;
|
||||
return(1);
|
||||
}
|
||||
|
||||
#endif /* DSO_DLFCN */
|
113
crypto/dso/dso_err.c
Normal file
113
crypto/dso/dso_err.c
Normal file
@ -0,0 +1,113 @@
|
||||
/* crypto/dso/dso_err.c */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
/* NOTE: this file was auto generated by the mkerr.pl script: any changes
|
||||
* made to it will be overwritten when the script next updates this file,
|
||||
* only reason strings will be preserved.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/dso.h>
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
#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_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_DSO_BIND,0), "DSO_bind"},
|
||||
{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_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"},
|
||||
{0,NULL}
|
||||
};
|
||||
|
||||
static ERR_STRING_DATA DSO_str_reasons[]=
|
||||
{
|
||||
{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_UNLOAD_FAILED ,"could not unload the shared library"},
|
||||
{DSO_R_UNSUPPORTED ,"functionality not supported"},
|
||||
{0,NULL}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
void ERR_load_DSO_strings(void)
|
||||
{
|
||||
static int init=1;
|
||||
|
||||
if (init)
|
||||
{
|
||||
init=0;
|
||||
#ifndef NO_ERR
|
||||
ERR_load_strings(ERR_LIB_DSO,DSO_str_functs);
|
||||
ERR_load_strings(ERR_LIB_DSO,DSO_str_reasons);
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
251
crypto/dso/dso_lib.c
Normal file
251
crypto/dso/dso_lib.c
Normal file
@ -0,0 +1,251 @@
|
||||
/* dso_lib.c */
|
||||
/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
|
||||
* project 2000.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2000 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include "cryptlib.h"
|
||||
#include <openssl/dso.h>
|
||||
|
||||
static DSO_METHOD *default_DSO_meth = NULL;
|
||||
|
||||
DSO *DSO_new(void)
|
||||
{
|
||||
return(DSO_new_method(NULL));
|
||||
}
|
||||
|
||||
void DSO_set_default_method(DSO_METHOD *meth)
|
||||
{
|
||||
default_DSO_meth = meth;
|
||||
}
|
||||
|
||||
DSO_METHOD *DSO_get_default_method(void)
|
||||
{
|
||||
return(default_DSO_meth);
|
||||
}
|
||||
|
||||
DSO_METHOD *DSO_get_method(DSO *dso)
|
||||
{
|
||||
return(dso->meth);
|
||||
}
|
||||
|
||||
DSO_METHOD *DSO_set_method(DSO *dso, DSO_METHOD *meth)
|
||||
{
|
||||
DSO_METHOD *mtmp;
|
||||
mtmp = dso->meth;
|
||||
dso->meth = meth;
|
||||
return(mtmp);
|
||||
}
|
||||
|
||||
DSO *DSO_new_method(DSO_METHOD *meth)
|
||||
{
|
||||
DSO *ret;
|
||||
|
||||
if(default_DSO_meth == NULL)
|
||||
/* We default to DSO_METH_openssl() which in turn defaults
|
||||
* to stealing the "best available" method. Will fallback
|
||||
* to DSO_METH_null() in the worst case. */
|
||||
default_DSO_meth = DSO_METHOD_openssl();
|
||||
ret = (DSO *)Malloc(sizeof(DSO));
|
||||
if(ret == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DSO_NEW_METHOD,ERR_R_MALLOC_FAILURE);
|
||||
return(NULL);
|
||||
}
|
||||
memset(ret, 0, sizeof(DSO));
|
||||
ret->meth_data = sk_new(NULL);
|
||||
if((ret->meth_data = sk_new(NULL)) == NULL)
|
||||
{
|
||||
/* sk_new doesn't generate any errors so we do */
|
||||
DSOerr(DSO_F_DSO_NEW_METHOD,ERR_R_MALLOC_FAILURE);
|
||||
Free(ret);
|
||||
return(NULL);
|
||||
}
|
||||
if(meth == NULL)
|
||||
ret->meth = default_DSO_meth;
|
||||
else
|
||||
ret->meth = meth;
|
||||
ret->references = 1;
|
||||
if((ret->meth->init != NULL) && !ret->meth->init(ret))
|
||||
{
|
||||
Free(ret);
|
||||
ret=NULL;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
int DSO_free(DSO *dso)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(dso == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DSO_FREE,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(0);
|
||||
}
|
||||
|
||||
i=CRYPTO_add(&dso->references,-1,CRYPTO_LOCK_DSO);
|
||||
#ifdef REF_PRINT
|
||||
REF_PRINT("DSO",dso);
|
||||
#endif
|
||||
if(i > 0) return(1);
|
||||
#ifdef REF_CHECK
|
||||
if(i < 0)
|
||||
{
|
||||
fprintf(stderr,"DSO_free, bad reference count\n");
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
|
||||
if((dso->meth->dso_unload != NULL) && !dso->meth->dso_unload(dso))
|
||||
{
|
||||
DSOerr(DSO_F_DSO_FREE,DSO_R_UNLOAD_FAILED);
|
||||
return(0);
|
||||
}
|
||||
|
||||
if((dso->meth->finish != NULL) && !dso->meth->finish(dso))
|
||||
{
|
||||
DSOerr(DSO_F_DSO_FREE,DSO_R_FINISH_FAILED);
|
||||
return(0);
|
||||
}
|
||||
|
||||
sk_free(dso->meth_data);
|
||||
|
||||
Free(dso);
|
||||
return(1);
|
||||
}
|
||||
|
||||
int DSO_flags(DSO *dso)
|
||||
{
|
||||
return((dso == NULL) ? 0 : dso->flags);
|
||||
}
|
||||
|
||||
|
||||
int DSO_up(DSO *dso)
|
||||
{
|
||||
if (dso == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DSO_UP,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(0);
|
||||
}
|
||||
|
||||
CRYPTO_add(&dso->references,1,CRYPTO_LOCK_DSO);
|
||||
return(1);
|
||||
}
|
||||
|
||||
DSO *DSO_load(DSO *dso, char *filename, DSO_METHOD *meth)
|
||||
{
|
||||
DSO *ret;
|
||||
int allocated = 0;
|
||||
|
||||
if(filename == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DSO_LOAD,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(NULL);
|
||||
}
|
||||
if(dso == NULL)
|
||||
{
|
||||
ret = DSO_new_method(meth);
|
||||
if(ret == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DSO_LOAD,ERR_R_MALLOC_FAILURE);
|
||||
return(NULL);
|
||||
}
|
||||
allocated = 1;
|
||||
}
|
||||
else
|
||||
ret = dso;
|
||||
if(ret->meth->dso_load == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DSO_LOAD,DSO_R_UNSUPPORTED);
|
||||
if(allocated)
|
||||
DSO_free(ret);
|
||||
return(NULL);
|
||||
}
|
||||
if(!ret->meth->dso_load(ret, filename))
|
||||
{
|
||||
DSOerr(DSO_F_DSO_LOAD,DSO_R_LOAD_FAILED);
|
||||
if(allocated)
|
||||
DSO_free(ret);
|
||||
return(NULL);
|
||||
}
|
||||
/* Load succeeded */
|
||||
return(ret);
|
||||
}
|
||||
|
||||
void *DSO_bind(DSO *dso, char *symname)
|
||||
{
|
||||
void *ret = NULL;
|
||||
|
||||
if((dso == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_DSO_BIND,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(NULL);
|
||||
}
|
||||
if(dso->meth->dso_bind == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_DSO_BIND,DSO_R_UNSUPPORTED);
|
||||
return(NULL);
|
||||
}
|
||||
if(!dso->meth->dso_bind(dso, symname, &ret))
|
||||
{
|
||||
DSOerr(DSO_F_DSO_BIND,DSO_R_SYM_FAILURE);
|
||||
return(NULL);
|
||||
}
|
||||
/* Success */
|
||||
return(ret);
|
||||
}
|
83
crypto/dso/dso_null.c
Normal file
83
crypto/dso/dso_null.c
Normal file
@ -0,0 +1,83 @@
|
||||
/* dso_null.c */
|
||||
/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
|
||||
* project 2000.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2000 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
/* This "NULL" method is provided as the fallback for systems that have
|
||||
* no appropriate support for "shared-libraries". */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "cryptlib.h"
|
||||
#include <openssl/dso.h>
|
||||
|
||||
static DSO_METHOD dso_meth_null = {
|
||||
"NULL shared library method",
|
||||
NULL, /* load */
|
||||
NULL, /* unload */
|
||||
NULL, /* bind */
|
||||
/* For now, "unbind" doesn't exist */
|
||||
#if 0
|
||||
NULL, /* unbind */
|
||||
#endif
|
||||
NULL, /* init */
|
||||
NULL /* finish */
|
||||
};
|
||||
|
||||
DSO_METHOD *DSO_METHOD_null(void)
|
||||
{
|
||||
return(&dso_meth_null);
|
||||
}
|
||||
|
79
crypto/dso/dso_openssl.c
Normal file
79
crypto/dso/dso_openssl.c
Normal file
@ -0,0 +1,79 @@
|
||||
/* dso_openssl.c */
|
||||
/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
|
||||
* project 2000.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2000 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "cryptlib.h"
|
||||
#include <openssl/dso.h>
|
||||
|
||||
/* We just pinch the method from an appropriate "default" method. */
|
||||
|
||||
DSO_METHOD *DSO_METHOD_openssl(void)
|
||||
{
|
||||
#ifdef DEF_DSO_METHOD
|
||||
return(DEF_DSO_METHOD());
|
||||
#elif defined(DSO_DLFCN)
|
||||
return(DSO_METHOD_dlfcn());
|
||||
#elif defined(DSO_DL)
|
||||
return(DSO_METHOD_dl());
|
||||
#elif defined(DSO_WIN32)
|
||||
return(DSO_METHOD_win32());
|
||||
#else
|
||||
return(DSO_METHOD_null());
|
||||
#endif
|
||||
}
|
||||
|
193
crypto/dso/dso_win32.c
Normal file
193
crypto/dso/dso_win32.c
Normal file
@ -0,0 +1,193 @@
|
||||
/* dso_win32.c */
|
||||
/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
|
||||
* project 2000.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2000 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "cryptlib.h"
|
||||
#include <openssl/dso.h>
|
||||
|
||||
#ifndef WIN32
|
||||
DSO_METHOD *DSO_METHOD_win32(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#else
|
||||
|
||||
static int win32_load(DSO *dso, char *filename);
|
||||
static int win32_unload(DSO *dso);
|
||||
static int win32_bind(DSO *dso, char *symname, void **symptr);
|
||||
#if 0
|
||||
static int win32_unbind(DSO *dso, char *symname, void *symptr);
|
||||
static int win32_init(DSO *dso);
|
||||
static int win32_finish(DSO *dso);
|
||||
#endif
|
||||
|
||||
static DSO_METHOD dso_meth_win32 = {
|
||||
"OpenSSL 'win32' shared library method",
|
||||
win32_load,
|
||||
win32_unload,
|
||||
win32_bind,
|
||||
/* For now, "unbind" doesn't exist */
|
||||
#if 0
|
||||
NULL, /* unbind */
|
||||
#endif
|
||||
NULL, /* init */
|
||||
NULL /* finish */
|
||||
};
|
||||
|
||||
DSO_METHOD *DSO_METHOD_win32(void)
|
||||
{
|
||||
return(&dso_meth_win32);
|
||||
}
|
||||
|
||||
/* For this DSO_METHOD, our meth_data STACK will contain;
|
||||
* (i) a pointer to the handle (HINSTANCE) returned from
|
||||
* LoadLibrary(), and copied.
|
||||
*/
|
||||
|
||||
static int win32_load(DSO *dso, char *filename)
|
||||
{
|
||||
HINSTANCE h, *p;
|
||||
|
||||
h = LoadLibrary(filename);
|
||||
if(h == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_LOAD,DSO_R_LOAD_FAILED);
|
||||
return(0);
|
||||
}
|
||||
p = (HINSTANCE *)Malloc(sizeof(HINSTANCE));
|
||||
if(p == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_LOAD,ERR_R_MALLOC_FAILURE);
|
||||
FreeLibrary(h);
|
||||
return(0);
|
||||
}
|
||||
*p = h;
|
||||
if(!sk_push(dso->meth_data, (char *)p))
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_LOAD,DSO_R_STACK_ERROR);
|
||||
FreeLibrary(h);
|
||||
Free(p);
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int win32_unload(DSO *dso)
|
||||
{
|
||||
HINSTANCE *p;
|
||||
if(dso == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(0);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_STACK_ERROR);
|
||||
return(0);
|
||||
}
|
||||
p = (HINSTANCE *)sk_pop(dso->meth_data);
|
||||
if(p == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_NULL_HANDLE);
|
||||
return(0);
|
||||
}
|
||||
if(!FreeLibrary(p))
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_UNLOAD_FAILED);
|
||||
/* We should push the value back onto the stack in
|
||||
* case of a retry. */
|
||||
sk_push(dso->meth_data, (char *)p);
|
||||
return(0);
|
||||
}
|
||||
/* Cleanup */
|
||||
Free(p);
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int win32_bind(DSO *dso, char *symname, void **symptr)
|
||||
{
|
||||
HINSTANCE *ptr;
|
||||
void *sym;
|
||||
|
||||
if((dso == NULL) || (symptr == NULL) || (symname == NULL))
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_BIND,ERR_R_PASSED_NULL_PARAMETER);
|
||||
return(0);
|
||||
}
|
||||
if(sk_num(dso->meth_data) < 1)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_BIND,DSO_R_STACK_ERROR);
|
||||
return(0);
|
||||
}
|
||||
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);
|
||||
}
|
||||
sym = GetProcAddress(*ptr, symname);
|
||||
if(sym == NULL)
|
||||
{
|
||||
DSOerr(DSO_F_WIN32_BIND,DSO_R_SYM_FAILURE);
|
||||
return(0);
|
||||
}
|
||||
*symptr = sym;
|
||||
return(1);
|
||||
}
|
||||
|
||||
#endif /* WIN32 */
|
Loading…
x
Reference in New Issue
Block a user