* without express or implied warranty.
*/
/*
- * Portions (C) Copyright PADL Software Pty Ltd.
+ * Portions (C) Copyright PADL Software Pty Ltd. 2003
* Redistribution and use in source and binary forms are permitted
* provided that this notice is preserved and that due credit is
* given to PADL Software Pty Ltd. This software is provided ``as is''
*/
#include "portable.h"
-#include "slapi_common.h"
#include <ac/string.h>
+#include <ac/stdarg.h>
+#include <ac/ctype.h>
+#include <ac/unistd.h>
+#include <ldap_pvt.h>
#include <slap.h>
#include <slapi.h>
-#include <stdarg.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <ldap_pvt.h>
-
-struct berval *ns_get_supported_extop( int );
#ifdef _SPARC
#include <sys/systeminfo.h>
tmpberval[i].bv_val = bvptr[i]->bv_val;
tmpberval[i].bv_len = bvptr[i]->bv_len;
}
+ tmpberval[i].bv_val = NULL;
+ tmpberval[i].bv_len = 0;
if ( rc == LDAP_SUCCESS ) {
*bvobj = tmpberval;
char *s,
int check_dup )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
Slapi_Entry *e = NULL;
char *pTmpS;
}
return e;
-#else /* !defined(LDAP_SLAPI) */
+#else
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
char *
Slapi_Entry *e,
int *len )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
char *ret;
ldap_pvt_thread_mutex_lock( &entry2str_mutex );
ldap_pvt_thread_mutex_unlock( &entry2str_mutex );
return ret;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
char *
slapi_entry_get_dn( Slapi_Entry *e )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
return e->e_name.bv_val;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
int
slapi_x_entry_get_id( Slapi_Entry *e )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
return e->e_id;
#else
return NOID;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
void
Slapi_Entry *e,
char *ldn )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
struct berval dn = { 0, NULL };
dn.bv_val = ldn;
dn.bv_len = strlen( ldn );
dnPrettyNormal( NULL, &dn, &e->e_name, &e->e_nname );
-#endif /* defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
Slapi_Entry *
slapi_entry_dup( Slapi_Entry *e )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
char *tmp = NULL;
Slapi_Entry *tmpEnt;
int len = 0;
}
return tmpEnt;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
int
Slapi_Entry *e,
char *type )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
AttributeDescription *ad = NULL;
const char *text;
} else {
return -1; /* something went wrong */
}
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return -1;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
Slapi_Entry *
slapi_entry_alloc( void )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
return (Slapi_Entry *)slapi_ch_calloc( 1, sizeof(Slapi_Entry) );
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
void
slapi_entry_free( Slapi_Entry *e )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
entry_free( e );
-#endif /* defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
int
char *type,
struct berval **vals )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
AttributeDescription *ad = NULL;
const char *text;
BerVarray bv;
return -1;
}
- rc = attr_merge( e, ad, bv );
+ rc = attr_mergeit( e, ad, bv );
ch_free( bv );
return rc;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return -1;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
int
char *type,
Slapi_Attr **attr )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
AttributeDescription *ad = NULL;
const char *text;
int rc;
}
return 0;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return -1;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
char *
{
#ifdef LDAP_SLAPI
struct berval bv;
- AttributeDescription *ad;
+ AttributeDescription *ad = NULL;
const char *text;
int rc;
Attribute *attr;
bv.bv_val = (char *)value;
bv.bv_len = strlen( value );
- return slapi_attr_value_find( attr, &bv );
+ return ( slapi_attr_value_find( attr, &bv ) != -1 );
#else
return 0;
#endif
}
+void
+slapi_entry_attr_set_charptr(Slapi_Entry* e, const char *type, const char *value)
+{
+#ifdef LDAP_SLAPI
+ AttributeDescription *ad = NULL;
+ const char *text;
+ int rc;
+ struct berval bv;
+
+ rc = slap_str2ad( type, &ad, &text );
+ if ( rc != LDAP_SUCCESS ) {
+ return;
+ }
+
+ attr_delete ( &e->e_attrs, ad );
+ if ( value != NULL ) {
+ bv.bv_val = (char *)value;
+ bv.bv_len = strlen(value);
+ attr_mergeit_one( e, ad, &bv );
+ }
+#endif /* LDAP_SLAPI */
+}
+
+void
+slapi_entry_attr_set_int( Slapi_Entry* e, const char *type, int l)
+{
+#ifdef LDAP_SLAPI
+ char buf[64];
+
+ snprintf( buf, sizeof( buf ), "%d", l );
+ slapi_entry_attr_set_charptr( e, type, buf );
+#endif /* LDAP_SLAPI */
+}
+
+void
+slapi_entry_attr_set_uint( Slapi_Entry* e, const char *type, unsigned int l)
+{
+#ifdef LDAP_SLAPI
+ char buf[64];
+
+ snprintf( buf, sizeof( buf ), "%u", l );
+ slapi_entry_attr_set_charptr( e, type, buf );
+#endif /* LDAP_SLAPI */
+}
+
+void
+slapi_entry_attr_set_long(Slapi_Entry* e, const char *type, long l)
+{
+#ifdef LDAP_SLAPI
+ char buf[64];
+
+ snprintf( buf, sizeof( buf ), "%ld", l );
+ slapi_entry_attr_set_charptr( e, type, buf );
+#endif /* LDAP_SLAPI */
+}
+
+void
+slapi_entry_attr_set_ulong(Slapi_Entry* e, const char *type, unsigned long l)
+{
+#ifdef LDAP_SLAPI
+ char buf[64];
+
+ snprintf( buf, sizeof( buf ), "%lu", l );
+ slapi_entry_attr_set_charptr( e, type, buf );
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_is_rootdse( const char *dn )
+{
+#ifdef LDAP_SLAPI
+ return ( dn == NULL || dn[0] == '\0' );
+#else
+ return 0;
+#endif
+}
+
+/*
+ * Add values to entry.
+ *
+ * Returns:
+ * LDAP_SUCCESS Values added to entry
+ * LDAP_TYPE_OR_VALUE_EXISTS One or more values exist in entry already
+ * LDAP_CONSTRAINT_VIOLATION Any other error (odd, but it's the spec)
+ */
+int
+slapi_entry_add_values( Slapi_Entry *e, const char *type, struct berval **vals )
+{
+#ifdef LDAP_SLAPI
+ Modification mod;
+ const char *text;
+ int rc;
+ char textbuf[SLAP_TEXT_BUFLEN];
+
+ mod.sm_op = LDAP_MOD_ADD;
+ mod.sm_desc = NULL;
+ mod.sm_type.bv_val = (char *)type;
+ mod.sm_type.bv_len = strlen( type );
+
+ rc = slap_str2ad( type, &mod.sm_desc, &text );
+ if ( rc != LDAP_SUCCESS ) {
+ return rc;
+ }
+
+ if ( vals == NULL ) {
+ /* Apparently vals can be NULL
+ * FIXME: sm_bvalues = NULL ? */
+ mod.sm_bvalues = (BerVarray)ch_malloc( sizeof(struct berval) );
+ mod.sm_bvalues->bv_val = NULL;
+
+ } else {
+ rc = bvptr2obj( vals, &mod.sm_bvalues );
+ if ( rc != LDAP_SUCCESS ) {
+ return LDAP_CONSTRAINT_VIOLATION;
+ }
+ }
+#ifdef SLAP_NVALUES
+ mod.sm_nvalues = NULL;
+#endif
+
+ rc = modify_add_values( e, &mod, 0, &text, textbuf, sizeof(textbuf) );
+
+ ch_free( mod.sm_bvalues );
+
+ return (rc == LDAP_SUCCESS) ? LDAP_SUCCESS : LDAP_CONSTRAINT_VIOLATION;
+#else
+ return -1;
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_entry_add_values_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals )
+{
+#ifdef LDAP_SLAPI
+ return slapi_entry_add_values( e, type, vals );
+#else
+ return -1;
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_entry_add_valueset(Slapi_Entry *e, const char *type, Slapi_ValueSet *vs)
+{
+#ifdef LDAP_SLAPI
+ AttributeDescription *ad = NULL;
+ const char *text;
+ int rc;
+
+ rc = slap_str2ad( type, &ad, &text );
+ if ( rc != LDAP_SUCCESS ) {
+ return -1;
+ }
+
+ return attr_mergeit( e, ad, *vs );
+#else
+ return -1;
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_entry_delete_values( Slapi_Entry *e, const char *type, struct berval **vals )
+{
+#ifdef LDAP_SLAPI
+ Modification mod;
+ const char *text;
+ int rc;
+ char textbuf[SLAP_TEXT_BUFLEN];
+
+ mod.sm_op = LDAP_MOD_DELETE;
+ mod.sm_desc = NULL;
+ mod.sm_type.bv_val = (char *)type;
+ mod.sm_type.bv_len = strlen( type );
+
+ if ( vals == NULL ) {
+ /* If vals is NULL, this is a NOOP. */
+ return LDAP_SUCCESS;
+ }
+
+ rc = slap_str2ad( type, &mod.sm_desc, &text );
+ if ( rc != LDAP_SUCCESS ) {
+ return rc;
+ }
+
+ if ( vals[0] == NULL ) {
+ /* SLAPI doco says LDAP_OPERATIONS_ERROR but LDAP_OTHER is better */
+ return attr_delete( &e->e_attrs, mod.sm_desc ) ? LDAP_OTHER : LDAP_SUCCESS;
+ }
+
+ rc = bvptr2obj( vals, &mod.sm_bvalues );
+ if ( rc != LDAP_SUCCESS ) {
+ return LDAP_CONSTRAINT_VIOLATION;
+ }
+#if SLAP_NVALUES
+ mod.sm_nvalues = NULL;
+#endif
+
+ rc = modify_delete_values( e, &mod, 0, &text, textbuf, sizeof(textbuf) );
+
+ ch_free( mod.sm_bvalues );
+
+ return rc;
+#else
+ return -1;
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_entry_delete_values_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals )
+{
+#ifdef LDAP_SLAPI
+ return slapi_entry_delete_values( e, type, vals );
+#else
+ return -1;
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_entry_merge_values_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals )
+{
+#ifdef LDAP_SLAPI
+ return slapi_entry_attr_merge( e, (char *)type, vals );
+#else
+ return -1;
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_entry_add_value(Slapi_Entry *e, const char *type, const Slapi_Value *value)
+{
+#ifdef LDAP_SLAPI
+ AttributeDescription *ad = NULL;
+ int rc;
+ const char *text;
+
+ rc = slap_str2ad( type, &ad, &text );
+ if ( rc != LDAP_SUCCESS ) {
+ return -1;
+ }
+
+ rc = attr_mergeit_one( e, ad, (Slapi_Value *)value );
+ if ( rc != LDAP_SUCCESS ) {
+ return -1;
+ }
+
+ return 0;
+#else
+ return -1;
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_entry_add_string(Slapi_Entry *e, const char *type, const char *value)
+{
+#ifdef LDAP_SLAPI
+ Slapi_Value val;
+
+ val.bv_val = (char *)value;
+ val.bv_len = strlen( value );
+
+ return slapi_entry_add_value( e, type, &val );
+#else
+ return -1;
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_entry_delete_string(Slapi_Entry *e, const char *type, const char *value)
+{
+#ifdef LDAP_SLAPI
+ Slapi_Value *vals[2];
+ Slapi_Value val;
+
+ val.bv_val = (char *)value;
+ val.bv_len = strlen( value );
+ vals[0] = &val;
+ vals[1] = NULL;
+
+ return slapi_entry_delete_values_sv( e, type, vals );
+#else
+ return -1;
+#endif /* LDAP_SLAPI */
+}
+
+
int
slapi_entry_attr_merge_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals )
{
slapi_entry_attr_replace_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals )
{
#ifdef LDAP_SLAPI
- AttributeDescription *ad;
+ AttributeDescription *ad = NULL;
const char *text;
int rc;
BerVarray bv;
return -1;
}
- rc = attr_merge( e, ad, bv );
+ rc = attr_mergeit( e, ad, bv );
slapi_ch_free( (void **)&bv );
if ( rc != LDAP_SUCCESS ) {
return -1;
Slapi_Attr *attr,
struct berval ***vals )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
int i, j;
struct berval **bv;
*vals = (struct berval **)bv;
return 0;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return -1;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
char *
slapi_dn_normalize( char *dn )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
struct berval bdn;
struct berval ndn;
ch_free( ndn.bv_val );
return dn;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
/*
char *
slapi_dn_normalize_case( char *dn )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
slapi_dn_normalize( dn );
ldap_pvt_str2lower( dn );
return dn;
-#else /* defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
int
char *dn,
char *suffix )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
struct berval bdn, ndn;
struct berval bsuffix, nsuffix;
+ int rc;
assert( dn != NULL );
assert( suffix != NULL );
bsuffix.bv_val = suffix;
bsuffix.bv_len = strlen( suffix );
- dnNormalize2( NULL, &bdn, &ndn );
- dnNormalize2( NULL, &bsuffix, &nsuffix );
+ if ( dnNormalize2( NULL, &bdn, &ndn ) != LDAP_SUCCESS ) {
+ return 0;
+ }
+
+ if ( dnNormalize2( NULL, &bsuffix, &nsuffix ) != LDAP_SUCCESS ) {
+ slapi_ch_free( (void **)&ndn.bv_val );
+ return 0;
+ }
+
+ rc = dnIsSuffix( &ndn, &nsuffix );
+
+ slapi_ch_free( (void **)&ndn.bv_val );
+ slapi_ch_free( (void **)&nsuffix.bv_val );
- return dnIsSuffix( &ndn, &nsuffix );
-#else /* !defined(LDAP_SLAPI) */
+ return rc;
+#else /* LDAP_SLAPI */
return 0;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
char *
slapi_dn_ignore_case( char *dn )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
return slapi_dn_normalize_case( dn );
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
char *
slapi_ch_malloc( unsigned long size )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
return ch_malloc( size );
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
void
slapi_ch_free( void **ptr )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
ch_free( *ptr );
*ptr = NULL;
-#endif /* defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
void
slapi_ch_free_string( char **ptr )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
slapi_ch_free( (void **)ptr );
-#endif /* defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
void
unsigned long nelem,
unsigned long size )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
return ch_calloc( nelem, size );
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
char *
char *block,
unsigned long size )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
return ch_realloc( block, size );
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
char *
slapi_ch_strdup( char *s )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
return ch_strdup( (const char *)s );
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
size_t
slapi_ch_stlen( char *s )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
return strlen( (const char *)s );
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return 0;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
int
struct berval **val,
int *iscritical )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
int i;
int rc = 0;
}
return rc;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return 0;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
+}
+
+#ifdef LDAP_SLAPI
+static void
+slapControlMask2SlapiControlOp(slap_mask_t slap_mask,
+ unsigned long *slapi_mask)
+{
+ *slapi_mask = SLAPI_OPERATION_NONE;
+
+ if ( slap_mask & SLAP_CTRL_ABANDON )
+ *slapi_mask |= SLAPI_OPERATION_ABANDON;
+
+ if ( slap_mask & SLAP_CTRL_ADD )
+ *slapi_mask |= SLAPI_OPERATION_ADD;
+
+ if ( slap_mask & SLAP_CTRL_BIND )
+ *slapi_mask |= SLAPI_OPERATION_BIND;
+
+ if ( slap_mask & SLAP_CTRL_COMPARE )
+ *slapi_mask |= SLAPI_OPERATION_COMPARE;
+
+ if ( slap_mask & SLAP_CTRL_DELETE )
+ *slapi_mask |= SLAPI_OPERATION_DELETE;
+
+ if ( slap_mask & SLAP_CTRL_MODIFY )
+ *slapi_mask |= SLAPI_OPERATION_MODIFY;
+
+ if ( slap_mask & SLAP_CTRL_RENAME )
+ *slapi_mask |= SLAPI_OPERATION_MODDN;
+
+ if ( slap_mask & SLAP_CTRL_SEARCH )
+ *slapi_mask |= SLAPI_OPERATION_SEARCH;
+
+ if ( slap_mask & SLAP_CTRL_UNBIND )
+ *slapi_mask |= SLAPI_OPERATION_UNBIND;
+}
+
+static void
+slapiControlOp2SlapControlMask(unsigned long slapi_mask,
+ slap_mask_t *slap_mask)
+{
+ *slap_mask = 0;
+
+ if ( slapi_mask & SLAPI_OPERATION_BIND )
+ *slap_mask |= SLAP_CTRL_BIND;
+
+ if ( slapi_mask & SLAPI_OPERATION_UNBIND )
+ *slap_mask |= SLAP_CTRL_UNBIND;
+
+ if ( slapi_mask & SLAPI_OPERATION_SEARCH )
+ *slap_mask |= SLAP_CTRL_SEARCH;
+
+ if ( slapi_mask & SLAPI_OPERATION_MODIFY )
+ *slap_mask |= SLAP_CTRL_MODIFY;
+
+ if ( slapi_mask & SLAPI_OPERATION_ADD )
+ *slap_mask |= SLAP_CTRL_ADD;
+
+ if ( slapi_mask & SLAPI_OPERATION_DELETE )
+ *slap_mask |= SLAP_CTRL_DELETE;
+
+ if ( slapi_mask & SLAPI_OPERATION_MODDN )
+ *slap_mask |= SLAP_CTRL_RENAME;
+
+ if ( slapi_mask & SLAPI_OPERATION_COMPARE )
+ *slap_mask |= SLAP_CTRL_COMPARE;
+
+ if ( slapi_mask & SLAPI_OPERATION_ABANDON )
+ *slap_mask |= SLAP_CTRL_ABANDON;
+
+ *slap_mask |= SLAP_CTRL_FRONTEND;
+}
+
+static int
+parseSlapiControl(
+ Operation *op,
+ SlapReply *rs,
+ LDAPControl *ctrl )
+{
+ /* Plugins must deal with controls themselves. */
+
+ return LDAP_SUCCESS;
}
+#endif /* LDAP_SLAPI */
void
slapi_register_supported_control(
char *controloid,
unsigned long controlops )
{
-#if defined(LDAP_SLAPI)
- /* FIXME -- can not add controls to openLDAP dynamically */
- slapi_log_error( SLAPI_LOG_FATAL, "SLAPI_CONTROLS",
- "can not add controls to openLDAP dynamically\n" );
-#endif /* defined(LDAP_SLAPI) */
+#ifdef LDAP_SLAPI
+ slap_mask_t controlmask;
+
+ slapiControlOp2SlapControlMask( controlops, &controlmask );
+
+ register_supported_control( controloid, controlmask, NULL, parseSlapiControl );
+#endif /* LDAP_SLAPI */
}
int
char ***ctrloidsp,
unsigned long **ctrlopsp )
{
-#if defined(LDAP_SLAPI)
- int i, n;
- int rc = 1;
- char **oids = NULL;
- unsigned long *masks = NULL;
-
- for (n = 0; get_supported_ctrl( n ) != NULL; n++) {
- ; /* count them */
- }
-
- if ( n == 0 ) {
- /* no controls */
- *ctrloidsp = NULL;
- *ctrlopsp = NULL;
- return LDAP_SUCCESS;
- }
-
+#ifdef LDAP_SLAPI
+ int i, rc;
- oids = (char **)slapi_ch_malloc( (n + 1) * sizeof(char *) );
- if ( oids == NULL ) {
- rc = LDAP_NO_MEMORY;
- goto error_return;
+ rc = get_supported_controls( ctrloidsp, (slap_mask_t **)ctrlopsp );
+ if ( rc != LDAP_SUCCESS ) {
+ return rc;
}
- masks = (unsigned long *)slapi_ch_malloc( n * sizeof(int) );
- if ( masks == NULL ) {
- rc = LDAP_NO_MEMORY;
- goto error_return;
+ for ( i = 0; (*ctrloidsp)[i] != NULL; i++ ) {
+ /* In place, naughty. */
+ slapControlMask2SlapiControlOp( (*ctrlopsp)[i], &((*ctrlopsp)[i]) );
}
- for ( i = 0; i < n; i++ ) {
- /*
- * FIXME: Netscape's specification says nothing about
- * memory; should we copy the OIDs or return pointers
- * to internal values? In OpenLDAP the latter is safe
- * since we do not allow to register coltrols runtime
- */
- oids[ i ] = ch_strdup( get_supported_ctrl( i ) );
- if ( oids[ i ] == NULL ) {
- rc = LDAP_NO_MEMORY;
- goto error_return;
- }
- masks[ i ] = (unsigned long)get_supported_ctrl_mask( i );
- }
-
- *ctrloidsp = oids;
- *ctrlopsp = masks;
return LDAP_SUCCESS;
+#else /* LDAP_SLAPI */
+ return 1;
+#endif /* LDAP_SLAPI */
+}
-error_return:
- if ( rc != LDAP_SUCCESS ) {
- for ( i = 0; oids != NULL && oids[ i ] != NULL; i++ ) {
- ch_free( oids[ i ] );
- }
- ch_free( oids );
- ch_free( masks );
- }
+LDAPControl *
+slapi_dup_control( LDAPControl *ctrl )
+{
+#ifdef LDAP_SLAPI
+ LDAPControl *ret;
- return rc;
-#else /* !defined(LDAP_SLAPI) */
- return 1;
-#endif /* !defined(LDAP_SLAPI) */
+ ret = (LDAPControl *)slapi_ch_malloc( sizeof(*ret) );
+ ret->ldctl_oid = slapi_ch_strdup( ctrl->ldctl_oid );
+ ber_dupbv( &ret->ldctl_value, &ctrl->ldctl_value );
+ ret->ldctl_iscritical = ctrl->ldctl_iscritical;
+
+ return ret;
+#else
+ return NULL;
+#endif /* LDAP_SLAPI */
}
void
slapi_register_supported_saslmechanism( char *mechanism )
{
-#if defined(LDAP_SLAPI)
- /* FIXME -- can not add saslmechanism to openLDAP dynamically */
+#ifdef LDAP_SLAPI
+ /* FIXME -- can not add saslmechanism to OpenLDAP dynamically */
slapi_log_error( SLAPI_LOG_FATAL, "SLAPI_SASL",
- "can not add saslmechanism to openLDAP dynamically\n" );
-#endif /* defined(LDAP_SLAPI) */
+ "OpenLDAP does not support dynamic registration of SASL mechanisms\n" );
+#endif /* LDAP_SLAPI */
}
char **
slapi_get_supported_saslmechanisms( void )
{
-#if defined(LDAP_SLAPI)
- /* FIXME -- can not get the saslmechanism wihtout a connection. */
+#ifdef LDAP_SLAPI
+ /* FIXME -- can not get the saslmechanism without a connection. */
slapi_log_error( SLAPI_LOG_FATAL, "SLAPI_SASL",
- "can not get the saslmechanism "
- "wihtout a connection\n" );
+ "can not get the SASL mechanism list "
+ "without a connection\n" );
return NULL;
-#else /* defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
char **
slapi_get_supported_extended_ops( void )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
int i, j, k;
char **ppExtOpOID = NULL;
int numExtOps = 0;
ppExtOpOID[ i + k ] = NULL;
return ppExtOpOID;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
void
int nentries,
struct berval **urls )
{
-#if defined(LDAP_SLAPI)
- Connection *conn;
+#ifdef LDAP_SLAPI
Operation *op;
struct berval *s;
char *extOID = NULL;
struct berval *extValue = NULL;
int rc;
+ SlapReply rs = { REP_RESULT };
- slapi_pblock_get( pb, SLAPI_CONNECTION, &conn );
slapi_pblock_get( pb, SLAPI_OPERATION, &op );
+
+ rs.sr_err = err;
+ rs.sr_matched = matched;
+ rs.sr_text = text;
+ rs.sr_ref = NULL;
+ rs.sr_ctrls = NULL;
+
+ slapi_pblock_get( pb, SLAPI_RESCONTROLS, &rs.sr_ctrls );
+
if ( err == LDAP_SASL_BIND_IN_PROGRESS ) {
- slapi_pblock_get( pb, SLAPI_BIND_RET_SASLCREDS, &s );
- rc = LDAP_SASL_BIND_IN_PROGRESS;
- send_ldap_sasl( conn, op, rc, NULL, NULL, NULL, NULL, s );
+ slapi_pblock_get( pb, SLAPI_BIND_RET_SASLCREDS, (void *) &rs.sr_sasldata );
+ send_ldap_sasl( op, &rs );
return;
}
slapi_pblock_get( pb, SLAPI_EXT_OP_RET_OID, &extOID );
if ( extOID != NULL ) {
- slapi_pblock_get( pb, SLAPI_EXT_OP_RET_VALUE, &extValue );
- slapi_send_ldap_extended_response( conn, op, err, extOID,
- extValue );
+ rs.sr_rspoid = extOID;
+ slapi_pblock_get( pb, SLAPI_EXT_OP_RET_VALUE, &rs.sr_rspdata );
+ send_ldap_extended( op, &rs );
return;
}
- send_ldap_result( conn, op, err, matched, text, NULL, NULL );
-#endif /* defined(LDAP_SLAPI) */
+ if (op->o_tag == LDAP_REQ_SEARCH)
+ rs.sr_nentries = nentries;
+
+ send_ldap_result( op, &rs );
+#endif /* LDAP_SLAPI */
}
int
char **attrs,
int attrsonly )
{
-#if defined(LDAP_SLAPI)
- Backend *be;
- Connection *pConn;
+#ifdef LDAP_SLAPI
Operation *pOp;
- int rc;
-
+ SlapReply rs = { REP_RESULT };
int i;
AttributeName *an = NULL;
const char *text;
}
if ( i > 0 ) {
- an = (AttributeName *) ch_malloc( i * sizeof(AttributeName) );
+ an = (AttributeName *) ch_malloc( (i+1) * sizeof(AttributeName) );
for ( i = 0; attrs[i] != NULL; i++ ) {
an[i].an_name.bv_val = ch_strdup( attrs[i] );
an[i].an_name.bv_len = strlen( attrs[i] );
if( slap_bv2ad( &an[i].an_name, &an[i].an_desc, &text ) != LDAP_SUCCESS)
return -1;
}
+ an[i].an_name.bv_len = 0;
+ an[i].an_name.bv_val = NULL;
}
- if ( ( rc = slapi_pblock_get( pb, SLAPI_BACKEND, (void *)&be ) != 0 ) ||
- ( rc = slapi_pblock_get( pb, SLAPI_CONNECTION, (void *)&pConn) != 0 ) ||
- ( rc = slapi_pblock_get( pb, SLAPI_OPERATION, (void *)&pOp) != 0 ) ) {
- rc = LDAP_OTHER;
- } else {
- rc = send_search_entry( be, pConn, pOp, e, an, attrsonly, NULL );
- }
+ rs.sr_err = LDAP_SUCCESS;
+ rs.sr_matched = NULL;
+ rs.sr_text = NULL;
+ rs.sr_ref = NULL;
+ rs.sr_ctrls = ectrls;
+ rs.sr_attrs = an;
+ rs.sr_entry = e;
+ rs.sr_v2ref = NULL;
- return rc;
+ if ( slapi_pblock_get( pb, SLAPI_OPERATION, (void *)&pOp ) != 0 ) {
+ return LDAP_OTHER;
+ }
-#else /* !defined(LDAP_SLAPI) */
+ return send_search_entry( pOp, &rs );
+#else /* LDAP_SLAPI */
return -1;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
Slapi_Filter *
slapi_str2filter( char *str )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
return str2filter( str );
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
void
Slapi_Filter *f,
int recurse )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
filter_free( f );
-#endif /* defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
+}
+
+Slapi_Filter *
+slapi_filter_dup( Slapi_Filter *filter )
+{
+#ifdef LDAP_SLAPI
+ Filter *f;
+
+ f = (Filter *) slapi_ch_malloc( sizeof(Filter) );
+ f->f_next = NULL;
+ f->f_choice = filter->f_choice;
+
+ switch ( f->f_choice ) {
+ case LDAP_FILTER_AND:
+ case LDAP_FILTER_NOT:
+ case LDAP_FILTER_OR: {
+ Filter *pFilter, **ppF;
+
+ for ( pFilter = filter->f_list, ppF = &f->f_list;
+ pFilter != NULL;
+ pFilter = pFilter->f_next, ppF = &f->f_next )
+ {
+ *ppF = slapi_filter_dup( pFilter );
+ if ( *ppF == NULL )
+ break;
+ }
+ break;
+ }
+ case LDAP_FILTER_PRESENT:
+ f->f_desc = filter->f_desc;
+ break;
+ case LDAP_FILTER_EQUALITY:
+ case LDAP_FILTER_GE:
+ case LDAP_FILTER_LE:
+ case LDAP_FILTER_APPROX:
+ f->f_ava = (AttributeAssertion *)slapi_ch_malloc( sizeof(AttributeAssertion) );
+ f->f_ava->aa_desc = filter->f_ava->aa_desc;
+ ber_dupbv( &f->f_ava->aa_value, &filter->f_ava->aa_value );
+ break;
+ case LDAP_FILTER_EXT:
+ f->f_mra = (MatchingRuleAssertion *)slapi_ch_malloc( sizeof(MatchingRuleAssertion) );
+ f->f_mra->ma_rule = filter->f_mra->ma_rule;
+ f->f_mra->ma_rule_text = filter->f_mra->ma_rule_text; /* struct copy */
+ f->f_mra->ma_desc = filter->f_mra->ma_desc;
+ f->f_mra->ma_dnattrs = filter->f_mra->ma_dnattrs;
+ ber_dupbv( &f->f_mra->ma_value, &filter->f_mra->ma_value );
+ case LDAP_FILTER_SUBSTRINGS: {
+ int i;
+
+ f->f_sub = (SubstringsAssertion *)slapi_ch_malloc( sizeof(SubstringsAssertion) );
+ ber_dupbv( &f->f_sub_initial, &filter->f_sub_initial );
+ for ( i = 0; filter->f_sub_any[i].bv_val != NULL; i++ )
+ ;
+ f->f_sub_any = (BerVarray)slapi_ch_malloc( (i + 1) * (sizeof(struct berval)) );
+ for ( i = 0; filter->f_sub_any[i].bv_val != NULL; i++ ) {
+ ber_dupbv( &f->f_sub_any[i], &filter->f_sub_any[i] );
+ }
+ f->f_sub_any[i].bv_val = NULL;
+ ber_dupbv( &f->f_sub_final, &filter->f_sub_final );
+ break;
+ }
+ case SLAPD_FILTER_COMPUTED:
+ f->f_result = filter->f_result;
+ break;
+ default:
+ slapi_ch_free( (void **)&f );
+ f = NULL;
+ break;
+ }
+
+ return f;
+#else
+ return NULL;
+#endif /* LDAP_SLAPI */
}
int
slapi_filter_get_choice( Slapi_Filter *f )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
int rc;
if ( f != NULL ) {
}
return rc;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return -1; /* invalid filter type */
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
int
char **type,
struct berval **bval )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
int ftype;
int rc = LDAP_SUCCESS;
}
return rc;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return -1;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
Slapi_Filter *
slapi_filter_list_first( Slapi_Filter *f )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
int ftype;
if ( f == NULL ) {
} else {
return NULL;
}
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
Slapi_Filter *
Slapi_Filter *f,
Slapi_Filter *fprev )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
int ftype;
if ( f == NULL ) {
}
return NULL;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
+ return NULL;
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_filter_get_attribute_type( Slapi_Filter *f, char **type )
+{
+#ifdef LDAP_SLAPI
+ if ( f == NULL ) {
+ return -1;
+ }
+
+ switch ( f->f_choice ) {
+ case LDAP_FILTER_GE:
+ case LDAP_FILTER_LE:
+ case LDAP_FILTER_EQUALITY:
+ case LDAP_FILTER_APPROX:
+ *type = f->f_av_desc->ad_cname.bv_val;
+ break;
+ case LDAP_FILTER_SUBSTRINGS:
+ *type = f->f_sub_desc->ad_cname.bv_val;
+ break;
+ case LDAP_FILTER_PRESENT:
+ *type = f->f_desc->ad_cname.bv_val;
+ break;
+ case LDAP_FILTER_EXT:
+ *type = f->f_mr_desc->ad_cname.bv_val;
+ break;
+ default:
+ /* Complex filters need not apply. */
+ *type = NULL;
+ return -1;
+ }
+
+ return 0;
+#else
+ return -1;
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_filter_get_subfilt( Slapi_Filter *f, char **type, char **initial,
+ char ***any, char **final )
+{
+#ifdef LDAP_SLAPI
+ int i;
+
+ if ( f->f_choice != LDAP_FILTER_SUBSTRINGS ) {
+ return -1;
+ }
+
+ /*
+ * The caller shouldn't free but we can't return an
+ * array of char *s from an array of bervals without
+ * allocating memory, so we may as well be consistent.
+ * XXX
+ */
+ *type = f->f_sub_desc->ad_cname.bv_val;
+ *initial = f->f_sub_initial.bv_val ? slapi_ch_strdup(f->f_sub_initial.bv_val) : NULL;
+ for ( i = 0; f->f_sub_any[i].bv_val != NULL; i++ )
+ ;
+ *any = (char **)slapi_ch_malloc( (i + 1) * sizeof(char *) );
+ for ( i = 0; f->f_sub_any[i].bv_val != NULL; i++ ) {
+ (*any)[i] = slapi_ch_strdup(f->f_sub_any[i].bv_val);
+ }
+ (*any)[i] = NULL;
+ *final = f->f_sub_final.bv_val ? slapi_ch_strdup(f->f_sub_final.bv_val) : NULL;
+
+ return 0;
+#else
+ return -1;
+#endif /* LDAP_SLAPI */
+}
+
+Slapi_Filter *
+slapi_filter_join( int ftype, Slapi_Filter *f1, Slapi_Filter *f2)
+{
+#ifdef LDAP_SLAPI
+ Slapi_Filter *f = NULL;
+
+ if ( ftype == LDAP_FILTER_AND ||
+ ftype == LDAP_FILTER_OR ||
+ ftype == LDAP_FILTER_NOT )
+ {
+ f = (Slapi_Filter *)slapi_ch_malloc( sizeof(*f) );
+ f->f_choice = ftype;
+ f->f_list = f1;
+ f->f_next = f2;
+ }
+
+ return f;
+#else
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_filter_test( Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Filter *f,
+ int verify_access )
+{
+#ifdef LDAP_SLAPI
+ Backend *be = NULL;
+ Connection *conn;
+ Operation *op;
+ int rc;
+
+ if ( f == NULL ) {
+ /* spec says return zero if no filter. */
+ return 0;
+ }
+
+ if ( verify_access ) {
+ (void) slapi_pblock_get(pb, SLAPI_BACKEND, (void *)&be);
+ rc = slapi_pblock_get(pb, SLAPI_CONNECTION, (void *)&conn);
+ if ( rc != 0 ) {
+ return LDAP_PARAM_ERROR;
+ }
+ rc = slapi_pblock_get(pb, SLAPI_OPERATION, (void *)&op);
+ if ( rc != 0 ) {
+ return LDAP_PARAM_ERROR;
+ }
+ } else {
+ conn = NULL;
+ op = NULL;
+ }
+ /*
+ * According to acl.c it is safe to call test_filter() with
+ * NULL arguments...
+ */
+ rc = test_filter( op, e, f );
+ switch (rc) {
+ case LDAP_COMPARE_TRUE:
+ rc = 0;
+ break;
+ case LDAP_COMPARE_FALSE:
+ break;
+ case SLAPD_COMPARE_UNDEFINED:
+ rc = LDAP_OTHER;
+ break;
+ case LDAP_PROTOCOL_ERROR:
+ /* filter type unknown: spec says return -1 */
+ rc = -1;
+ break;
+ }
+
+ return rc;
+#else
+ return -1;
+#endif /* LDAP_SLAPI */
+}
+
+int
+slapi_filter_test_simple( Slapi_Entry *e, Slapi_Filter *f)
+{
+#ifdef LDAP_SLAPI
+ return slapi_filter_test( NULL, e, f, 0 );
+#else
+ return -1;
+#endif
+}
+
+int
+slapi_filter_apply( Slapi_Filter *f, FILTER_APPLY_FN fn, void *arg, int *error_code )
+{
+#ifdef LDAP_SLAPI
+ switch ( f->f_choice ) {
+ case LDAP_FILTER_AND:
+ case LDAP_FILTER_NOT:
+ case LDAP_FILTER_OR: {
+ int rc;
+
+ /*
+ * FIXME: altering f; should we use a temporary?
+ */
+ for ( f = f->f_list; f != NULL; f = f->f_next ) {
+ rc = slapi_filter_apply( f, fn, arg, error_code );
+ if ( rc != 0 ) {
+ return rc;
+ }
+ if ( *error_code == SLAPI_FILTER_SCAN_NOMORE ) {
+ break;
+ }
+ }
+ break;
+ }
+ case LDAP_FILTER_EQUALITY:
+ case LDAP_FILTER_SUBSTRINGS:
+ case LDAP_FILTER_GE:
+ case LDAP_FILTER_LE:
+ case LDAP_FILTER_PRESENT:
+ case LDAP_FILTER_APPROX:
+ case LDAP_FILTER_EXT:
+ *error_code = fn( f, arg );
+ break;
+ default:
+ *error_code = SLAPI_FILTER_UNKNOWN_FILTER_TYPE;
+ }
+
+ if ( *error_code == SLAPI_FILTER_SCAN_NOMORE ||
+ *error_code == SLAPI_FILTER_SCAN_CONTINUE ) {
+ return 0;
+ }
+
+ return -1;
+#else
+ *error_code = SLAPI_FILTER_UNKNOWN_FILTER_TYPE;
+ return -1;
+#endif /* LDAP_SLAPI */
}
int
char *respName,
struct berval *response )
{
-#if defined(LDAP_SLAPI)
- send_ldap_extended( conn,op, errornum, NULL, NULL, NULL,
- respName,response, NULL );
+#ifdef LDAP_SLAPI
+ SlapReply rs;
+
+ rs.sr_err = errornum;
+ rs.sr_matched = NULL;
+ rs.sr_text = NULL;
+ rs.sr_ref = NULL;
+ rs.sr_ctrls = NULL;
+ rs.sr_rspoid = respName;
+ rs.sr_rspdata = response;
+
+ send_ldap_extended( op, &rs );
+
return LDAP_SUCCESS;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return -1;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
int
struct berval **vals,
struct berval *v )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
/*
* FIXME: what's the point?
*/
return 1;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return 1;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
-
+
+#define MAX_HOSTNAME 512
+
char *
slapi_get_hostname( void )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
char *hn = NULL;
/*
#endif /* !_SPARC */
return hn;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return NULL;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
/*
char *fmt,
... )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
int rc = LDAP_SUCCESS;
va_list arglist;
va_end( arglist );
return rc;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return -1;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
unsigned long
slapi_timer_current_time( void )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
static int first_time = 1;
#if !defined (_WIN32)
struct timeval now;
QueryPerformanceCounter( &now );
return (1000000*(now.QuadPart-base_time.QuadPart))/performance_freq.QuadPart;
#endif /* _WIN32 */
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return 0;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
/*
unsigned long
slapi_timer_get_time( char *label )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
unsigned long start = slapi_timer_current_time();
printf("%10ld %10ld usec %s\n", start, 0, label);
return start;
-#else /* !defined(LDAP_SLAPI) */
+#else /* LDAP_SLAPI */
return 0;
-#endif /* !defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
/*
char *label,
unsigned long start )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
unsigned long stop = slapi_timer_current_time();
printf ("%10ld %10ld usec %s\n", stop, stop - start, label);
-#endif /* defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
void
slapi_free_search_results_internal( Slapi_PBlock *pb )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
Slapi_Entry **entries;
int k = 0, nEnt = 0;
}
slapi_ch_free( (void **)&entries );
-#endif /* defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
+#ifdef LDAP_SLAPI
/*
* Internal API to prime a Slapi_PBlock with a Backend.
*/
-int slapi_x_backend_set_pb( Slapi_PBlock *pb, Backend *be )
+static int initBackendPB( Slapi_PBlock *pb, Backend *be )
{
-#if defined(LDAP_SLAPI)
int rc;
rc = slapi_pblock_set( pb, SLAPI_BACKEND, (void *)be );
}
return LDAP_SUCCESS;
-#else
- return -1;
-#endif /* defined(LDAP_SLAPI) */
}
-#if defined(LDAP_SLAPI)
/*
* If oldStyle is TRUE, then a value suitable for setting to
* the deprecated SLAPI_CONN_AUTHTYPE value is returned
return authType;
}
-#endif
/*
* Internal API to prime a Slapi_PBlock with a Connection.
*/
-int slapi_x_connection_set_pb( Slapi_PBlock *pb, Connection *conn )
+static int initConnectionPB( Slapi_PBlock *pb, Connection *conn )
{
-#if defined(LDAP_SLAPI)
char *connAuthType;
int rc;
}
return rc;
-#else
- return -1;
-#endif /* defined(LDAP_SLAPI) */
}
+#endif /* LDAP_SLAPI */
/*
* Internal API to prime a Slapi_PBlock with an Operation.
*/
-int slapi_x_operation_set_pb( Slapi_PBlock *pb, Operation *op )
+int slapi_x_pblock_set_operation( Slapi_PBlock *pb, Operation *op )
{
-#if defined(LDAP_SLAPI)
+#ifdef LDAP_SLAPI
int isRoot = 0;
int isUpdateDn = 0;
int rc;
- Backend *be;
char *opAuthType;
- if ( slapi_pblock_get(pb, SLAPI_BACKEND, (void *)&be ) != 0 ) {
- be = NULL;
+ if ( op->o_bd != NULL ) {
+ isRoot = be_isroot( op->o_bd, &op->o_ndn );
+ isUpdateDn = be_isupdate( op->o_bd, &op->o_ndn );
}
- if (be != NULL) {
- isRoot = be_isroot( be, &op->o_ndn );
- isUpdateDn = be_isupdate( be, &op->o_ndn );
- }
-
+
+ rc = initBackendPB( pb, op->o_bd );
+ if ( rc != LDAP_SUCCESS )
+ return rc;
+
+ rc = initConnectionPB( pb, op->o_conn );
+ if ( rc != LDAP_SUCCESS )
+ return rc;
+
rc = slapi_pblock_set( pb, SLAPI_OPERATION, (void *)op );
if ( rc != LDAP_SUCCESS )
return rc;
int slapi_is_connection_ssl( Slapi_PBlock *pb, int *isSSL )
{
-#if defined( LDAP_SLAPI )
+#ifdef LDAP_SLAPI
Connection *conn;
slapi_pblock_get( pb, SLAPI_CONNECTION, &conn );
return LDAP_SUCCESS;
#else
return -1;
-#endif /* defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
/*
int slapi_attr_get_flags( const Slapi_Attr *attr, unsigned long *flags )
{
-#if defined( LDAP_SLAPI )
+#ifdef LDAP_SLAPI
AttributeType *at;
if ( attr == NULL )
return LDAP_SUCCESS;
#else
return -1;
-#endif /* defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
int slapi_attr_flag_is_set( const Slapi_Attr *attr, unsigned long flag )
{
-#if defined( LDAP_SLAPI )
+#ifdef LDAP_SLAPI
unsigned long flags;
if ( slapi_attr_get_flags( attr, &flags ) != 0 )
return (flags & flag) ? 1 : 0;
#else
return 0;
-#endif /* defined(LDAP_SLAPI) */
+#endif /* LDAP_SLAPI */
}
Slapi_Attr *slapi_attr_new( void )
a->a_desc = ad;
a->a_vals = NULL;
+#ifdef SLAP_NVALUES
+ a->a_nvals = NULL;
+#endif
a->a_next = NULL;
a->a_flags = 0;
int slapi_attr_add_value( Slapi_Attr *a, const Slapi_Value *v )
{
#ifdef LDAP_SLAPI
+#ifdef SLAP_NVALUES
+ /*
+ * FIXME: here we may lose alignment between a_vals/a_nvals
+ */
+#endif
return value_add_one( &a->a_vals, (Slapi_Value *)v );
#else
return -1;
const char *text;
mr = a->a_desc->ad_type->sat_equality;
+#ifdef SLAP_NVALUES
+ rc = value_match( &ret, a->a_desc, mr,
+ SLAP_MR_VALUE_OF_ASSERTION_SYNTAX,
+ (struct berval *)v1, (void *)v2, &text );
+#else
rc = value_match( &ret, a->a_desc, mr, SLAP_MR_ASSERTION_SYNTAX_MATCH,
(struct berval *)v1, (void *)v2, &text );
+#endif
if ( rc != LDAP_SUCCESS )
return -1;
mr = a->a_desc->ad_type->sat_equality;
for ( bv = a->a_vals, j = 0; bv->bv_val != NULL; bv++, j++ ) {
+#ifdef SLAP_NVALUES
+ rc = value_match( &ret, a->a_desc, mr,
+ SLAP_MR_VALUE_OF_ASSERTION_SYNTAX, bv, v, &text );
+#else
rc = value_match( &ret, a->a_desc, mr,
SLAP_MR_ASSERTION_SYNTAX_MATCH, bv, v, &text );
+#endif
if ( rc != LDAP_SUCCESS ) {
return -1;
}
int slapi_acl_check_mods(Slapi_PBlock *pb, Slapi_Entry *e, LDAPMod **mods, char **errbuf)
{
#ifdef LDAP_SLAPI
- Backend *be;
- Connection *conn;
Operation *op;
int ret;
Modifications *ml;
Modifications *next;
- if ( slapi_pblock_get( pb, SLAPI_BACKEND, (void *)&be ) != 0 ) {
- return LDAP_PARAM_ERROR;
- }
-
- if ( slapi_pblock_get( pb, SLAPI_CONNECTION, (void *)&conn ) != 0 ) {
- return LDAP_PARAM_ERROR;
- }
-
if ( slapi_pblock_get( pb, SLAPI_OPERATION, (void *)&op ) != 0 ) {
return LDAP_PARAM_ERROR;
}
return LDAP_OTHER;
}
- ret = acl_check_modlist( be, conn, op, e, ml );
+ ret = acl_check_modlist( op, e, ml );
/* Careful when freeing the modlist because it has pointers into the mods array. */
for ( ; ml != NULL; ml = next ) {
mods = (LDAPMod **)ch_malloc( (i + 1) * sizeof(LDAPMod *) );
for( i = 0, ml = modlist; ml != NULL; ml = ml->sml_next ) {
+ mods[i] = (LDAPMod *)ch_malloc( sizeof(LDAPMod) );
modp = mods[i];
modp->mod_op = ml->sml_op | LDAP_MOD_BVALUES;
Modifications *slapi_x_ldapmods2modifications (LDAPMod **mods)
{
#ifdef LDAP_SLAPI
- Modifications *modlist, **modtail;
+ Modifications *modlist = NULL, **modtail;
LDAPMod **modp;
modtail = &modlist;
mod->sml_next = NULL;
if ( (*modp)->mod_op & LDAP_MOD_BVALUES ) {
- for( i = 0, bvp = (*modp)->mod_bvalues; *bvp != NULL; bvp++, i++ )
+ for( i = 0, bvp = (*modp)->mod_bvalues; bvp != NULL && *bvp != NULL; bvp++, i++ )
;
} else {
- for( i = 0, p = (*modp)->mod_values; *p != NULL; p++, i++ )
+ for( i = 0, p = (*modp)->mod_values; p != NULL && *p != NULL; p++, i++ )
;
}
- mod->sml_bvalues = (BerVarray) ch_malloc( (i + 1) * sizeof(struct berval) );
-
- /* NB: This implicitly trusts a plugin to return valid modifications. */
- if ( (*modp)->mod_op & LDAP_MOD_BVALUES ) {
- for( i = 0, bvp = (*modp)->mod_bvalues; *bvp != NULL; bvp++, i++ ) {
- mod->sml_bvalues[i].bv_val = (*bvp)->bv_val;
- mod->sml_bvalues[i].bv_len = (*bvp)->bv_len;
- }
+ if ( i == 0 ) {
+ mod->sml_bvalues = NULL;
} else {
- for( i = 0, p = (*modp)->mod_values; *p != NULL; p++, i++ ) {
- mod->sml_bvalues[i].bv_val = *p;
- mod->sml_bvalues[i].bv_len = strlen( *p );
+ mod->sml_bvalues = (BerVarray) ch_malloc( (i + 1) * sizeof(struct berval) );
+
+ /* NB: This implicitly trusts a plugin to return valid modifications. */
+ if ( (*modp)->mod_op & LDAP_MOD_BVALUES ) {
+ for( i = 0, bvp = (*modp)->mod_bvalues; bvp != NULL && *bvp != NULL; bvp++, i++ ) {
+ mod->sml_bvalues[i].bv_val = (*bvp)->bv_val;
+ mod->sml_bvalues[i].bv_len = (*bvp)->bv_len;
+ }
+ } else {
+ for( i = 0, p = (*modp)->mod_values; p != NULL && *p != NULL; p++, i++ ) {
+ mod->sml_bvalues[i].bv_val = *p;
+ mod->sml_bvalues[i].bv_len = strlen( *p );
+ }
}
+ mod->sml_bvalues[i].bv_val = NULL;
}
- mod->sml_bvalues[i].bv_val = NULL;
+#ifdef SLAP_NVALUES
+ mod->sml_nvalues = NULL;
+#endif
*modtail = mod;
modtail = &mod->sml_next;
* Modification list. Do free the containing array.
*/
if ( mods[i]->mod_op & LDAP_MOD_BVALUES ) {
- for ( j = 0; mods[i]->mod_bvalues[j] != NULL; j++ ) {
+ for ( j = 0; mods[i]->mod_bvalues != NULL && mods[i]->mod_bvalues[j] != NULL; j++ ) {
ch_free( mods[i]->mod_bvalues[j] );
}
ch_free( mods[i]->mod_bvalues );
int slapi_x_compute_output_ber(computed_attr_context *c, Slapi_Attr *a, Slapi_Entry *e)
{
#ifdef LDAP_SLAPI
- Backend *be = NULL;
- Connection *conn = NULL;
Operation *op = NULL;
BerElement *ber;
- AttributeDescription *desc;
+ AttributeDescription *desc = NULL;
int rc;
int i;
return 1;
}
- rc = slapi_pblock_get( c->cac_pb, SLAPI_BACKEND, (void *)&be );
- if ( rc != 0 ) {
- be = NULL; /* no backend for root DSE */
- }
-
- rc = slapi_pblock_get( c->cac_pb, SLAPI_CONNECTION, (void *)&conn );
- if ( rc != 0 || conn == NULL ) {
- return rc;
- }
-
rc = slapi_pblock_get( c->cac_pb, SLAPI_OPERATION, (void *)&op );
if ( rc != 0 || op == NULL ) {
return rc;
}
}
- if ( !access_allowed( be, conn, op, e, desc, NULL, ACL_READ, &c->cac_acl_state) ) {
+ if ( !access_allowed( op, e, desc, NULL, ACL_READ, &c->cac_acl_state) ) {
slapi_log_error( SLAPI_LOG_ACL, "SLAPI_COMPUTE",
"acl: access to attribute %s not allowed\n",
desc->ad_cname.bv_val );
if ( !c->cac_attrsonly ) {
for ( i = 0; a->a_vals[i].bv_val != NULL; i++ ) {
- if ( !access_allowed( be, conn, op, e,
+ if ( !access_allowed( op, e,
desc, &a->a_vals[i], ACL_READ, &c->cac_acl_state)) {
slapi_log_error( SLAPI_LOG_ACL, "SLAPI_COMPUTE",
"slapi_x_compute_output_ber: conn %lu "