From b7b4abaeac8e559a3a4f587d46dc0014332b517e Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Mon, 22 Oct 2012 18:22:23 +0200
Subject: crypto: Link crypto_callback statically

if static linking of openssl is used.
---
 lib/crypto/c_src/Makefile.in       | 15 ++++++++++++---
 lib/crypto/c_src/crypto.c          | 30 ++++++++++++++++++------------
 lib/crypto/c_src/crypto_callback.c |  2 ++
 lib/crypto/c_src/crypto_callback.h |  4 ++++
 4 files changed, 36 insertions(+), 15 deletions(-)

(limited to 'lib')

diff --git a/lib/crypto/c_src/Makefile.in b/lib/crypto/c_src/Makefile.in
index f7e2193cec..e19d6617f3 100644
--- a/lib/crypto/c_src/Makefile.in
+++ b/lib/crypto/c_src/Makefile.in
@@ -59,8 +59,6 @@ TYPE_FLAGS = $(CFLAGS)
 endif
 endif
 
-ALL_CFLAGS = $(TYPE_FLAGS) $(INCLUDES)
-
 # ----------------------------------------------------
 # Release directory specification
 # ----------------------------------------------------
@@ -89,11 +87,18 @@ DYNAMIC_CRYPTO_LIB=@SSL_DYNAMIC_ONLY@
 ifeq ($(DYNAMIC_CRYPTO_LIB),yes)
 SSL_DED_LD_RUNTIME_LIBRARY_PATH = @SSL_DED_LD_RUNTIME_LIBRARY_PATH@
 CRYPTO_LINK_LIB=$(SSL_DED_LD_RUNTIME_LIBRARY_PATH) -L$(SSL_LIBDIR) -l$(SSL_CRYPTO_LIBNAME)
+EXTRA_FLAGS = -DHAVE_DYNAMIC_CRYPTO_LIB
 else
 SSL_DED_LD_RUNTIME_LIBRARY_PATH=
 CRYPTO_LINK_LIB=$(SSL_LIBDIR)/lib$(SSL_CRYPTO_LIBNAME).a 
+EXTRA_FLAGS =
+CRYPTO_OBJS := $(CRYPTO_OBJS) $(CALLBACK_OBJS)
+CALLBACK_OBJS =
+CALLBACK_LIB =
 endif
 
+ALL_CFLAGS = $(TYPE_FLAGS) $(EXTRA_FLAGS) $(INCLUDES)
+
 # ----------------------------------------------------
 # Targets
 # ----------------------------------------------------
@@ -114,6 +119,7 @@ $(LIBDIR)/crypto$(TYPEMARKER).dll: $(CRYPTO_OBJS)
 	$(INSTALL_DIR) $(LIBDIR)
 	$(LD) $(LDFLAGS) -o $@  $(SSL_DED_LD_RUNTIME_LIBRARY_PATH) -L$(SSL_LIBDIR) $(CRYPTO_OBJS) -l$(SSL_CRYPTO_LIBNAME) -l$(SSL_SSL_LIBNAME)
 
