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