1/* $OpenLDAP$ */ 2/* This work is part of OpenLDAP Software <http://www.openldap.org/>. 3 * 4 * Copyright 2000-2011 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 */ 27int 28rewrite_param_set( 29 struct rewrite_info *info, 30 const char *name, 31 const char *value 32) 33{ 34 struct rewrite_var *var; 35 int rc = REWRITE_SUCCESS; 36 37 assert( info != NULL ); 38 assert( name != NULL ); 39 assert( value != NULL ); 40 41#ifdef USE_REWRITE_LDAP_PVT_THREADS 42 ldap_pvt_thread_rdwr_wlock( &info->li_params_mutex ); 43#endif /* USE_REWRITE_LDAP_PVT_THREADS */ 44 45 var = rewrite_var_find( info->li_params, name ); 46 if ( var != NULL ) { 47 assert( var->lv_value.bv_val != NULL ); 48 free( var->lv_value.bv_val ); 49 var->lv_value.bv_val = strdup( value ); 50 var->lv_value.bv_len = strlen( value ); 51 52 } else { 53 var = rewrite_var_insert( &info->li_params, name, value ); 54 } 55 56 if ( var == NULL || var->lv_value.bv_val == NULL ) { 57 rc = REWRITE_ERR; 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 rc; 65} 66 67/* 68 * Gets a var with global scope 69 */ 70int 71rewrite_param_get( 72 struct rewrite_info *info, 73 const char *name, 74 struct berval *value 75) 76{ 77 struct rewrite_var *var; 78 int rc = REWRITE_SUCCESS; 79 80 assert( info != NULL ); 81 assert( name != NULL ); 82 assert( value != NULL ); 83 84 value->bv_val = NULL; 85 value->bv_len = 0; 86 87#ifdef USE_REWRITE_LDAP_PVT_THREADS 88 ldap_pvt_thread_rdwr_rlock( &info->li_params_mutex ); 89#endif /* USE_REWRITE_LDAP_PVT_THREADS */ 90 91 var = rewrite_var_find( info->li_params, name ); 92 if ( var != NULL ) { 93 value->bv_val = strdup( var->lv_value.bv_val ); 94 value->bv_len = var->lv_value.bv_len; 95 } 96 97 if ( var == NULL || value->bv_val == NULL ) { 98 rc = REWRITE_ERR; 99 } 100 101#ifdef USE_REWRITE_LDAP_PVT_THREADS 102 ldap_pvt_thread_rdwr_runlock( &info->li_params_mutex ); 103#endif /* USE_REWRITE_LDAP_PVT_THREADS */ 104 105 return REWRITE_SUCCESS; 106} 107 108static void 109rewrite_param_free( 110 void *tmp 111) 112{ 113 struct rewrite_var *var = ( struct rewrite_var * )tmp; 114 assert( var != NULL ); 115 116 assert( var->lv_name != NULL ); 117 assert( var->lv_value.bv_val != NULL ); 118 119 free( var->lv_name ); 120 free( var->lv_value.bv_val ); 121 free( var ); 122} 123 124/* 125 * Destroys the parameter tree 126 */ 127int 128rewrite_param_destroy( 129 struct rewrite_info *info 130) 131{ 132 int count; 133 134 assert( info != NULL ); 135 136#ifdef USE_REWRITE_LDAP_PVT_THREADS 137 ldap_pvt_thread_rdwr_wlock( &info->li_params_mutex ); 138#endif /* USE_REWRITE_LDAP_PVT_THREADS */ 139 140 count = avl_free( info->li_params, rewrite_param_free ); 141 info->li_params = NULL; 142 143#ifdef USE_REWRITE_LDAP_PVT_THREADS 144 ldap_pvt_thread_rdwr_wunlock( &info->li_params_mutex ); 145#endif /* USE_REWRITE_LDAP_PVT_THREADS */ 146 147 return REWRITE_SUCCESS; 148} 149 150