2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4 * Copyright 2000-2014 The OpenLDAP Foundation.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted only as authorized by the OpenLDAP
11 * A copy of this license is available in the file LICENSE in the
12 * top-level directory of the distribution or, alternatively, at
13 * <http://www.OpenLDAP.org/license.html>.
16 * This work was initially developed by Pierangelo Masarati for
17 * inclusion in OpenLDAP Software.
22 #include "rewrite-int.h"
33 const struct rewrite_var *v1, *v2;
35 v1 = ( const struct rewrite_var * )c1;
36 v2 = ( const struct rewrite_var * )c2;
40 assert( v1->lv_name != NULL );
41 assert( v2->lv_name != NULL );
43 return strcasecmp( v1->lv_name, v2->lv_name );
55 struct rewrite_var *v1, *v2;
57 v1 = ( struct rewrite_var * )c1;
58 v2 = ( struct rewrite_var * )c2;
62 assert( v1->lv_name != NULL );
63 assert( v2->lv_name != NULL );
65 return ( strcasecmp( v1->lv_name, v2->lv_name ) == 0 ? -1 : 0 );
76 struct rewrite_var *var = v_var;
77 assert( var != NULL );
79 assert( var->lv_name != NULL );
80 assert( var->lv_value.bv_val != NULL );
82 if ( var->lv_flags & REWRITE_VAR_COPY_NAME )
84 if ( var->lv_flags & REWRITE_VAR_COPY_VALUE )
85 free( var->lv_value.bv_val );
97 avl_free( tree, rewrite_var_free );
98 return REWRITE_SUCCESS;
110 struct rewrite_var var;
112 assert( name != NULL );
114 var.lv_name = ( char * )name;
115 return ( struct rewrite_var * )avl_find( tree,
116 ( caddr_t )&var, rewrite_var_cmp );
121 struct rewrite_var *var,
128 assert( value != NULL );
130 len = strlen( value );
132 if ( var->lv_flags & REWRITE_VAR_COPY_VALUE ) {
133 if ( flags & REWRITE_VAR_COPY_VALUE ) {
134 if ( len <= var->lv_value.bv_len ) {
135 AC_MEMCPY(var->lv_value.bv_val, value, len + 1);
138 free( var->lv_value.bv_val );
139 var->lv_value.bv_val = strdup( value );
143 free( var->lv_value.bv_val );
144 var->lv_value.bv_val = (char *)value;
145 var->lv_flags &= ~REWRITE_VAR_COPY_VALUE;
149 if ( flags & REWRITE_VAR_COPY_VALUE ) {
150 var->lv_value.bv_val = strdup( value );
151 var->lv_flags |= REWRITE_VAR_COPY_VALUE;
154 var->lv_value.bv_val = (char *)value;
158 if ( var->lv_value.bv_val == NULL ) {
162 var->lv_value.bv_len = len;
168 * Inserts a newly created var
171 rewrite_var_insert_f(
178 struct rewrite_var *var;
181 assert( tree != NULL );
182 assert( name != NULL );
183 assert( value != NULL );
185 var = rewrite_var_find( *tree, name );
187 if ( flags & REWRITE_VAR_UPDATE ) {
188 (void)rewrite_var_replace( var, value, flags );
195 var = calloc( sizeof( struct rewrite_var ), 1 );
200 memset( var, 0, sizeof( struct rewrite_var ) );
202 if ( flags & REWRITE_VAR_COPY_NAME ) {
203 var->lv_name = strdup( name );
204 if ( var->lv_name == NULL ) {
208 var->lv_flags |= REWRITE_VAR_COPY_NAME;
211 var->lv_name = (char *)name;
214 if ( flags & REWRITE_VAR_COPY_VALUE ) {
215 var->lv_value.bv_val = strdup( value );
216 if ( var->lv_value.bv_val == NULL ) {
220 var->lv_flags |= REWRITE_VAR_COPY_VALUE;
223 var->lv_value.bv_val = (char *)value;
225 var->lv_value.bv_len = strlen( value );
226 rc = avl_insert( tree, ( caddr_t )var,
227 rewrite_var_cmp, rewrite_var_dup );
230 if ( rc != 0 && var ) {
231 avl_delete( tree, ( caddr_t )var, rewrite_var_cmp );
232 rewrite_var_free( var );
250 struct rewrite_var *var;
252 assert( tree != NULL );
253 assert( name != NULL );
254 assert( value != NULL );
256 var = rewrite_var_find( *tree, name );
258 if ( flags & REWRITE_VAR_INSERT ) {
259 return rewrite_var_insert_f( tree, name, value, flags );
266 assert( var->lv_value.bv_val != NULL );
268 (void)rewrite_var_replace( var, value, flags );