LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File nodejs-openssl-missing-api.patch of Package nodejs (Project devel:languages:nodejs)

NodeJS 0.10 uses APIs introduced with OpenSSL 1.0.0.  To make it build against
OpenSSL 0.9.8 we must revert some API changes (298f6bf) and copy some missing
structs/functions from OpenSSL 1.0.0.

A better long-term solution might be to have the RPM depend on openssl>=1.0.0
and statically link with the bundled OpenSSL on platforms lacking it.
--- src/node_crypto.cc.orig	2013-04-18 14:27:08.000000000 -0500
+++ src/node_crypto.cc	2013-04-18 17:37:52.000000000 -0500
@@ -84,8 +84,13 @@
 static uv_rwlock_t* locks;
 
 
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
 static void crypto_threadid_cb(CRYPTO_THREADID* tid) {
   CRYPTO_THREADID_set_numeric(tid, uv_thread_self());
+#else
+static unsigned long crypto_id_cb(void) {
+  return (unsigned long) pthread_self();
+#endif
 }
 
 
@@ -3996,6 +4001,62 @@
   arr->Set(arr->Length(), String::New(from));
 }
 
+#if OPENSSL_VERSION_NUMBER < 0x10000000L
+/* Missing structs & functions copied from openssl-1.0.0 evp/names.c, with
+ * explicit casts added to make the C++ compiler happy.
+ */
+extern "C" {
+struct doall_cipher
+	{
+	void *arg;
+	void (*fn)(const EVP_CIPHER *ciph,
+			const char *from, const char *to, void *arg);
+	};
+
+static void do_all_cipher_fn(const OBJ_NAME *nm, void *arg)
+	{
+	struct doall_cipher *dc = (doall_cipher *)arg;
+	if (nm->alias)
+		dc->fn(NULL, nm->name, nm->data, dc->arg);
+	else
+		dc->fn((const EVP_CIPHER *)nm->data, nm->name, NULL, dc->arg);
+	}
+
+void EVP_CIPHER_do_all_sorted(void (*fn)(const EVP_CIPHER *ciph,
+		const char *from, const char *to, void *x), void *arg)
+	{
+	struct doall_cipher dc;
+	dc.fn = fn;
+	dc.arg = arg;
+	OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn,&dc);
+	}
+
+struct doall_md
+	{
+	void *arg;
+	void (*fn)(const EVP_MD *ciph,
+			const char *from, const char *to, void *arg);
+	};
+
+static void do_all_md_fn(const OBJ_NAME *nm, void *arg)
+	{
+	struct doall_md *dc = (doall_md *)arg;
+	if (nm->alias)
+		dc->fn(NULL, nm->name, nm->data, dc->arg);
+	else
+		dc->fn((const EVP_MD *)nm->data, nm->name, NULL, dc->arg);
+	}
+
+void EVP_MD_do_all_sorted(void (*fn)(const EVP_MD *md,
+		const char *from, const char *to, void *x), void *arg)
+	{
+	struct doall_md dc;
+	dc.fn = fn;
+	dc.arg = arg;
+	OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc);
+	}
+}
+#endif
 
 Handle<Value> GetCiphers(const Arguments& args) {
   HandleScope scope;
@@ -4024,7 +4085,11 @@
 
   crypto_lock_init();
   CRYPTO_set_locking_callback(crypto_lock_cb);
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
   CRYPTO_THREADID_set_callback(crypto_threadid_cb);
+#else
+  CRYPTO_set_id_callback(crypto_id_cb);
+#endif
 
   // Turn off compression. Saves memory - do it in userland.
 #if !defined(OPENSSL_NO_COMP)