1/* $NetBSD: params.c,v 1.1.1.3 2010/12/12 15:22:12 adam Exp $ */ 2 3/* OpenLDAP: pkg/ldap/libraries/librewrite/params.c,v 1.9.2.6 2010/04/13 20:23:08 kurt Exp */ 4/* This work is part of OpenLDAP Software <http://www.openldap.org/>. 5 * 6 * Copyright 2000-2010 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 */ 29int 30rewrite_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 */ 72int 73rewrite_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 110static void 111rewrite_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 */ 129int 130rewrite_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