static int or_filter_match (void* obj, Slapi_Entry* entry, Slapi_Attr* attr) /* returns: 0 filter matched * -1 filter did not match * >0 an LDAP error code */ { auto int rc = -1; /* no match */ auto or_filter_t* or = (or_filter_t*)obj; for (; attr != NULL; slapi_entry_next_attr (entry, attr, &attr)) { auto char* type = NULL; auto struct berval** vals = NULL; /* * XXXmcs 1-March-2001: This code would perform better if it did not make * a copy of the values here, but that would require re-writing the code * in this file to use Slapi_ValueSet's instead of struct berval **'s * (and that is not a small project). */ if (!slapi_attr_get_type (attr, &type) && type != NULL && !slapi_attr_type_cmp (or->or_type, type, 2/*match subtypes*/) && !slapi_attr_get_bervals_copy(attr, &vals) && vals != NULL) { if (or->or_op == SLAPI_OP_SUBSTRING) { rc = ss_filter_match (or, vals); } else { rc = op_filter_match (or, vals); } ber_bvecfree( vals ); vals = NULL; if (rc >= 0) break; } } return rc; }
/* reads the cookie in dse.ldif to the replication agreement entry returns: ldap result code of ldap operation, or LDAP_NO_SUCH_ATTRIBUTE. (this is the equilivent of a null cookie) */ int windows_private_load_dirsync_cookie(const Repl_Agmt *ra) { Dirsync_Private *dp = NULL; Slapi_PBlock *pb = NULL; Slapi_DN* sdn = NULL; int rc = 0; Slapi_Entry *entry = NULL; Slapi_Attr *attr = NULL; LDAPDebug0Args( LDAP_DEBUG_TRACE, "=> windows_private_load_dirsync_cookie\n" ); PR_ASSERT(ra); dp = (Dirsync_Private *) agmt_get_priv(ra); PR_ASSERT (dp); pb = slapi_pblock_new (); sdn = slapi_sdn_dup( agmt_get_dn_byref(ra) ); rc = slapi_search_internal_get_entry(sdn, NULL, &entry, repl_get_plugin_identity (PLUGIN_MULTIMASTER_REPLICATION)); if (rc == 0) { rc= slapi_entry_attr_find( entry, type_nsds7DirsyncCookie, &attr ); if (attr) { struct berval **vals; rc = slapi_attr_get_bervals_copy(attr, &vals ); if (vals) { dp->dirsync_cookie_len = (int) (vals[0])->bv_len; slapi_ch_free_string(&dp->dirsync_cookie); dp->dirsync_cookie = ( char* ) slapi_ch_malloc(dp->dirsync_cookie_len + 1); memcpy(dp->dirsync_cookie,(vals[0]->bv_val), (vals[0])->bv_len+1); } ber_bvecfree(vals); /* we do not free attr */ } else { rc = LDAP_NO_SUCH_ATTRIBUTE; } } if (entry) { slapi_entry_free(entry); } slapi_sdn_free( &sdn); slapi_pblock_destroy (pb); LDAPDebug0Args( LDAP_DEBUG_TRACE, "<= windows_private_load_dirsync_cookie\n" ); return rc; }