summaryrefslogtreecommitdiffstats
path: root/ldap/servers/slapd/plugin_syntax.c
diff options
context:
space:
mode:
authorcvsadm <cvsadm>2005-01-21 00:44:34 +0000
committercvsadm <cvsadm>2005-01-21 00:44:34 +0000
commitb2093e3016027d6b5cf06b3f91f30769bfc099e2 (patch)
treecf58939393a9032182c4fbc4441164a9456e82f8 /ldap/servers/slapd/plugin_syntax.c
downloadds-ldapserver7x.tar.gz
ds-ldapserver7x.tar.xz
ds-ldapserver7x.zip
Moving NSCP Directory Server from DirectoryBranch to TRUNK, initial drop. (foxworth)ldapserver7x
Diffstat (limited to 'ldap/servers/slapd/plugin_syntax.c')
-rw-r--r--ldap/servers/slapd/plugin_syntax.c360
1 files changed, 360 insertions, 0 deletions
diff --git a/ldap/servers/slapd/plugin_syntax.c b/ldap/servers/slapd/plugin_syntax.c
new file mode 100644
index 00000000..caace965
--- /dev/null
+++ b/ldap/servers/slapd/plugin_syntax.c
@@ -0,0 +1,360 @@
+/** BEGIN COPYRIGHT BLOCK
+ * Copyright 2001 Sun Microsystems, Inc.
+ * Portions copyright 1999, 2001-2003 Netscape Communications Corporation.
+ * All rights reserved.
+ * END COPYRIGHT BLOCK **/
+
+/*
+ * plugin_syntax.c - routines for calling syntax plugins
+ */
+
+
+#include "slap.h"
+
+
+struct slapdplugin *
+plugin_syntax_find( const char *nameoroid )
+{
+ struct slapdplugin *pi;
+
+ /* LDAPDebug( LDAP_DEBUG_FILTER, "=> plugin_syntax_find (%s)\n", nameoroid, 0, 0 ); */
+ for ( pi = get_plugin_list(PLUGIN_LIST_SYNTAX); pi != NULL; pi = pi->plg_next ) {
+ if ( charray_inlist( pi->plg_syntax_names, (char *)nameoroid ) ) {
+ break;
+ }
+ }
+ /* LDAPDebug( LDAP_DEBUG_FILTER, "<= plugin_syntax_find %d\n", pi, 0, 0 ); */
+ return ( pi );
+}
+
+
+/*
+ * Enumerate all the syntax plugins, calling (*sef)() for each one.
+ */
+void
+plugin_syntax_enumerate( SyntaxEnumFunc sef, void *arg )
+{
+ struct slapdplugin *pi;
+
+ for ( pi = get_plugin_list(PLUGIN_LIST_SYNTAX); pi != NULL;
+ pi = pi->plg_next ) {
+ (*sef)( pi->plg_syntax_names, &pi->plg_desc, arg );
+ }
+}
+
+
+struct slapdplugin *
+slapi_get_global_syntax_plugins()
+{
+ return get_plugin_list(PLUGIN_LIST_SYNTAX);
+}
+
+char *
+plugin_syntax2oid( struct slapdplugin *pi )
+{
+ return( pi->plg_syntax_oid );
+}
+
+int
+plugin_call_syntax_get_compare_fn(
+ void *vpi,
+ value_compare_fn_type *compare_fn
+)
+{
+ struct slapdplugin *pi = vpi;
+ *compare_fn = NULL;
+
+ LDAPDebug( LDAP_DEBUG_TRACE,
+ "=> plugin_call_syntax_get_compare_fn\n",0,0, 0 );
+
+ if ( pi == NULL ) {
+ LDAPDebug( LDAP_DEBUG_TRACE,
+ "<= plugin_syntax no plugin for attribute type\n",
+ 0, 0, 0 );
+ return( LDAP_PROTOCOL_ERROR ); /* syntax unkonwn */
+ }
+
+ if ( (pi->plg_syntax_flags & SLAPI_PLUGIN_SYNTAX_FLAG_ORDERING) == 0 ) {
+ return( LDAP_PROTOCOL_ERROR );
+ }
+
+ if (pi->plg_syntax_filter_ava == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY, "<= plugin_call_syntax_get_compare_fn: "
+ "no filter_ava found for attribute type\n", 0, 0, 0 );
+ return( LDAP_PROTOCOL_ERROR );
+ }
+
+ if (pi->plg_syntax_compare == NULL) {
+ return( LDAP_PROTOCOL_ERROR );
+ }
+
+ *compare_fn = (value_compare_fn_type) pi->plg_syntax_compare;
+
+ LDAPDebug( LDAP_DEBUG_TRACE,
+ "<= plugin_call_syntax_get_compare_fn \n", 0, 0, 0 );
+ return( 0 );
+}
+
+int
+plugin_call_syntax_filter_ava(
+ const Slapi_Attr *a,
+ int ftype,
+ struct ava *ava
+)
+{
+ return(plugin_call_syntax_filter_ava_sv(a,ftype,ava,NULL,0 /*Present*/));
+}
+
+int
+plugin_call_syntax_filter_ava_sv(
+ const Slapi_Attr *a,
+ int ftype,
+ struct ava *ava,
+ Slapi_Value **retVal,
+ int useDeletedValues
+)
+{
+ int rc;
+ Slapi_PBlock pipb;
+
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "=> plugin_call_syntax_filter_ava %s=%s\n", ava->ava_type,
+ ava->ava_value.bv_val, 0 );
+
+ if ( a->a_plugin == NULL ) {
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "<= plugin_syntax no plugin for attr (%s)\n",
+ a->a_type, 0, 0 );
+ return( LDAP_PROTOCOL_ERROR ); /* syntax unkonwn */
+ }
+
+ pblock_init( &pipb );
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, (void *) a->a_plugin );
+
+ rc = -1; /* does not match by default */
+ switch ( ftype ) {
+ case LDAP_FILTER_GE:
+ case LDAP_FILTER_LE:
+ if ( (a->a_plugin->plg_syntax_flags &
+ SLAPI_PLUGIN_SYNTAX_FLAG_ORDERING) == 0 ) {
+ rc = LDAP_PROTOCOL_ERROR;
+ break;
+ }
+ /* FALL */
+ case LDAP_FILTER_EQUALITY:
+ case LDAP_FILTER_APPROX:
+ if ( a->a_plugin->plg_syntax_filter_ava != NULL )
+ {
+ /* JCM - Maybe the plugin should use the attr value iterator too... */
+ Slapi_Value **va;
+ if(useDeletedValues)
+ va= valueset_get_valuearray(&a->a_deleted_values);
+ else
+ va= valueset_get_valuearray(&a->a_present_values);
+ if(va!=NULL)
+ {
+ rc = a->a_plugin->plg_syntax_filter_ava( &pipb,
+ &ava->ava_value,
+ va,
+ ftype, retVal );
+ }
+ }
+ break;
+ default:
+ LDAPDebug( LDAP_DEBUG_ANY, "plugin_call_syntax_filter: "
+ "unknown filter type %d\n", ftype, 0, 0 );
+ rc = LDAP_PROTOCOL_ERROR;
+ break;
+ }
+
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "<= plugin_call_syntax_filter_ava %d\n", rc, 0, 0 );
+ return( rc );
+}
+
+int
+plugin_call_syntax_filter_sub(
+ Slapi_Attr *a,
+ struct subfilt *fsub
+)
+{
+ return(plugin_call_syntax_filter_sub_sv(a,fsub));
+}
+
+int
+plugin_call_syntax_filter_sub_sv(
+ Slapi_Attr *a,
+ struct subfilt *fsub
+)
+{
+ Slapi_PBlock pipb;
+ int rc;
+
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "=> plugin_call_syntax_filter_sub\n", 0, 0, 0 );
+
+ if ( a->a_plugin == NULL ) {
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "<= plugin_call_syntax_filter no plugin\n", 0, 0, 0 );
+ return( -1 ); /* syntax unkonwn - does not match */
+ }
+
+ if ( a->a_plugin->plg_syntax_filter_sub != NULL )
+ {
+ Slapi_Value **va= valueset_get_valuearray(&a->a_present_values);
+ pblock_init( &pipb );
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, (void *) a->a_plugin );
+ rc = a->a_plugin->plg_syntax_filter_sub( &pipb,
+ fsub->sf_initial, fsub->sf_any, fsub->sf_final, va);
+ } else {
+ rc = -1;
+ }
+
+ LDAPDebug( LDAP_DEBUG_FILTER, "<= plugin_call_syntax_filter_sub_sv %d\n",
+ rc, 0, 0 );
+ return( rc );
+}
+
+SLAPI_DEPRECATED int
+slapi_call_syntax_values2keys( /* JCM SLOW FUNCTION */
+ void *vpi,
+ struct berval **vals,
+ struct berval ***ivals,
+ int ftype
+)
+{
+ int rc;
+ Slapi_Value **svin= NULL;
+ Slapi_Value **svout= NULL;
+ valuearray_init_bervalarray(vals,&svin); /* JCM SLOW FUNCTION */
+ rc= slapi_call_syntax_values2keys_sv(vpi,svin,&svout,ftype);
+ valuearray_get_bervalarray(svout,ivals); /* JCM SLOW FUNCTION */
+ valuearray_free(&svout);
+ valuearray_free(&svin);
+ return rc;
+}
+
+int
+slapi_call_syntax_values2keys_sv(
+ void *vpi,
+ Slapi_Value **vals,
+ Slapi_Value ***ivals,
+ int ftype
+)
+{
+ int rc;
+ Slapi_PBlock pipb;
+ struct slapdplugin *pi = vpi;
+
+ LDAPDebug( LDAP_DEBUG_FILTER, "=> slapi_call_syntax_values2keys\n",
+ 0, 0, 0 );
+
+ pblock_init( &pipb );
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, vpi );
+
+ *ivals = NULL;
+ rc = -1; /* means no values2keys function */
+ if ( pi != NULL && pi->plg_syntax_values2keys != NULL ) {
+ rc = pi->plg_syntax_values2keys( &pipb, vals, ivals, ftype );
+ }
+
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "<= slapi_call_syntax_values2keys %d\n", rc, 0, 0 );
+ return( rc );
+}
+
+SLAPI_DEPRECATED int
+slapi_call_syntax_assertion2keys_ava( /* JCM SLOW FUNCTION */
+ void *vpi,
+ struct berval *val,
+ struct berval ***ivals,
+ int ftype
+)
+{
+ int rc;
+ Slapi_Value svin;
+ Slapi_Value **svout= NULL;
+ slapi_value_init_berval(&svin, val);
+ rc= slapi_call_syntax_assertion2keys_ava_sv(vpi,&svin,&svout,ftype);
+ valuearray_get_bervalarray(svout,ivals); /* JCM SLOW FUNCTION */
+ valuearray_free(&svout);
+ value_done(&svin);
+ return rc;
+}
+
+SLAPI_DEPRECATED int
+slapi_call_syntax_assertion2keys_ava_sv(
+ void *vpi,
+ Slapi_Value *val,
+ Slapi_Value ***ivals,
+ int ftype
+)
+{
+ int rc;
+ Slapi_PBlock pipb;
+ struct slapdplugin *pi = vpi;
+
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "=> slapi_call_syntax_assertion2keys_ava\n", 0, 0, 0 );
+
+ pblock_init( &pipb );
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, vpi );
+
+ rc = -1; /* means no assertion2keys function */
+ if ( pi->plg_syntax_assertion2keys_ava != NULL ) {
+ rc = pi->plg_syntax_assertion2keys_ava( &pipb, val, ivals, ftype );
+ }
+
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "<= slapi_call_syntax_assertion2keys_ava %d\n", rc, 0, 0 );
+ return( rc );
+}
+
+SLAPI_DEPRECATED int
+slapi_call_syntax_assertion2keys_sub( /* JCM SLOW FUNCTION */
+ void *vpi,
+ char *initial,
+ char **any,
+ char *final,
+ struct berval ***ivals
+)
+{
+ int rc;
+ Slapi_Value **svout= NULL;
+ rc= slapi_call_syntax_assertion2keys_sub_sv(vpi,initial,any,final,&svout);
+ valuearray_get_bervalarray(svout,ivals); /* JCM SLOW FUNCTION */
+ valuearray_free(&svout);
+ return rc;
+}
+
+int
+slapi_call_syntax_assertion2keys_sub_sv(
+ void *vpi,
+ char *initial,
+ char **any,
+ char *final,
+ Slapi_Value ***ivals
+)
+{
+ int rc;
+ Slapi_PBlock pipb;
+ struct slapdplugin *pi = vpi;
+
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "=> slapi_call_syntax_assertion2keys_sub\n", 0, 0, 0 );
+
+ pblock_init( &pipb );
+ slapi_pblock_set( &pipb, SLAPI_PLUGIN, vpi );
+
+ rc = -1; /* means no assertion2keys function */
+ *ivals = NULL;
+ if ( pi->plg_syntax_assertion2keys_sub != NULL ) {
+ rc = pi->plg_syntax_assertion2keys_sub( &pipb, initial, any,
+ final, ivals );
+ }
+
+ LDAPDebug( LDAP_DEBUG_FILTER,
+ "<= slapi_call_syntax_assertion2keys_sub %d\n", rc, 0, 0 );
+ return( rc );
+}
+