Home | History | Annotate | Line # | Download | only in librewrite
params.c revision 1.1.1.1.6.2
      1 /* $OpenLDAP: pkg/ldap/libraries/librewrite/params.c,v 1.9.2.3 2008/02/11 23:26:42 kurt Exp $ */
      2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
      3  *
      4  * Copyright 2000-2008 The OpenLDAP Foundation.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted only as authorized by the OpenLDAP
      9  * Public License.
     10  *
     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>.
     14  */
     15 /* ACKNOWLEDGEMENT:
     16  * This work was initially developed by Pierangelo Masarati for
     17  * inclusion in OpenLDAP Software.
     18  */
     19 
     20 #include <portable.h>
     21 
     22 #include "rewrite-int.h"
     23 
     24 /*
     25  * Defines and inits a variable with global scope
     26  */
     27 int
     28 rewrite_param_set(
     29 		struct rewrite_info *info,
     30 		const char *name,
     31 		const char *value
     32 )
     33 {
     34 	struct rewrite_var *var;
     35 
     36 	assert( info != NULL );
     37 	assert( name != NULL );
     38 	assert( value != NULL );
     39 
     40 #ifdef USE_REWRITE_LDAP_PVT_THREADS
     41 	ldap_pvt_thread_rdwr_wlock( &info->li_params_mutex );
     42 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
     43 
     44 	var = rewrite_var_find( info->li_params, name );
     45 	if ( var != NULL ) {
     46 		assert( var->lv_value.bv_val != NULL );
     47 		free( var->lv_value.bv_val );
     48 		var->lv_value.bv_val = strdup( value );
     49 		var->lv_value.bv_len = strlen( value );
     50 	} else {
     51 		var = rewrite_var_insert( &info->li_params, name, value );
     52 		if ( var == NULL ) {
     53 #ifdef USE_REWRITE_LDAP_PVT_THREADS
     54 			ldap_pvt_thread_rdwr_wunlock( &info->li_params_mutex );
     55 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
     56 			return REWRITE_ERR;
     57 		}
     58 	}
     59 
     60 #ifdef USE_REWRITE_LDAP_PVT_THREADS
     61 	ldap_pvt_thread_rdwr_wunlock( &info->li_params_mutex );
     62 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
     63 
     64 	return REWRITE_SUCCESS;
     65 }
     66 
     67 /*
     68  * Gets a var with global scope
     69  */
     70 int
     71 rewrite_param_get(
     72 		struct rewrite_info *info,
     73 		const char *name,
     74 		struct berval *value
     75 )
     76 {
     77 	struct rewrite_var *var;
     78 
     79 	assert( info != NULL );
     80 	assert( name != NULL );
     81 	assert( value != NULL );
     82 
     83 	value->bv_val = NULL;
     84 	value->bv_len = 0;
     85 
     86 #ifdef USE_REWRITE_LDAP_PVT_THREADS
     87 	ldap_pvt_thread_rdwr_rlock( &info->li_params_mutex );
     88 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
     89 
     90 	var = rewrite_var_find( info->li_params, name );
     91 	if ( var == NULL ) {
     92 
     93 #ifdef USE_REWRITE_LDAP_PVT_THREADS
     94 		ldap_pvt_thread_rdwr_runlock( &info->li_params_mutex );
     95 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
     96 
     97 		return REWRITE_ERR;
     98 	} else {
     99 		value->bv_val = strdup( var->lv_value.bv_val );
    100 		value->bv_len = var->lv_value.bv_len;
    101 	}
    102 
    103 #ifdef USE_REWRITE_LDAP_PVT_THREADS
    104         ldap_pvt_thread_rdwr_runlock( &info->li_params_mutex );
    105 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
    106 
    107 	return REWRITE_SUCCESS;
    108 }
    109 
    110 static void
    111 rewrite_param_free(
    112 		void *tmp
    113 )
    114 {
    115 	struct rewrite_var *var = ( struct rewrite_var * )tmp;
    116 	assert( var != NULL );
    117 
    118 	assert( var->lv_name != NULL );
    119 	assert( var->lv_value.bv_val != NULL );
    120 
    121 	free( var->lv_name );
    122 	free( var->lv_value.bv_val );
    123 	free( var );
    124 }
    125 
    126 /*
    127  * Destroys the parameter tree
    128  */
    129 int
    130 rewrite_param_destroy(
    131 		struct rewrite_info *info
    132 )
    133 {
    134 	int count;
    135 
    136 	assert( info != NULL );
    137 
    138 #ifdef USE_REWRITE_LDAP_PVT_THREADS
    139 	ldap_pvt_thread_rdwr_wlock( &info->li_params_mutex );
    140 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
    141 
    142 	count = avl_free( info->li_params, rewrite_param_free );
    143 	info->li_params = NULL;
    144 
    145 #ifdef USE_REWRITE_LDAP_PVT_THREADS
    146 	ldap_pvt_thread_rdwr_wunlock( &info->li_params_mutex );
    147 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
    148 
    149 	return REWRITE_SUCCESS;
    150 }
    151 
    152