xref: /netbsd-src/external/bsd/openldap/dist/libraries/librewrite/params.c (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
1 /*	$NetBSD: params.c,v 1.3 2021/08/14 16:14:58 christos Exp $	*/
2 
3 /* $OpenLDAP$ */
4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5  *
6  * Copyright 2000-2021 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
rewrite_param_set(struct rewrite_info * info,const char * name,const char * value)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
rewrite_param_get(struct rewrite_info * info,const char * name,struct berval * value)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 rc;
108 }
109 
110 static void
rewrite_param_free(void * tmp)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
rewrite_param_destroy(struct rewrite_info * info)130 rewrite_param_destroy(
131 		struct rewrite_info *info
132 )
133 {
134 	assert( info != NULL );
135 
136 #ifdef USE_REWRITE_LDAP_PVT_THREADS
137 	ldap_pvt_thread_rdwr_wlock( &info->li_params_mutex );
138 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
139 
140 	ldap_avl_free( info->li_params, rewrite_param_free );
141 	info->li_params = NULL;
142 
143 #ifdef USE_REWRITE_LDAP_PVT_THREADS
144 	ldap_pvt_thread_rdwr_wunlock( &info->li_params_mutex );
145 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
146 
147 	return REWRITE_SUCCESS;
148 }
149 
150