]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/error.c
ITS#4726 call ldap_pvt_tls_init() in init_ctx() to make sure initialization
[openldap] / libraries / libldap / error.c
index 53fd8002881de8048291b661faf1761146702f84..59200249037b1a65c7990159f006b9611d0dfc4d 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2003 The OpenLDAP Foundation.
+ * Copyright 1998-2006 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -12,9 +12,6 @@
  * top-level directory of the distribution or, alternatively, at
  * <http://www.OpenLDAP.org/license.html>.
  */
-/* Portions Copyright (C) The Internet Society (1997)
- * ASN.1 fragments are from RFC 2251; see RFC for full legal notices.
- */
 
 #include "portable.h"
 
@@ -65,7 +62,6 @@ static struct ldaperror ldap_builtin_errlist[] = {
        {LDAP_IS_LEAF,                                  N_("Entry is a leaf")},
        {LDAP_ALIAS_DEREF_PROBLEM,              N_("Alias dereferencing problem")},
 
-       {LDAP_PROXY_AUTHZ_FAILURE,              N_("Proxy Authorization Failure")},
        {LDAP_INAPPROPRIATE_AUTH,               N_("Inappropriate authentication")},
        {LDAP_INVALID_CREDENTIALS,              N_("Invalid credentials")},
        {LDAP_INSUFFICIENT_ACCESS,              N_("Insufficient access")},
@@ -83,7 +79,34 @@ static struct ldaperror ldap_builtin_errlist[] = {
        {LDAP_RESULTS_TOO_LARGE,                N_("Results too large")},
        {LDAP_AFFECTS_MULTIPLE_DSAS,    N_("Operation affects multiple DSAs")},
 
-       {LDAP_OTHER,                                    N_("Internal (implementation specific) error")},
+       {LDAP_OTHER,                                    N_("Other (e.g., implementation specific) error")},
+
+       {LDAP_CANCELLED,                                N_("Cancelled")},
+       {LDAP_NO_SUCH_OPERATION,                N_("No Operation to Cancel")},
+       {LDAP_TOO_LATE,                                 N_("Too Late to Cancel")},
+       {LDAP_CANNOT_CANCEL,                    N_("Cannot Cancel")},
+
+       {LDAP_ASSERTION_FAILED,                 N_("Assertion Failed")},
+       {LDAP_X_ASSERTION_FAILED,               N_("Assertion Failed (X)")},
+
+       {LDAP_PROXIED_AUTHORIZATION_DENIED, N_("Proxied Authorization Denied")},
+       {LDAP_X_PROXY_AUTHZ_FAILURE,            N_("Proxy Authorization Failure (X)")},
+
+       {LDAP_SYNC_REFRESH_REQUIRED,    N_("Content Sync Refresh Required")},
+       {LDAP_X_SYNC_REFRESH_REQUIRED,  N_("Content Sync Refresh Required (X)")},
+
+       {LDAP_X_NO_OPERATION,                   N_("No Operation (X)")},
+
+       {LDAP_CUP_RESOURCES_EXHAUSTED,  N_("LCUP Resources Exhausted")},
+       {LDAP_CUP_SECURITY_VIOLATION,   N_("LCUP Security Violation")},
+       {LDAP_CUP_INVALID_DATA,                 N_("LCUP Invalid Data")},
+       {LDAP_CUP_UNSUPPORTED_SCHEME,   N_("LCUP Unsupported Scheme")},
+       {LDAP_CUP_RELOAD_REQUIRED,              N_("LCUP Reload Required")},
+
+#ifdef LDAP_X_TXN
+       {LDAP_X_TXN_SPECIFY_OKAY,               N_("TXN specify okay")},
+       {LDAP_X_TXN_ID_INVALID,                 N_("TXN ID is invalid")},
+#endif
 
        /* API ResultCodes */
        {LDAP_SERVER_DOWN,                              N_("Can't contact LDAP server")},
@@ -105,22 +128,6 @@ static struct ldaperror ldap_builtin_errlist[] = {
        {LDAP_CLIENT_LOOP,                              N_("Client Loop")},
        {LDAP_REFERRAL_LIMIT_EXCEEDED,  N_("Referral Limit Exceeded")},
 
-       {LDAP_ASSERTION_FAILED,                 N_("Assertion Failed")},
-
-       {LDAP_SYNC_RESOURCES_EXHAUSTED, N_("Content Sync Resource Exhausted")},
-       {LDAP_SYNC_SECURITY_VIOLATION,  N_("Content Sync Security Violation")},
-       {LDAP_SYNC_INVALID_COOKIE,              N_("Content Sync Invalid Cookie")},
-       {LDAP_SYNC_UNSUPPORTED_SCHEME,  N_("Content Sync Unsupported Scheme")},
-       {LDAP_SYNC_CLIENT_DISCONNECT,   N_("Content Sync Client Disconnect")},
-       {LDAP_SYNC_RELOAD_REQUIRED,             N_("Content Sync Reload Required")},
-
-#ifdef LDAP_EXOP_X_CANCEL
-       {LDAP_CANCELLED,                                N_("Cancelled")},
-       {LDAP_NO_SUCH_OPERATION,                N_("No Operation to Cancel")},
-       {LDAP_TOO_LATE,                                 N_("Too Late to Cancel")},
-       {LDAP_CANNOT_CANCEL,                    N_("Cannot Cancel")},
-#endif
-
        {0, NULL}
 };
 
@@ -149,15 +156,24 @@ ldap_err2string( int err )
 {
        const struct ldaperror *e;
        
-#ifdef NEW_LOGGING
-       LDAP_LOG ( OPERATION, ENTRY, "ldap_err2string\n", 0,0,0 );
-#else
        Debug( LDAP_DEBUG_TRACE, "ldap_err2string\n", 0, 0, 0 );
-#endif
 
        e = ldap_int_error( err );
 
-       return e ? _(e->e_reason) : _("Unknown error");
+       if (e) {
+               return e->e_reason;
+
+       } else if ( LDAP_API_ERROR(err) ) {
+               return _("Unknown API error");
+
+       } else if ( LDAP_E_ERROR(err) ) {
+               return _("Unknown (extension) error");
+
+       } else if ( LDAP_X_ERROR(err) ) {
+               return _("Unknown (private extension) error");
+       }
+
+       return _("Unknown error");
 }
 
 /* deprecated */
@@ -166,21 +182,17 @@ ldap_perror( LDAP *ld, LDAP_CONST char *str )
 {
     int i;
        const struct ldaperror *e;
-#ifdef NEW_LOGGING
-       LDAP_LOG ( OPERATION, ENTRY, "ldap_perror\n", 0,0,0 );
-#else
        Debug( LDAP_DEBUG_TRACE, "ldap_perror\n", 0, 0, 0 );
-#endif
 
        assert( ld != NULL );
        assert( LDAP_VALID( ld ) );
-       assert( str );
+       assert( str != NULL );
 
        e = ldap_int_error( ld->ld_errno );
 
        fprintf( stderr, "%s: %s (%d)\n",
                str ? str : "ldap_perror",
-               e ? _(e->e_reason) : _("unknown LDAP result code"),
+               e ? _(e->e_reason) : _("unknown result code"),
                ld->ld_errno );
 
        if ( ld->ld_matched != NULL && ld->ld_matched[0] != '\0' ) {
@@ -227,7 +239,7 @@ ldap_result2error( LDAP *ld, LDAPMessage *r, int freeit )
  *   BindResponse ::= [APPLICATION 1] SEQUENCE {
  *     COMPONENTS OF LDAPResult,
  *     serverSaslCreds  [7] OCTET STRING OPTIONAL }
- * 
+ *
  * and ExtendedOp results:
  *
  *   ExtendedResponse ::= [APPLICATION 24] SEQUENCE {
@@ -253,11 +265,7 @@ ldap_parse_result(
        ber_tag_t tag;
        BerElement      *ber;
 
-#ifdef NEW_LOGGING
-       LDAP_LOG ( OPERATION, ENTRY, "ldap_parse_result\n", 0,0,0 );
-#else
        Debug( LDAP_DEBUG_TRACE, "ldap_parse_result\n", 0, 0, 0 );
-#endif
 
        assert( ld != NULL );
        assert( LDAP_VALID( ld ) );
@@ -272,13 +280,19 @@ ldap_parse_result(
 #ifdef LDAP_R_COMPILE
        ldap_pvt_thread_mutex_lock( &ld->ld_res_mutex );
 #endif
-       /* Find the next result... */
-       for ( lm = r; lm != NULL; lm = lm->lm_chain ) {
-               /* skip over entries and references */
-               if( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY &&
-                       lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE &&
-                       lm->lm_msgtype != LDAP_RES_INTERMEDIATE )
-               {
+       /* Find the result, last msg in chain... */
+       lm = r->lm_chain_tail;
+       /* FIXME: either this is not possible (assert?)
+        * or it should be handled */
+       if ( lm != NULL ) {
+               switch ( lm->lm_msgtype ) {
+               case LDAP_RES_SEARCH_ENTRY:
+               case LDAP_RES_SEARCH_REFERENCE:
+               case LDAP_RES_INTERMEDIATE:
+                       lm = NULL;
+                       break;
+
+               default:
                        break;
                }
        }
@@ -309,11 +323,13 @@ ldap_parse_result(
        ber = ber_dup( lm->lm_ber );
 
        if ( ld->ld_version < LDAP_VERSION2 ) {
-               tag = ber_scanf( ber, "{ia}",
+               tag = ber_scanf( ber, "{iA}",
                        &ld->ld_errno, &ld->ld_error );
+
        } else {
                ber_len_t len;
-               tag = ber_scanf( ber, "{iaa" /*}*/,
+
+               tag = ber_scanf( ber, "{iAA" /*}*/,
                        &ld->ld_errno, &ld->ld_matched, &ld->ld_error );
 
                if( tag != LBER_ERROR ) {
@@ -375,28 +391,21 @@ ldap_parse_result(
        }
        if ( errcode == LDAP_SUCCESS ) {
                if( matcheddnp != NULL ) {
-                       *matcheddnp = LDAP_STRDUP( ld->ld_matched );
+                       if ( ld->ld_matched )
+                       {
+                               *matcheddnp = LDAP_STRDUP( ld->ld_matched );
+                       }
                }
                if( errmsgp != NULL ) {
-                       *errmsgp = LDAP_STRDUP( ld->ld_error );
+                       if ( ld->ld_error )
+                       {
+                               *errmsgp = LDAP_STRDUP( ld->ld_error );
+                       }
                }
 
                if( referralsp != NULL) {
                        *referralsp = ldap_value_dup( ld->ld_referrals );
                }
-
-               /* Find the next result... */
-               for ( lm = lm->lm_chain; lm != NULL; lm = lm->lm_chain ) {
-                       /* skip over entries and references */
-                       if( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY &&
-                               lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE &&
-                               lm->lm_msgtype != LDAP_RES_INTERMEDIATE )
-                       {
-                               /* more results to return */
-                               errcode = LDAP_MORE_RESULTS_TO_RETURN;
-                               break;
-                       }
-               }
        }
 
        if ( freeit ) {