OpenSSL.SSL mostly builds cleanly now
diff --git a/OpenSSL/ssl/ssl.c b/OpenSSL/ssl/ssl.c
index 94d4844..00b9617 100644
--- a/OpenSSL/ssl/ssl.c
+++ b/OpenSSL/ssl/ssl.c
@@ -30,7 +30,9 @@
 See the file RATIONALE for a short explanation of why this module was written.\n\
 ";
 
+#ifndef PY3
 void **crypto_API;
+#endif
 
 int _pyOpenSSL_tstate_key;
 
@@ -48,34 +50,51 @@
     { NULL, NULL }
 };
 
+#ifdef PY3
+static struct PyModuleDef sslmodule = {
+    PyModuleDef_HEAD_INIT,
+    "SSL",
+    ssl_doc,
+    -1,
+    ssl_methods
+};
+#endif
+
 /*
  * Initialize SSL sub module
  *
  * Arguments: None
  * Returns:   None
  */
-void
-initSSL(void)
-{
+PyOpenSSL_MODINIT(SSL) {
+    PyObject *module;
+#ifndef PY3
     static void *ssl_API[ssl_API_pointers];
     PyObject *ssl_api_object;
-    PyObject *module;
+
+    import_crypto();
+#endif
 
     SSL_library_init();
     ERR_load_SSL_strings();
 
-    import_crypto();
-
-    if ((module = Py_InitModule3("SSL", ssl_methods, ssl_doc)) == NULL) {
-        return;
+#ifdef PY3
+    module = PyModule_Create(&sslmodule);
+#else
+    module = Py_InitModule3("SSL", ssl_methods, ssl_doc);
+#endif
+    if (module == NULL) {
+        return NULL;
     }
 
+#ifndef PY3
     /* Initialize the C API pointer array */
     ssl_API[ssl_Context_New_NUM]    = (void *)ssl_Context_New;
     ssl_API[ssl_Connection_New_NUM] = (void *)ssl_Connection_New;
     ssl_api_object = PyCObject_FromVoidPtr((void *)ssl_API, NULL);
     if (ssl_api_object != NULL)
         PyModule_AddObject(module, "_C_API", ssl_api_object);
+#endif
 
     /* Exceptions */
 /*
@@ -177,6 +196,14 @@
     _pyOpenSSL_tstate_key = PyThread_create_key();
 #endif
 
-  error:
+#ifdef PY3
+    return module;
+#endif
+
+error:
+#ifdef PY3
+    return NULL;
+#else
     ;
+#endif
 }