+ifeq ($(DYNAMIC_CRYPTO_LIB),yes)
 $(LIBDIR)/crypto_callback$(TYPEMARKER).so: $(CALLBACK_OBJS)
 	$(INSTALL_DIR) $(LIBDIR)
 	$(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
@@ -121,6 +127,7 @@ $(LIBDIR)/crypto_callback$(TYPEMARKER).so: $(CALLBACK_OBJS)
 $(LIBDIR)/crypto_callback$(TYPEMARKER).dll: $(CALLBACK_OBJS)
 	$(INSTALL_DIR) $(LIBDIR)
 	$(LD) $(LDFLAGS) -o $@ $(CALLBACK_OBJS)
+endif
 
 
 clean:
@@ -157,9 +164,11 @@ release_spec: opt
 	$(INSTALL_DIR) "$(RELSYSDIR)/priv/lib"
 	$(INSTALL_DATA) $(NIF_MAKEFILE) "$(RELSYSDIR)/priv/obj"
 	$(INSTALL_PROGRAM) $(CRYPTO_OBJS) "$(RELSYSDIR)/priv/obj"
-	$(INSTALL_PROGRAM) $(CALLBACK_OBJS) "$(RELSYSDIR)/priv/obj"
 	$(INSTALL_PROGRAM) $(NIF_LIB) "$(RELSYSDIR)/priv/lib"
+ifeq ($(DYNAMIC_CRYPTO_LIB),yes)
+	$(INSTALL_PROGRAM) $(CALLBACK_OBJS) "$(RELSYSDIR)/priv/obj"
 	$(INSTALL_PROGRAM) $(CALLBACK_LIB) "$(RELSYSDIR)/priv/lib"
+endif
 
 release_docs_spec:
 
diff --git a/lib/crypto/c_src/crypto.c b/lib/crypto/c_src/crypto.c
index ea0bb10cb7..5dc088dcff 100644
--- a/lib/crypto/c_src/crypto.c
+++ b/lib/crypto/c_src/crypto.c
@@ -370,6 +370,7 @@ static ERL_NIF_TERM atom_digest;
 #define PRINTF_ERR0(FMT)
 #define PRINTF_ERR1(FMT,A1)
 
+#ifdef HAVE_DYNAMIC_CRYPTO_LIB
 static int change_basename(char* buf, int bufsz, const char* newfile)
 {
     char* p = strrchr(buf, '/');
@@ -387,12 +388,11 @@ static void error_handler(void* null, const char* errstr)
 {
     PRINTF_ERR1("CRYPTO LOADING ERROR: '%s'", errstr);
 }
+#endif /* HAVE_DYNAMIC_CRYPTO_LIB */
 
 static int init(ErlNifEnv* env, ERL_NIF_TERM load_info)
 {
     ErlNifSysInfo sys_info;
-    const char callback_lib[] = "crypto_callback";
-    void* handle;
     get_crypto_callbacks_t* funcp;
     struct crypto_callbacks* ccb;
     int nlocks = 0;
@@ -445,17 +445,23 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info)
 
     init_digest_types(env);
 
-    if (!change_basename(lib_buf, sizeof(lib_buf), callback_lib)) {
-	return 0;
-    }
-    
-    if (!(handle = enif_dlopen(lib_buf, &error_handler, NULL))) {
-	return 0;
-    }
-    if (!(funcp = (get_crypto_callbacks_t*) enif_dlsym(handle, "get_crypto_callbacks",
-						       &error_handler, NULL))) {
-	return 0;
+#ifdef HAVE_DYNAMIC_CRYPTO_LIB
+    {
+	void* handle;
+	if (!change_basename(lib_buf, sizeof(lib_buf), "crypto_callback")) {
+	    return 0;
+	}
+	if (!(handle = enif_dlopen(lib_buf, &error_handler, NULL))) {
+	    return 0;
+	}
+	if (!(funcp = (get_crypto_callbacks_t*) enif_dlsym(handle, "get_crypto_callbacks",
+							   &error_handler, NULL))) {
+	    return 0;
+	}
     }
+#else /* !HAVE_DYNAMIC_CRYPTO_LIB */
+    funcp = &get_crypto_callbacks;
+#endif
     
 #ifdef OPENSSL_THREADS
     enif_system_info(&sys_info, sizeof(sys_info));
diff --git a/lib/crypto/c_src/crypto_callback.c b/lib/crypto/c_src/crypto_callback.c
index 32e690a8d1..81106b4cc2 100644
--- a/lib/crypto/c_src/crypto_callback.c
+++ b/lib/crypto/c_src/crypto_callback.c
@@ -156,8 +156,10 @@ DLLEXPORT struct crypto_callbacks* get_crypto_callbacks(int nlocks)
     return &the_struct;
 }
 
+#ifdef HAVE_DYNAMIC_CRYPTO_LIB
 /* This is not really a NIF library, but we use ERL_NIF_INIT in order to
  * get access to the erl_nif API (on Windows).
  */
 ERL_NIF_INIT(dummy, (ErlNifFunc*)NULL , NULL, NULL, NULL, NULL)
+#endif
 
diff --git a/lib/crypto/c_src/crypto_callback.h b/lib/crypto/c_src/crypto_callback.h
index a0c828b502..23ecba3e5d 100644
--- a/lib/crypto/c_src/crypto_callback.h
+++ b/lib/crypto/c_src/crypto_callback.h
@@ -40,3 +40,7 @@ struct crypto_callbacks
 
 typedef struct crypto_callbacks* get_crypto_callbacks_t(int nlocks);
 
+#ifndef HAVE_DYNAMIC_CRYPTO_LIB
+struct crypto_callbacks* get_crypto_callbacks(int nlocks);
+#endif
+
-- 
cgit v1.2.3