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