$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 #include #include @@ -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) {