$NetBSD: patch-bd,v 1.14 2009/08/31 20:54:27 wiz Exp $

--- kio/kssl/kopenssl.cc.orig	2006-07-22 20:16:39.000000000 +1200
+++ kio/kssl/kopenssl.cc
@@ -96,9 +96,14 @@ static int  (*K_BIO_write) (BIO *b, cons
 static int (*K_PEM_ASN1_write_bio) (int (*)(),const char *,BIO *,char *,
                                    const EVP_CIPHER *,unsigned char *,int ,
                                             pem_password_cb *, void *) = 0L;
+#if OPENSSL_VERSION_NUMBER < 0x00909000L
 static ASN1_METHOD* (*K_X509_asn1_meth) (void) = 0L;
 static int (*K_ASN1_i2d_fp)(int (*)(),FILE *,unsigned char *) = 0L;
 static int (*K_i2d_ASN1_HEADER)(ASN1_HEADER *, unsigned char **) = 0L;
+#else
+static int (*K_ASN1_item_i2d_fp)(ASN1_ITEM *,FILE *,unsigned char *) = 0L;
+static ASN1_ITEM *K_NETSCAPE_X509_it = 0L;
+#endif
 static int (*K_X509_print_fp)  (FILE *, X509*) = 0L;
 static int (*K_i2d_PKCS12)  (PKCS12*, unsigned char**) = 0L;
 static int (*K_i2d_PKCS12_fp)  (FILE *, PKCS12*) = 0L;
@@ -217,7 +222,7 @@ void KOpenSSLProxy::destroy() {
   _me = 0L;
 }
 
-#ifdef __OpenBSD__
+#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
 #include <qdir.h>
 #include <qstring.h>
 #include <qstringlist.h>
@@ -240,10 +245,20 @@ static QString findMostRecentLib(QString
        for (QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
                QString numberpart = (*it).mid(s);
                uint endmaj = numberpart.find('.');
-               if (endmaj == -1)
-                       continue;
                bool ok;
-               int maj = numberpart.left(endmaj).toInt(&ok);
+	       int maj;
+               if (endmaj == -1) {
+	               int maj = numberpart.toInt(&ok);
+		       if (!ok)
+		               continue;
+	               if (maj <= bestmaj)
+		               continue;
+		       bestmaj = maj;
+		       bestmin = -1;
+                       best = (*it);
+                       continue;
+               }
+               maj = numberpart.left(endmaj).toInt(&ok);
                if (!ok)
                        continue;
                int min = numberpart.mid(endmaj+1).toInt(&ok);
@@ -280,42 +295,23 @@ KConfig *cfg;
 
    delete cfg;
 
-#ifdef __OpenBSD__
-   {
-   QString libname = findMostRecentLib("/usr/lib" KDELIBSUFF, "crypto");
-   if (!libname.isNull())
-         _cryptoLib = ll->globalLibrary(libname.latin1());
-   }
-#elif defined(__CYGWIN__)
-   libpaths << "/usr/bin/"             
-   		<< "/usr/local/bin"             
-   		<< "/usr/local/openssl/bin"     
-   		<< "/opt/openssl/bin"           
-   		<< "/opt/kde3/bin"              
-   		<< "";                          
-                                       
-   libnamess << "cygssl-0.9.7.dll"     
-		 << "cygssl.dll"                    
-		 << "libssl.dll"                    
-		 << "";                         
-                                       
-   libnamesc << "cygcrypto.dll"        
-		 << "libcrypto.dll"                 
-		 << "";                         
-#else
    libpaths
-            #ifdef _AIX
+#ifdef _AIX
             << "/opt/freeware/lib/"
-	    #endif
+#endif
 	    << "/usr/lib" KDELIBSUFF "/"
+	    << "/usr/pkg/lib/"
+#if !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__)
 	    << "/usr/ssl/lib" KDELIBSUFF "/"
 	    << "/usr/local/lib" KDELIBSUFF "/"
             << "/usr/local/openssl/lib" KDELIBSUFF "/"
             << "/usr/local/ssl/lib" KDELIBSUFF "/"
 	    << "/opt/openssl/lib" KDELIBSUFF "/"
 	    << "/lib" KDELIBSUFF "/"
+#endif
             << "";
     
+#if !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__)
 // FIXME: #define here for the various OS types to optimize
    libnamess
 	     #ifdef hpux
@@ -330,8 +326,12 @@ KConfig *cfg;
              << "libssl.so." SHLIB_VERSION_NUMBER
              #endif
              << "libssl.so"
+             #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10000000L
+             << "libssl.so.1"
+             #else
 	     << "libssl.so.0"
              #endif
+             #endif
 	     ;
 
    libnamesc
@@ -347,14 +347,23 @@ KConfig *cfg;
              << "libcrypto.so." SHLIB_VERSION_NUMBER
              #endif
              << "libcrypto.so"
+             #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10000000L
+             << "libcrypto.so.1"
+             #else
 	     << "libcrypto.so.0"
              #endif
+             #endif
 	     ;
 #endif
 
    for (QStringList::Iterator it = libpaths.begin();
                               it != libpaths.end();
                               ++it) {
+#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
+	QString libname = findMostRecentLib(*it, "crypto");
+	if (!libname.isNull())
+		_cryptoLib = ll->globalLibrary(libname.latin1());
+#else
       for (QStringList::Iterator shit = libnamesc.begin();
                                  shit != libnamesc.end();
                                  ++shit) {
@@ -368,6 +377,7 @@ KConfig *cfg;
             _cryptoLib = ll->globalLibrary(alib.latin1());
          if (_cryptoLib) break;
       }
+#endif
       if (_cryptoLib) break;
    }
 
@@ -404,9 +414,14 @@ KConfig *cfg;
       K_BIO_ctrl = (long (*) (BIO *,int,long,void *)) _cryptoLib->symbol("BIO_ctrl");
       K_BIO_write = (int (*) (BIO *b, const void *data, int len)) _cryptoLib->symbol("BIO_write");
       K_PEM_ASN1_write_bio = (int (*)(int (*)(), const char *,BIO*, char*, const EVP_CIPHER *, unsigned char *, int, pem_password_cb *, void *)) _cryptoLib->symbol("PEM_ASN1_write_bio");
+#if OPENSSL_VERSION_NUMBER < 0x00909000L
       K_X509_asn1_meth = (ASN1_METHOD* (*)(void)) _cryptoLib->symbol("X509_asn1_meth");
       K_ASN1_i2d_fp = (int (*)(int (*)(), FILE*, unsigned char *)) _cryptoLib->symbol("ASN1_i2d_fp");
       K_i2d_ASN1_HEADER = (int (*)(ASN1_HEADER *, unsigned char **)) _cryptoLib->symbol("i2d_ASN1_HEADER");
+#else
+      K_ASN1_item_i2d_fp = (int (*)(ASN1_ITEM *, FILE*, unsigned char *)) _cryptoLib->symbol("ASN1_item_i2d_fp");
+      K_NETSCAPE_X509_it = (ASN1_ITEM *) _cryptoLib->symbol("NETSCAPE_X509_it");
+#endif
       K_X509_print_fp = (int (*)(FILE*, X509*)) _cryptoLib->symbol("X509_print_fp");
       K_i2d_PKCS12 = (int (*)(PKCS12*, unsigned char**)) _cryptoLib->symbol("i2d_PKCS12");
       K_i2d_PKCS12_fp = (int (*)(FILE *, PKCS12*)) _cryptoLib->symbol("i2d_PKCS12_fp");
@@ -497,16 +512,14 @@ KConfig *cfg;
 #endif
    }
 
-#ifdef __OpenBSD__
-   {
-   QString libname = findMostRecentLib("/usr/lib", "ssl");
-   if (!libname.isNull())
-         _sslLib = ll->globalLibrary(libname.latin1());
-   }
-#else
    for (QStringList::Iterator it = libpaths.begin();
                               it != libpaths.end();
                               ++it) {
+#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
+      QString libname = findMostRecentLib(*it, "ssl");
+      if (!libname.isNull())
+           _sslLib = ll->globalLibrary(libname.latin1());
+#else
       for (QStringList::Iterator shit = libnamess.begin();
                                  shit != libnamess.end();
                                  ++shit) {
@@ -520,10 +533,10 @@ KConfig *cfg;
          	_sslLib = ll->globalLibrary(alib.latin1());
          if (_sslLib) break;
       }
+#endif
       if (_sslLib) break;
    }
-#endif
-
+   
    if (_sslLib) {
 #ifdef KSSL_HAVE_SSL
       // stand back from your monitor and look at this.  it's fun! :)
@@ -568,7 +581,7 @@ KConfig *cfg;
       K_SSL_set_session = (int (*)(SSL*,SSL_SESSION*)) _sslLib->symbol("SSL_set_session");
       K_d2i_SSL_SESSION = (SSL_SESSION* (*)(SSL_SESSION**,unsigned char**, long)) _sslLib->symbol("d2i_SSL_SESSION");
       K_i2d_SSL_SESSION = (int (*)(SSL_SESSION*,unsigned char**)) _sslLib->symbol("i2d_SSL_SESSION");
-      K_SSL_get_ciphers = (STACK *(*)(const SSL*)) _sslLib->symbol("SSL_get_ciphers");
+      K_SSL_get_ciphers = (STACK_OF(SSL_CIPHER) *(*)(const SSL*)) _sslLib->symbol("SSL_get_ciphers");
 #endif
 
 
@@ -957,6 +970,8 @@ int KOpenSSLProxy::PEM_write_bio_X509(BI
 }
 
 
+#if OPENSSL_VERSION_NUMBER < 0x00909000L
+
 ASN1_METHOD *KOpenSSLProxy::X509_asn1_meth(void) {
    if (K_X509_asn1_meth) return (K_X509_asn1_meth)();
    else return 0L;
@@ -968,6 +983,13 @@ int KOpenSSLProxy::ASN1_i2d_fp(FILE *out
         return (K_ASN1_i2d_fp)((int (*)())K_i2d_ASN1_HEADER, out, x);
    else return -1;
 }
+#else
+int KOpenSSLProxy::ASN1_i2d_fp(FILE *out,unsigned char *x) {
+   if (K_ASN1_item_i2d_fp && K_NETSCAPE_X509_it)
+        return (K_ASN1_item_i2d_fp)(K_NETSCAPE_X509_it, out, x);
+   else return -1;
+}
+#endif
 
 
 int KOpenSSLProxy::X509_print(FILE *fp, X509 *x) {
