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