mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-15 03:01:09 +08:00
e2a15115b0
Update slap_op to maintain dn and ndn (derived from conn->c_dn). Update ldbm_back_bind to return actual bound dn (including rootdn) for use in slapd_conn. Other backends use client dn. Modify other codes to use ndn (normalized uppercase dn) most everywhere. Aliasing, Suffixing and modrdn could use more work. Applied suffixing to compare and modrdn.
82 lines
1.6 KiB
C
82 lines
1.6 KiB
C
/* operation.c - routines to deal with pending ldap operations */
|
|
|
|
#include "portable.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <ac/string.h>
|
|
#include <ac/socket.h>
|
|
|
|
#include "slap.h"
|
|
|
|
|
|
void
|
|
slap_op_free( Operation *op )
|
|
{
|
|
if ( op->o_ber != NULL )
|
|
ber_free( op->o_ber, 1 );
|
|
if ( op->o_dn != NULL ) {
|
|
free( op->o_dn );
|
|
}
|
|
if ( op->o_ndn != NULL ) {
|
|
free( op->o_ndn );
|
|
}
|
|
/* pthread_mutex_destroy( &op->o_abandonmutex ); */
|
|
free( (char *) op );
|
|
}
|
|
|
|
Operation *
|
|
slap_op_add(
|
|
Operation **olist,
|
|
BerElement *ber,
|
|
unsigned long msgid,
|
|
unsigned long tag,
|
|
char *dn,
|
|
int id,
|
|
int connid
|
|
)
|
|
{
|
|
Operation **tmp;
|
|
|
|
for ( tmp = olist; *tmp != NULL; tmp = &(*tmp)->o_next )
|
|
; /* NULL */
|
|
|
|
*tmp = (Operation *) calloc( 1, sizeof(Operation) );
|
|
pthread_mutex_init( &(*tmp)->o_abandonmutex,
|
|
pthread_mutexattr_default );
|
|
(*tmp)->o_ber = ber;
|
|
(*tmp)->o_msgid = msgid;
|
|
(*tmp)->o_tag = tag;
|
|
(*tmp)->o_abandon = 0;
|
|
|
|
(*tmp)->o_dn = ch_strdup( dn != NULL ? dn : "" );
|
|
(*tmp)->o_ndn = dn_normalize_case( ch_strdup( (*tmp)->o_dn ) );
|
|
|
|
pthread_mutex_lock( ¤ttime_mutex );
|
|
(*tmp)->o_time = currenttime;
|
|
pthread_mutex_unlock( ¤ttime_mutex );
|
|
(*tmp)->o_opid = id;
|
|
(*tmp)->o_connid = connid;
|
|
(*tmp)->o_next = NULL;
|
|
|
|
return( *tmp );
|
|
}
|
|
|
|
void
|
|
slap_op_delete( Operation **olist, Operation *op )
|
|
{
|
|
Operation **tmp;
|
|
|
|
for ( tmp = olist; *tmp != NULL && *tmp != op; tmp = &(*tmp)->o_next )
|
|
; /* NULL */
|
|
|
|
if ( *tmp == NULL ) {
|
|
Debug( LDAP_DEBUG_ANY, "op_delete: can't find op %ld\n",
|
|
op->o_msgid, 0, 0 );
|
|
return;
|
|
}
|
|
|
|
*tmp = (*tmp)->o_next;
|
|
slap_op_free( op );
|
|
}
|