xref: /netbsd-src/external/bsd/openldap/dist/libraries/librewrite/params.c (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
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