X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fresult.c;h=228d4efdc4f666e39cae25e8f30820896a9f4fa4;hb=e25f6ef0cdd1780577dffeaca8ba8b19b5697880;hp=48638cad56e007d4063408919405c1d583addaa8;hpb=abd9be4def262989fda50137a75b2cb34868ab2b;p=openldap diff --git a/servers/slapd/result.c b/servers/slapd/result.c index 48638cad56..228d4efdc4 100644 --- a/servers/slapd/result.c +++ b/servers/slapd/result.c @@ -1,7 +1,7 @@ /* result.c - routines to send ldap results, errors, and referrals */ /* $OpenLDAP$ */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -19,7 +19,7 @@ #include "slap.h" -static char *v2ref( struct berval **ref, const char *text ) +static char *v2ref( BerVarray ref, const char *text ) { size_t len = 0, i = 0; char *v2; @@ -49,12 +49,12 @@ static char *v2ref( struct berval **ref, const char *text ) strcpy( v2+len, "Referral:" ); len += sizeof("Referral:"); - for( i=0; ref[i] != NULL; i++ ) { - v2 = ch_realloc( v2, len + ref[i]->bv_len + 1 ); + for( i=0; ref[i].bv_val != NULL; i++ ) { + v2 = ch_realloc( v2, len + ref[i].bv_len + 1 ); v2[len-1] = '\n'; - AC_MEMCPY(&v2[len], ref[i]->bv_val, ref[i]->bv_len ); - len += ref[i]->bv_len; - if (ref[i]->bv_val[ref[i]->bv_len-1] != '/') { + AC_MEMCPY(&v2[len], ref[i].bv_val, ref[i].bv_len ); + len += ref[i].bv_len; + if (ref[i].bv_val[ref[i].bv_len-1] != '/') { ++len; } } @@ -142,7 +142,6 @@ static long send_ldap_ber( err, sock_errstr(err), 0 ); #endif - if ( err != EWOULDBLOCK && err != EAGAIN ) { connection_closing( conn ); @@ -176,26 +175,27 @@ send_ldap_response( ber_int_t err, const char *matched, const char *text, - struct berval **ref, + BerVarray ref, const char *resoid, struct berval *resdata, struct berval *sasldata, LDAPControl **ctrls ) { - BerElement *ber; + char berbuf[256]; + BerElement *ber = (BerElement *)berbuf; int rc; long bytes; - if (op->o_response) { - op->o_response( conn, op, tag, msgid, err, matched, + if (op->o_callback && op->o_callback->sc_response) { + op->o_callback->sc_response( conn, op, tag, msgid, err, matched, text, ref, resoid, resdata, sasldata, ctrls ); return; } assert( ctrls == NULL ); /* ctrls not implemented */ - ber = ber_alloc_t( LBER_USE_DER ); + ber_init_w_nullc( ber, LBER_USE_DER ); #ifdef NEW_LOGGING LDAP_LOG(( "operation", LDAP_LEVEL_ENTRY, @@ -207,33 +207,20 @@ send_ldap_response( (long) msgid, (long) tag, (long) err ); #endif - if( ref ) { #ifdef NEW_LOGGING LDAP_LOG(( "operation", LDAP_LEVEL_ARGS, "send_ldap_response: conn %d ref=\"%s\"\n", conn ? conn->c_connid : 0, - ref[0] && ref[0]->bv_val ? ref[0]->bv_val : "NULL" )); + ref[0].bv_val ? ref[0].bv_val : "NULL" )); #else Debug( LDAP_DEBUG_ARGS, "send_ldap_response: ref=\"%s\"\n", - ref[0] && ref[0]->bv_val ? ref[0]->bv_val : "NULL", + ref[0].bv_val ? ref[0].bv_val : "NULL", NULL, NULL ); #endif } - if ( ber == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_ERR, - "send_ldap_response: conn %d ber_alloc failed\n", - conn ? conn->c_connid : 0 )); -#else - Debug( LDAP_DEBUG_ANY, "ber_alloc failed\n", 0, 0, 0 ); -#endif - - return; - } - #ifdef LDAP_CONNECTIONLESS if (conn->c_is_udp) { rc = ber_write(ber, (char *)&op->o_peeraddr, sizeof(struct sockaddr), 0); @@ -245,7 +232,7 @@ send_ldap_response( #else Debug( LDAP_DEBUG_ANY, "ber_write failed\n", 0, 0, 0 ); #endif - ber_free(ber, 1); + ber_free_buf( ber ); return; } } @@ -266,7 +253,7 @@ send_ldap_response( if( rc != -1 ) { if ( ref != NULL ) { assert( err == LDAP_REFERRAL ); - rc = ber_printf( ber, "t{V}", + rc = ber_printf( ber, "t{W}", LDAP_TAG_REFERRAL, ref ); } else { assert( err != LDAP_REFERRAL ); @@ -306,13 +293,13 @@ send_ldap_response( Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 ); #endif - ber_free( ber, 1 ); + ber_free_buf( ber ); return; } /* send BER */ bytes = send_ldap_ber( conn, ber ); - ber_free( ber, 1 ); + ber_free_buf( ber ); if ( bytes < 0 ) { #ifdef NEW_LOGGING @@ -394,7 +381,7 @@ send_ldap_result( ber_int_t err, const char *matched, const char *text, - struct berval **ref, + BerVarray ref, LDAPControl **ctrls ) { @@ -429,11 +416,11 @@ send_ldap_result( #ifdef NEW_LOGGING LDAP_LOG(( "operation", LDAP_LEVEL_ARGS, "send_ldap_result: referral=\"%s\"\n", - ref[0] && ref[0]->bv_val ? ref[0]->bv_val : "NULL" )); + ref[0].bv_val ? ref[0].bv_val : "NULL" )); #else Debug( LDAP_DEBUG_ARGS, "send_ldap_result: referral=\"%s\"\n", - ref[0] && ref[0]->bv_val ? ref[0]->bv_val : "NULL", + ref[0].bv_val ? ref[0].bv_val : "NULL", NULL, NULL ); #endif } @@ -478,7 +465,7 @@ send_ldap_sasl( ber_int_t err, const char *matched, const char *text, - struct berval **ref, + BerVarray ref, LDAPControl **ctrls, struct berval *cred ) @@ -511,7 +498,7 @@ send_ldap_extended( ber_int_t err, const char *matched, const char *text, - struct berval **refs, + BerVarray refs, const char *rspoid, struct berval *rspdata, LDAPControl **ctrls @@ -550,7 +537,7 @@ send_search_result( ber_int_t err, const char *matched, const char *text, - struct berval **refs, + BerVarray refs, LDAPControl **ctrls, int nentries ) @@ -561,8 +548,8 @@ send_search_result( assert( !LDAP_API_ERROR( err ) ); - if (op->o_sresult) { - op->o_sresult(conn, op, err, matched, text, refs, + if (op->o_callback && op->o_callback->sc_sresult) { + op->o_callback->sc_sresult(conn, op, err, matched, text, refs, ctrls, nentries); return; } @@ -618,6 +605,10 @@ send_search_result( } } +static struct berval AllUser = { sizeof(LDAP_ALL_USER_ATTRIBUTES)-1, + LDAP_ALL_USER_ATTRIBUTES }; +static struct berval AllOper = { sizeof(LDAP_ALL_OPERATIONAL_ATTRIBUTES)-1, + LDAP_ALL_OPERATIONAL_ATTRIBUTES }; int send_search_entry( @@ -625,12 +616,13 @@ send_search_entry( Connection *conn, Operation *op, Entry *e, - char **attrs, + AttributeName *attrs, int attrsonly, LDAPControl **ctrls ) { - BerElement *ber; + char berbuf[256]; + BerElement *ber = (BerElement *)berbuf; Attribute *a, *aa; int i, rc=-1, bytes; char *edn; @@ -639,6 +631,11 @@ send_search_entry( AttributeDescription *ad_entry = slap_schema.si_ad_entry; + if (op->o_callback && op->o_callback->sc_sendentry) { + return op->o_callback->sc_sendentry( be, conn, op, e, attrs, + attrsonly, ctrls ); + } + #ifdef NEW_LOGGING LDAP_LOG(( "operation", LDAP_LEVEL_ENTRY, "send_search_entry: conn %d dn=\"%s\"%s\n", @@ -669,21 +666,7 @@ send_search_entry( edn = e->e_ndn; - ber = ber_alloc_t( LBER_USE_DER ); - - if ( ber == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_ERR, - "send_search_entry: conn %d ber_alloc failed\n", - op->o_connid )); -#else - Debug( LDAP_DEBUG_ANY, "ber_alloc failed\n", 0, 0, 0 ); -#endif - - send_ldap_result( conn, op, LDAP_OTHER, - NULL, "BER allocation error", NULL, NULL ); - goto error_return; - } + ber_init_w_nullc( ber, LBER_USE_DER ); #ifdef LDAP_CONNECTIONLESS if (conn->c_is_udp) { @@ -696,18 +679,18 @@ send_search_entry( #else Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 ); #endif - ber_free(ber, 1); + ber_free_buf( ber ); return; } } if (conn->c_is_udp && op->o_protocol == LDAP_VERSION2) { - rc = ber_printf( ber, "{is{t{s{" /*}}}*/, - op->o_msgid, "", LDAP_RES_SEARCH_ENTRY, e->e_dn ); + rc = ber_printf( ber, "{is{t{O{" /*}}}*/, + op->o_msgid, "", LDAP_RES_SEARCH_ENTRY, &e->e_name ); } else #endif { - rc = ber_printf( ber, "{it{s{" /*}}}*/, op->o_msgid, - LDAP_RES_SEARCH_ENTRY, e->e_dn ); + rc = ber_printf( ber, "{it{O{" /*}}}*/, op->o_msgid, + LDAP_RES_SEARCH_ENTRY, &e->e_name ); } if ( rc == -1 ) { @@ -719,7 +702,7 @@ send_search_entry( Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 ); #endif - ber_free( ber, 1 ); + ber_free_buf( ber ); send_ldap_result( conn, op, LDAP_OTHER, NULL, "encoding DN error", NULL, NULL ); goto error_return; @@ -727,24 +710,23 @@ send_search_entry( /* check for special all user attributes ("*") type */ userattrs = ( attrs == NULL ) ? 1 - : charray_inlist( attrs, LDAP_ALL_USER_ATTRIBUTES ); + : an_find( attrs, &AllUser ); /* check for special all operational attributes ("+") type */ opattrs = ( attrs == NULL ) ? 0 - : charray_inlist( attrs, LDAP_ALL_OPERATIONAL_ATTRIBUTES ); + : an_find( attrs, &AllOper ); for ( a = e->e_attrs; a != NULL; a = a->a_next ) { AttributeDescription *desc = a->a_desc; - char *type = desc->ad_cname.bv_val; if ( attrs == NULL ) { - /* all addrs request, skip operational attributes */ + /* all attrs request, skip operational attributes */ if( is_at_operational( desc->ad_type ) ) { continue; } } else { - /* specific addrs requested */ + /* specific attrs requested */ if ( is_at_operational( desc->ad_type ) ) { if( !opattrs && !ad_inlist( desc, attrs ) ) { continue; @@ -759,36 +741,37 @@ send_search_entry( if ( ! access_allowed( be, conn, op, e, desc, NULL, ACL_READ ) ) { #ifdef NEW_LOGGING - LDAP_LOG(( "acl", LDAP_LEVEL_INFO, - "send_search_entry: conn %d access to attribute %s not allowed\n", - op->o_connid, desc->ad_cname.bv_val )); + LDAP_LOG(( "acl", LDAP_LEVEL_INFO, "send_search_entry: " + "conn %d access to attribute %s not allowed\n", + op->o_connid, desc->ad_cname.bv_val )); #else - Debug( LDAP_DEBUG_ACL, "acl: access to attribute %s not allowed\n", + Debug( LDAP_DEBUG_ACL, "acl: " + "access to attribute %s not allowed\n", desc->ad_cname.bv_val, 0, 0 ); #endif continue; } - if (( rc = ber_printf( ber, "{s[" /*]}*/ , type )) == -1 ) { + if (( rc = ber_printf( ber, "{O[" /*]}*/ , &desc->ad_cname )) == -1 ) { #ifdef NEW_LOGGING LDAP_LOG(( "operation", LDAP_LEVEL_ERR, - "send_search_entry: conn %d ber_printf failed\n", - op->o_connid )); + "send_search_entry: conn %d ber_printf failed\n", + op->o_connid )); #else Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 ); #endif - ber_free( ber, 1 ); + ber_free_buf( ber ); send_ldap_result( conn, op, LDAP_OTHER, NULL, "encoding description error", NULL, NULL ); goto error_return; } if ( ! attrsonly ) { - for ( i = 0; a->a_vals[i] != NULL; i++ ) { + for ( i = 0; a->a_vals[i].bv_val != NULL; i++ ) { if ( ! access_allowed( be, conn, op, e, - desc, a->a_vals[i], ACL_READ ) ) + desc, &a->a_vals[i], ACL_READ ) ) { #ifdef NEW_LOGGING LDAP_LOG(( "acl", LDAP_LEVEL_INFO, @@ -803,7 +786,7 @@ send_search_entry( continue; } - if (( rc = ber_printf( ber, "O", a->a_vals[i] )) == -1 ) { + if (( rc = ber_printf( ber, "O", &a->a_vals[i] )) == -1 ) { #ifdef NEW_LOGGING LDAP_LOG(( "operation", LDAP_LEVEL_ERR, "send_search_entry: conn %d ber_printf failed.\n", @@ -813,7 +796,7 @@ send_search_entry( "ber_printf failed\n", 0, 0, 0 ); #endif - ber_free( ber, 1 ); + ber_free_buf( ber ); send_ldap_result( conn, op, LDAP_OTHER, NULL, "encoding values error", NULL, NULL ); goto error_return; @@ -830,7 +813,7 @@ send_search_entry( Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 ); #endif - ber_free( ber, 1 ); + ber_free_buf( ber ); send_ldap_result( conn, op, LDAP_OTHER, NULL, "encode end error", NULL, NULL ); goto error_return; @@ -839,19 +822,19 @@ send_search_entry( /* eventually will loop through generated operational attributes */ /* only have subschemaSubentry implemented */ - aa = backend_operational( be, conn, op, e ); + aa = backend_operational( be, conn, op, e, attrs, opattrs ); for (a = aa ; a != NULL; a = a->a_next ) { AttributeDescription *desc = a->a_desc; if ( attrs == NULL ) { - /* all addrs request, skip operational attributes */ + /* all attrs request, skip operational attributes */ if( is_at_operational( desc->ad_type ) ) { continue; } } else { - /* specific addrs requested */ + /* specific attrs requested */ if( is_at_operational( desc->ad_type ) ) { if( !opattrs && !ad_inlist( desc, attrs ) ) { continue; @@ -877,7 +860,7 @@ send_search_entry( continue; } - rc = ber_printf( ber, "{s[" /*]}*/ , desc->ad_cname.bv_val ); + rc = ber_printf( ber, "{O[" /*]}*/ , &desc->ad_cname ); if ( rc == -1 ) { #ifdef NEW_LOGGING LDAP_LOG(( "operation", LDAP_LEVEL_ERR, @@ -887,7 +870,7 @@ send_search_entry( Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 ); #endif - ber_free( ber, 1 ); + ber_free_buf( ber ); send_ldap_result( conn, op, LDAP_OTHER, NULL, "encoding description error", NULL, NULL ); attrs_free( aa ); @@ -895,9 +878,9 @@ send_search_entry( } if ( ! attrsonly ) { - for ( i = 0; a->a_vals[i] != NULL; i++ ) { + for ( i = 0; a->a_vals[i].bv_val != NULL; i++ ) { if ( ! access_allowed( be, conn, op, e, - desc, a->a_vals[i], ACL_READ ) ) + desc, &a->a_vals[i], ACL_READ ) ) { #ifdef NEW_LOGGING LDAP_LOG(( "acl", LDAP_LEVEL_INFO, @@ -913,7 +896,7 @@ send_search_entry( } - if (( rc = ber_printf( ber, "O", a->a_vals[i] )) == -1 ) { + if (( rc = ber_printf( ber, "O", &a->a_vals[i] )) == -1 ) { #ifdef NEW_LOGGING LDAP_LOG(( "operation", LDAP_LEVEL_ERR, "send_search_entry: conn %d ber_printf failed\n", @@ -923,7 +906,7 @@ send_search_entry( "ber_printf failed\n", 0, 0, 0 ); #endif - ber_free( ber, 1 ); + ber_free_buf( ber ); send_ldap_result( conn, op, LDAP_OTHER, NULL, "encoding values error", NULL, NULL ); attrs_free( aa ); @@ -941,7 +924,7 @@ send_search_entry( Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 ); #endif - ber_free( ber, 1 ); + ber_free_buf( ber ); send_ldap_result( conn, op, LDAP_OTHER, NULL, "encode end error", NULL, NULL ); attrs_free( aa ); @@ -966,14 +949,14 @@ send_search_entry( Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 ); #endif - ber_free( ber, 1 ); + ber_free_buf( ber ); send_ldap_result( conn, op, LDAP_OTHER, NULL, "encode entry end error", NULL, NULL ); return( 1 ); } bytes = send_ldap_ber( conn, ber ); - ber_free( ber, 1 ); + ber_free_buf( ber ); if ( bytes < 0 ) { #ifdef NEW_LOGGING @@ -1019,12 +1002,13 @@ send_search_reference( Connection *conn, Operation *op, Entry *e, - struct berval **refs, + BerVarray refs, LDAPControl **ctrls, - struct berval ***v2refs + BerVarray *v2refs ) { - BerElement *ber; + char berbuf[256]; + BerElement *ber = (BerElement *)berbuf; int rc; int bytes; @@ -1090,30 +1074,15 @@ send_search_reference( if( op->o_protocol < LDAP_VERSION3 ) { /* save the references for the result */ - if( *refs != NULL ) { + if( refs[0].bv_val != NULL ) { value_add( v2refs, refs ); } return 0; } - ber = ber_alloc_t( LBER_USE_DER ); - - if ( ber == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_ERR, - "send_search_reference: conn %d ber_alloc failed\n", - op->o_connid )); -#else - Debug( LDAP_DEBUG_ANY, - "send_search_reference: ber_alloc failed\n", 0, 0, 0 ); -#endif - - send_ldap_result( conn, op, LDAP_OTHER, - NULL, "alloc BER error", NULL, NULL ); - return -1; - } + ber_init_w_nullc( ber, LBER_USE_DER ); - rc = ber_printf( ber, "{it{V}N}", op->o_msgid, + rc = ber_printf( ber, "{it{W}N}", op->o_msgid, LDAP_RES_SEARCH_REFERENCE, refs ); if ( rc == -1 ) { @@ -1126,14 +1095,14 @@ send_search_reference( "send_search_reference: ber_printf failed\n", 0, 0, 0 ); #endif - ber_free( ber, 1 ); + ber_free_buf( ber ); send_ldap_result( conn, op, LDAP_OTHER, NULL, "encode DN error", NULL, NULL ); return -1; } bytes = send_ldap_ber( conn, ber ); - ber_free( ber, 1 ); + ber_free_buf( ber ); ldap_pvt_thread_mutex_lock( &num_sent_mutex ); num_bytes_sent += bytes; @@ -1208,7 +1177,7 @@ str2result( } else { #ifdef NEW_LOGGING LDAP_LOG(( "operation", LDAP_LEVEL_INFO, - "str2result: (%s) unknown.\n", s )); + "str2result: (%s) unknown.\n", s )); #else Debug( LDAP_DEBUG_ANY, "str2result (%s) unknown\n", s, 0, 0 );