1*549b59edSchristos /* $NetBSD: params.c,v 1.3 2021/08/14 16:14:58 christos Exp $ */
24e6df137Slukem
3d11b170bStron /* $OpenLDAP$ */
42de962bdSlukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
52de962bdSlukem *
6*549b59edSchristos * Copyright 2000-2021 The OpenLDAP Foundation.
72de962bdSlukem * All rights reserved.
82de962bdSlukem *
92de962bdSlukem * Redistribution and use in source and binary forms, with or without
102de962bdSlukem * modification, are permitted only as authorized by the OpenLDAP
112de962bdSlukem * Public License.
122de962bdSlukem *
132de962bdSlukem * A copy of this license is available in the file LICENSE in the
142de962bdSlukem * top-level directory of the distribution or, alternatively, at
152de962bdSlukem * <http://www.OpenLDAP.org/license.html>.
162de962bdSlukem */
172de962bdSlukem /* ACKNOWLEDGEMENT:
182de962bdSlukem * This work was initially developed by Pierangelo Masarati for
192de962bdSlukem * inclusion in OpenLDAP Software.
202de962bdSlukem */
212de962bdSlukem
222de962bdSlukem #include <portable.h>
232de962bdSlukem
242de962bdSlukem #include "rewrite-int.h"
252de962bdSlukem
262de962bdSlukem /*
272de962bdSlukem * Defines and inits a variable with global scope
282de962bdSlukem */
292de962bdSlukem int
rewrite_param_set(struct rewrite_info * info,const char * name,const char * value)302de962bdSlukem rewrite_param_set(
312de962bdSlukem struct rewrite_info *info,
322de962bdSlukem const char *name,
332de962bdSlukem const char *value
342de962bdSlukem )
352de962bdSlukem {
362de962bdSlukem struct rewrite_var *var;
374e6df137Slukem int rc = REWRITE_SUCCESS;
382de962bdSlukem
392de962bdSlukem assert( info != NULL );
402de962bdSlukem assert( name != NULL );
412de962bdSlukem assert( value != NULL );
422de962bdSlukem
432de962bdSlukem #ifdef USE_REWRITE_LDAP_PVT_THREADS
442de962bdSlukem ldap_pvt_thread_rdwr_wlock( &info->li_params_mutex );
452de962bdSlukem #endif /* USE_REWRITE_LDAP_PVT_THREADS */
462de962bdSlukem
472de962bdSlukem var = rewrite_var_find( info->li_params, name );
482de962bdSlukem if ( var != NULL ) {
492de962bdSlukem assert( var->lv_value.bv_val != NULL );
502de962bdSlukem free( var->lv_value.bv_val );
512de962bdSlukem var->lv_value.bv_val = strdup( value );
522de962bdSlukem var->lv_value.bv_len = strlen( value );
534e6df137Slukem
542de962bdSlukem } else {
552de962bdSlukem var = rewrite_var_insert( &info->li_params, name, value );
562de962bdSlukem }
574e6df137Slukem
584e6df137Slukem if ( var == NULL || var->lv_value.bv_val == NULL ) {
594e6df137Slukem rc = REWRITE_ERR;
602de962bdSlukem }
612de962bdSlukem
622de962bdSlukem #ifdef USE_REWRITE_LDAP_PVT_THREADS
632de962bdSlukem ldap_pvt_thread_rdwr_wunlock( &info->li_params_mutex );
642de962bdSlukem #endif /* USE_REWRITE_LDAP_PVT_THREADS */
652de962bdSlukem
664e6df137Slukem return rc;
672de962bdSlukem }
682de962bdSlukem
692de962bdSlukem /*
702de962bdSlukem * Gets a var with global scope
712de962bdSlukem */
722de962bdSlukem int
rewrite_param_get(struct rewrite_info * info,const char * name,struct berval * value)732de962bdSlukem rewrite_param_get(
742de962bdSlukem struct rewrite_info *info,
752de962bdSlukem const char *name,
762de962bdSlukem struct berval *value
772de962bdSlukem )
782de962bdSlukem {
792de962bdSlukem struct rewrite_var *var;
804e6df137Slukem int rc = REWRITE_SUCCESS;
812de962bdSlukem
822de962bdSlukem assert( info != NULL );
832de962bdSlukem assert( name != NULL );
842de962bdSlukem assert( value != NULL );
852de962bdSlukem
862de962bdSlukem value->bv_val = NULL;
872de962bdSlukem value->bv_len = 0;
882de962bdSlukem
892de962bdSlukem #ifdef USE_REWRITE_LDAP_PVT_THREADS
902de962bdSlukem ldap_pvt_thread_rdwr_rlock( &info->li_params_mutex );
912de962bdSlukem #endif /* USE_REWRITE_LDAP_PVT_THREADS */
922de962bdSlukem
932de962bdSlukem var = rewrite_var_find( info->li_params, name );
944e6df137Slukem if ( var != NULL ) {
952de962bdSlukem value->bv_val = strdup( var->lv_value.bv_val );
962de962bdSlukem value->bv_len = var->lv_value.bv_len;
972de962bdSlukem }
982de962bdSlukem
994e6df137Slukem if ( var == NULL || value->bv_val == NULL ) {
1004e6df137Slukem rc = REWRITE_ERR;
1014e6df137Slukem }
1024e6df137Slukem
1032de962bdSlukem #ifdef USE_REWRITE_LDAP_PVT_THREADS
1042de962bdSlukem ldap_pvt_thread_rdwr_runlock( &info->li_params_mutex );
1052de962bdSlukem #endif /* USE_REWRITE_LDAP_PVT_THREADS */
1062de962bdSlukem
107*549b59edSchristos return rc;
1082de962bdSlukem }
1092de962bdSlukem
1102de962bdSlukem static void
rewrite_param_free(void * tmp)1112de962bdSlukem rewrite_param_free(
1122de962bdSlukem void *tmp
1132de962bdSlukem )
1142de962bdSlukem {
1152de962bdSlukem struct rewrite_var *var = ( struct rewrite_var * )tmp;
1162de962bdSlukem assert( var != NULL );
1172de962bdSlukem
1182de962bdSlukem assert( var->lv_name != NULL );
1192de962bdSlukem assert( var->lv_value.bv_val != NULL );
1202de962bdSlukem
1212de962bdSlukem free( var->lv_name );
1222de962bdSlukem free( var->lv_value.bv_val );
1232de962bdSlukem free( var );
1242de962bdSlukem }
1252de962bdSlukem
1262de962bdSlukem /*
1272de962bdSlukem * Destroys the parameter tree
1282de962bdSlukem */
1292de962bdSlukem int
rewrite_param_destroy(struct rewrite_info * info)1302de962bdSlukem rewrite_param_destroy(
1312de962bdSlukem struct rewrite_info *info
1322de962bdSlukem )
1332de962bdSlukem {
1342de962bdSlukem assert( info != NULL );
1352de962bdSlukem
1362de962bdSlukem #ifdef USE_REWRITE_LDAP_PVT_THREADS
1372de962bdSlukem ldap_pvt_thread_rdwr_wlock( &info->li_params_mutex );
1382de962bdSlukem #endif /* USE_REWRITE_LDAP_PVT_THREADS */
1392de962bdSlukem
140*549b59edSchristos ldap_avl_free( info->li_params, rewrite_param_free );
1412de962bdSlukem info->li_params = NULL;
1422de962bdSlukem
1432de962bdSlukem #ifdef USE_REWRITE_LDAP_PVT_THREADS
1442de962bdSlukem ldap_pvt_thread_rdwr_wunlock( &info->li_params_mutex );
1452de962bdSlukem #endif /* USE_REWRITE_LDAP_PVT_THREADS */
1462de962bdSlukem
1472de962bdSlukem return REWRITE_SUCCESS;
1482de962bdSlukem }
1492de962bdSlukem
150