1 /* $NetBSD: params.c,v 1.1.1.2 2010/03/08 02:14:20 lukem Exp $ */ 2 3 /* OpenLDAP: pkg/ldap/libraries/librewrite/params.c,v 1.9.2.5 2009/01/22 00:00:58 kurt Exp */ 4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 5 * 6 * Copyright 2000-2009 The OpenLDAP Foundation. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted only as authorized by the OpenLDAP 11 * Public License. 12 * 13 * A copy of this license is available in the file LICENSE in the 14 * top-level directory of the distribution or, alternatively, at 15 * <http://www.OpenLDAP.org/license.html>. 16 */ 17 /* ACKNOWLEDGEMENT: 18 * This work was initially developed by Pierangelo Masarati for 19 * inclusion in OpenLDAP Software. 20 */ 21 22 #include <portable.h> 23 24 #include "rewrite-int.h" 25 26 /* 27 * Defines and inits a variable with global scope 28 */ 29 int 30 rewrite_param_set( 31 struct rewrite_info *info, 32 const char *name, 33 const char *value 34 ) 35 { 36 struct rewrite_var *var; 37 int rc = REWRITE_SUCCESS; 38 39 assert( info != NULL ); 40 assert( name != NULL ); 41 assert( value != NULL ); 42 43 #ifdef USE_REWRITE_LDAP_PVT_THREADS 44 ldap_pvt_thread_rdwr_wlock( &info->li_params_mutex ); 45 #endif /* USE_REWRITE_LDAP_PVT_THREADS */ 46 47 var = rewrite_var_find( info->li_params, name ); 48 if ( var != NULL ) { 49 assert( var->lv_value.bv_val != NULL ); 50 free( var->lv_value.bv_val ); 51 var->lv_value.bv_val = strdup( value ); 52 var->lv_value.bv_len = strlen( value ); 53 54 } else { 55 var = rewrite_var_insert( &info->li_params, name, value ); 56 } 57 58 if ( var == NULL || var->lv_value.bv_val == NULL ) { 59 rc = REWRITE_ERR; 60 } 61 62 #ifdef USE_REWRITE_LDAP_PVT_THREADS 63 ldap_pvt_thread_rdwr_wunlock( &info->li_params_mutex ); 64 #endif /* USE_REWRITE_LDAP_PVT_THREADS */ 65 66 return rc; 67 } 68 69 /* 70 * Gets a var with global scope 71 */ 72 int 73 rewrite_param_get( 74 struct rewrite_info *info, 75 const char *name, 76 struct berval *value 77 ) 78 { 79 struct rewrite_var *var; 80 int rc = REWRITE_SUCCESS; 81 82 assert( info != NULL ); 83 assert( name != NULL ); 84 assert( value != NULL ); 85 86 value->bv_val = NULL; 87 value->bv_len = 0; 88 89 #ifdef USE_REWRITE_LDAP_PVT_THREADS 90 ldap_pvt_thread_rdwr_rlock( &info->li_params_mutex ); 91 #endif /* USE_REWRITE_LDAP_PVT_THREADS */ 92 93 var = rewrite_var_find( info->li_params, name ); 94 if ( var != NULL ) { 95 value->bv_val = strdup( var->lv_value.bv_val ); 96 value->bv_len = var->lv_value.bv_len; 97 } 98 99 if ( var == NULL || value->bv_val == NULL ) { 100 rc = REWRITE_ERR; 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