mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-06 10:46:21 +08:00
74fa239a20
- librewrite, for string rewriting; it may be used in back-ldap by configuring with '--enable-rewrite'. It must be used in back-meta. There's a text file, 'libraries/librewrite/RATIONALE', that explains the usage and the features. More comprehensive documentation will follow. - enhancements of back-ldap (ITS#989,ITS#998,ITS#1002,ITS#1054 and ITS#1137) including dn rewriting, a fix to group acl matching and so - back-meta: a new backend that proxies a set of remote servers by spawning queries. It uses portions of back-ldap and the rewrite capabilities of librewrite. It can be compiled by configuring with `--enable-ldap --enable-rewrite --enable-meta'. There's a text file, 'servers/slapd/back-meta/Documentation', that describes the main features and config statements. Note: someone (Kurt?) should run 'autoconf' and commit 'configure' as my autoconf version must be different: my configures contain a number of differences and I didn't feel comfortable in adding them :)
200 lines
3.8 KiB
C
200 lines
3.8 KiB
C
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2000 Pierangelo Masarati, <ando@sys-net.it>
|
|
* All rights reserved.
|
|
*
|
|
* Permission is granted to anyone to use this software for any purpose
|
|
* on any computer system, and to alter it and redistribute it, subject
|
|
* to the following restrictions:
|
|
*
|
|
* 1. The author is not responsible for the consequences of use of this
|
|
* software, no matter how awful, even if they arise from flaws in it.
|
|
*
|
|
* 2. The origin of this software must not be misrepresented, either by
|
|
* explicit claim or by omission. Since few users ever read sources,
|
|
* credits should appear in the documentation.
|
|
*
|
|
* 3. Altered versions must be plainly marked as such, and must not be
|
|
* misrepresented as being the original software. Since few users
|
|
* ever read sources, credits should appear in the documentation.
|
|
*
|
|
* 4. This notice may not be removed or altered.
|
|
*
|
|
******************************************************************************/
|
|
|
|
#include <portable.h>
|
|
|
|
#include "rewrite-int.h"
|
|
|
|
/*
|
|
* Compares two vars
|
|
*/
|
|
static int
|
|
rewrite_var_cmp(
|
|
const void *c1,
|
|
const void *c2
|
|
)
|
|
{
|
|
const struct rewrite_var *v1, *v2;
|
|
|
|
v1 = ( struct rewrite_var * )c1;
|
|
v2 = ( struct rewrite_var * )c2;
|
|
|
|
assert( v1 != NULL );
|
|
assert( v2 != NULL );
|
|
assert( v1->lv_name != NULL );
|
|
assert( v2->lv_name != NULL );
|
|
|
|
return strcasecmp( v1->lv_name, v2->lv_name );
|
|
}
|
|
|
|
/*
|
|
* Duplicate var ?
|
|
*/
|
|
static int
|
|
rewrite_var_dup(
|
|
void *c1,
|
|
void *c2
|
|
)
|
|
{
|
|
struct rewrite_var *v1, *v2;
|
|
|
|
v1 = ( struct rewrite_var * )c1;
|
|
v2 = ( struct rewrite_var * )c2;
|
|
|
|
assert( v1 != NULL );
|
|
assert( v2 != NULL );
|
|
assert( v1->lv_name != NULL );
|
|
assert( v2->lv_name != NULL );
|
|
|
|
return ( strcasecmp( v1->lv_name, v2->lv_name ) == 0 ? -1 : 0 );
|
|
}
|
|
|
|
/*
|
|
* Finds a var
|
|
*/
|
|
struct rewrite_var *
|
|
rewrite_var_find(
|
|
Avlnode *tree,
|
|
const char *name
|
|
)
|
|
{
|
|
struct rewrite_var var;
|
|
|
|
assert( name != NULL );
|
|
|
|
var.lv_name = ( char * )name;
|
|
return ( struct rewrite_var * )avl_find( tree,
|
|
( caddr_t )&var, rewrite_var_cmp );
|
|
}
|
|
|
|
/*
|
|
* Inserts a newly created var
|
|
*/
|
|
struct rewrite_var *
|
|
rewrite_var_insert(
|
|
Avlnode **tree,
|
|
const char *name,
|
|
const char *value
|
|
)
|
|
{
|
|
struct rewrite_var *var;
|
|
int rc;
|
|
|
|
assert( tree != NULL );
|
|
assert( name != NULL );
|
|
assert( value != NULL );
|
|
|
|
var = calloc( sizeof( struct rewrite_var ), 1 );
|
|
if ( var == NULL ) {
|
|
return NULL;
|
|
}
|
|
var->lv_name = ( char * )strdup( name );
|
|
if ( var->lv_name == NULL ) {
|
|
free( var );
|
|
return NULL;
|
|
}
|
|
var->lv_value.bv_val = strdup( value );
|
|
if ( var->lv_value.bv_val == NULL ) {
|
|
free( var );
|
|
free( var->lv_name );
|
|
return NULL;
|
|
}
|
|
var->lv_value.bv_len = strlen( value );
|
|
rc = avl_insert( tree, ( caddr_t )var,
|
|
rewrite_var_cmp, rewrite_var_dup );
|
|
if ( rc != 0 ) {
|
|
free( var );
|
|
free( var->lv_name );
|
|
free( var->lv_value.bv_val );
|
|
return NULL;
|
|
}
|
|
|
|
return var;
|
|
}
|
|
|
|
/*
|
|
* Sets/inserts a var
|
|
*/
|
|
struct rewrite_var *
|
|
rewrite_var_set(
|
|
Avlnode **tree,
|
|
const char *name,
|
|
const char *value,
|
|
int insert
|
|
)
|
|
{
|
|
struct rewrite_var *var;
|
|
|
|
assert( tree != NULL );
|
|
assert( name != NULL );
|
|
assert( value != NULL );
|
|
|
|
var = rewrite_var_find( *tree, name );
|
|
if ( var == NULL ) {
|
|
if ( insert ) {
|
|
return rewrite_var_insert( tree, name, value );
|
|
} else {
|
|
return NULL;
|
|
}
|
|
} else {
|
|
assert( var->lv_value.bv_val != NULL );
|
|
|
|
free( var->lv_value.bv_val );
|
|
var->lv_value.bv_val = ( char * )value;
|
|
var->lv_value.bv_len = strlen( value );
|
|
}
|
|
|
|
return var;
|
|
}
|
|
|
|
/*
|
|
* Frees a var
|
|
*/
|
|
static void
|
|
rewrite_var_free(
|
|
struct rewrite_var *var
|
|
)
|
|
{
|
|
assert( var != NULL );
|
|
|
|
assert( var->lv_name != NULL );
|
|
assert( var->lv_value.bv_val != NULL );
|
|
|
|
free( var->lv_name );
|
|
free( var->lv_value.bv_val );
|
|
}
|
|
|
|
/*
|
|
* Deletes a var tree
|
|
*/
|
|
int
|
|
rewrite_var_delete(
|
|
Avlnode *tree
|
|
)
|
|
{
|
|
avl_free( tree, ( AVL_FREE )rewrite_var_free );
|
|
return REWRITE_SUCCESS;
|
|
}
|
|
|