/* add.c - ldap backend add function */
/* $OpenLDAP$ */
/*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
/* This is an altered version */
LDAPMod **attrs;
struct berval mapped;
struct berval mdn = { 0, NULL };
+ ber_int_t msgid;
#ifdef NEW_LOGGING
- LDAP_LOG(( "backend", LDAP_LEVEL_ENTRY, "ldap_back_add: %s\n",
- e->e_dn ));
+ LDAP_LOG( BACK_LDAP, ENTRY, "ldap_back_add: %s\n", e->e_dn, 0, 0 );
#else /* !NEW_LOGGING */
Debug(LDAP_DEBUG_ARGS, "==> ldap_back_add: %s\n", e->e_dn, 0, 0);
#endif /* !NEW_LOGGING */
lc = ldap_back_getconn(li, conn, op);
- if ( !lc || !ldap_back_dobind( lc, op ) ) {
+ if ( !lc || !ldap_back_dobind( li, lc, conn, op ) ) {
return( -1 );
}
* Rewrite the add dn, if needed
*/
#ifdef ENABLE_REWRITE
- switch (rewrite_session( li->rwinfo, "addDn", e->e_dn, conn, &mdn.bv_val )) {
+ switch (rewrite_session( li->rwinfo, "addDn", e->e_dn, conn,
+ &mdn.bv_val )) {
case REWRITE_REGEXEC_OK:
if ( mdn.bv_val != NULL && mdn.bv_val[ 0 ] != '\0' ) {
mdn.bv_len = strlen( mdn.bv_val );
mdn = e->e_name;
}
#ifdef NEW_LOGGING
- LDAP_LOG(( "backend", LDAP_LEVEL_DETAIL1,
- "[rw] addDn: \"%s\" -> \"%s\"\n",
- e->e_dn, mdn.bv_val ));
+ LDAP_LOG( BACK_LDAP, DETAIL1,
+ "[rw] addDn: \"%s\" -> \"%s\"\n", e->e_dn, mdn.bv_val, 0 );
#else /* !NEW_LOGGING */
Debug( LDAP_DEBUG_ARGS, "rw> addDn: \"%s\" -> \"%s\"\n%s",
e->e_dn, mdn.bv_val, "" );
case REWRITE_REGEXEC_UNWILLING:
send_ldap_result( conn, op, LDAP_UNWILLING_TO_PERFORM,
- NULL, "Unwilling to perform", NULL, NULL );
+ NULL, "Operation not allowed", NULL, NULL );
return( -1 );
case REWRITE_REGEXEC_ERR:
- send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
- NULL, "Operations error", NULL, NULL );
+ send_ldap_result( conn, op, LDAP_OTHER,
+ NULL, "Rewrite error", NULL, NULL );
return( -1 );
}
#else /* !ENABLE_REWRITE */
}
#endif
- ldap_back_map(&li->at_map, &a->a_desc->ad_cname, &mapped, 0);
- if (mapped.bv_val == NULL) {
+ if ( a->a_desc->ad_type->sat_no_user_mod ) {
+ continue;
+ }
+
+ ldap_back_map(&li->at_map, &a->a_desc->ad_cname, &mapped,
+ BACKLDAP_MAP);
+ if (mapped.bv_val == NULL || mapped.bv_val[0] == '\0') {
continue;
}
#ifdef ENABLE_REWRITE
/*
* FIXME: dn-valued attrs should be rewritten
- * to allow their use in ACLs at the back-ldap
- * level.
+ * to allow their use in ACLs at back-ldap level.
*/
if ( strcmp( a->a_desc->ad_type->sat_syntax->ssyn_oid,
SLAPD_DN_SYNTAX ) == 0 ) {
- ldap_dnattr_rewrite( li->rwinfo, a->a_vals, conn );
+ /*
+ * FIXME: rewrite could fail; in this case
+ * the operation should give up, right?
+ */
+ (void)ldap_dnattr_rewrite( li->rwinfo, a->a_vals, conn );
}
#endif /* ENABLE_REWRITE */
attrs[i]->mod_vals.modv_bvals = ch_malloc((j+1)*sizeof(struct berval *));
for (j=0; a->a_vals[j].bv_val; j++)
attrs[i]->mod_vals.modv_bvals[j] = &a->a_vals[j];
+ attrs[i]->mod_vals.modv_bvals[j] = NULL;
i++;
}
attrs[i] = NULL;
- ldap_add_s(lc->ld, mdn.bv_val, attrs);
+ j = ldap_add_ext(lc->ld, mdn.bv_val, attrs, op->o_ctrls, NULL, &msgid);
for (--i; i>= 0; --i) {
- free(attrs[i]->mod_vals.modv_bvals);
- free(attrs[i]);
+ ch_free(attrs[i]->mod_vals.modv_bvals);
+ ch_free(attrs[i]);
}
- free(attrs);
+ ch_free(attrs);
if ( mdn.bv_val != e->e_dn ) {
free( mdn.bv_val );
}
- return( ldap_back_op_result( lc, op ) );
+ return( ldap_back_op_result( li, lc, conn, op, msgid, j, 1 ) );
}
#ifdef ENABLE_REWRITE
int
ldap_dnattr_rewrite(
struct rewrite_info *rwinfo,
- struct berval **a_vals,
+ BerVarray a_vals,
void *cookie
)
{
- int j;
char *mattr;
- for ( j = 0; a_vals[ j ] != NULL; j++ ) {
- switch ( rewrite_session( rwinfo, "bindDn", a_vals[ j ]->bv_val,
+ for ( ; a_vals->bv_val != NULL; a_vals++ ) {
+ switch ( rewrite_session( rwinfo, "bindDn", a_vals->bv_val,
cookie, &mattr )) {
case REWRITE_REGEXEC_OK:
if ( mattr == NULL ) {
continue;
}
#ifdef NEW_LOGGING
- LDAP_LOG(( "backend", LDAP_LEVEL_DETAIL1,
- "[rw] bindDn (in add of dn-valued"
- " attr): \"%s\" -> \"%s\"\n",
- a_vals[ j ]->bv_val, mattr ));
+ LDAP_LOG( BACK_LDAP, DETAIL1,
+ "[rw] bindDn (in add of dn-valued"
+ " attr): \"%s\" -> \"%s\"\n", a_vals->bv_val, mattr, 0 );
#else /* !NEW_LOGGING */
Debug( LDAP_DEBUG_ARGS,
"rw> bindDn (in add of dn-valued attr):"
" \"%s\" -> \"%s\"\n%s",
- a_vals[ j ]->bv_val, mattr, "" );
+ a_vals->bv_val, mattr, "" );
#endif /* !NEW_LOGGING */
- free( a_vals[ j ]->bv_val );
- a_vals[ j ]->bv_val = mattr;
- a_vals[ j ]->bv_len = strlen( mattr );
+ /*
+ * FIXME: replacing server-allocated memory
+ * (ch_malloc) with librewrite allocated memory
+ * (malloc)
+ */
+ ch_free( a_vals->bv_val );
+ a_vals->bv_val = mattr;
+ a_vals->bv_len = strlen( mattr );
break;