params.c revision 1.1.1.1.8.2 1 /* $OpenLDAP: pkg/ldap/libraries/librewrite/params.c,v 1.9.2.3 2008/02/11 23:26:42 kurt Exp $ */
2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3 *
4 * Copyright 2000-2008 The OpenLDAP Foundation.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted only as authorized by the OpenLDAP
9 * Public License.
10 *
11 * A copy of this license is available in the file LICENSE in the
12 * top-level directory of the distribution or, alternatively, at
13 * <http://www.OpenLDAP.org/license.html>.
14 */
15 /* ACKNOWLEDGEMENT:
16 * This work was initially developed by Pierangelo Masarati for
17 * inclusion in OpenLDAP Software.
18 */
19
20 #include <portable.h>
21
22 #include "rewrite-int.h"
23
24 /*
25 * Defines and inits a variable with global scope
26 */
27 int
28 rewrite_param_set(
29 struct rewrite_info *info,
30 const char *name,
31 const char *value
32 )
33 {
34 struct rewrite_var *var;
35
36 assert( info != NULL );
37 assert( name != NULL );
38 assert( value != NULL );
39
40 #ifdef USE_REWRITE_LDAP_PVT_THREADS
41 ldap_pvt_thread_rdwr_wlock( &info->li_params_mutex );
42 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
43
44 var = rewrite_var_find( info->li_params, name );
45 if ( var != NULL ) {
46 assert( var->lv_value.bv_val != NULL );
47 free( var->lv_value.bv_val );
48 var->lv_value.bv_val = strdup( value );
49 var->lv_value.bv_len = strlen( value );
50 } else {
51 var = rewrite_var_insert( &info->li_params, name, value );
52 if ( var == NULL ) {
53 #ifdef USE_REWRITE_LDAP_PVT_THREADS
54 ldap_pvt_thread_rdwr_wunlock( &info->li_params_mutex );
55 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
56 return REWRITE_ERR;
57 }
58 }
59
60 #ifdef USE_REWRITE_LDAP_PVT_THREADS
61 ldap_pvt_thread_rdwr_wunlock( &info->li_params_mutex );
62 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
63
64 return REWRITE_SUCCESS;
65 }
66
67 /*
68 * Gets a var with global scope
69 */
70 int
71 rewrite_param_get(
72 struct rewrite_info *info,
73 const char *name,
74 struct berval *value
75 )
76 {
77 struct rewrite_var *var;
78
79 assert( info != NULL );
80 assert( name != NULL );
81 assert( value != NULL );
82
83 value->bv_val = NULL;
84 value->bv_len = 0;
85
86 #ifdef USE_REWRITE_LDAP_PVT_THREADS
87 ldap_pvt_thread_rdwr_rlock( &info->li_params_mutex );
88 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
89
90 var = rewrite_var_find( info->li_params, name );
91 if ( var == NULL ) {
92
93 #ifdef USE_REWRITE_LDAP_PVT_THREADS
94 ldap_pvt_thread_rdwr_runlock( &info->li_params_mutex );
95 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
96
97 return REWRITE_ERR;
98 } else {
99 value->bv_val = strdup( var->lv_value.bv_val );
100 value->bv_len = var->lv_value.bv_len;
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 REWRITE_SUCCESS;
108 }
109
110 static void
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
130 rewrite_param_destroy(
131 struct rewrite_info *info
132 )
133 {
134 int count;
135
136 assert( info != NULL );
137
138 #ifdef USE_REWRITE_LDAP_PVT_THREADS
139 ldap_pvt_thread_rdwr_wlock( &info->li_params_mutex );
140 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
141
142 count = avl_free( info->li_params, rewrite_param_free );
143 info->li_params = NULL;
144
145 #ifdef USE_REWRITE_LDAP_PVT_THREADS
146 ldap_pvt_thread_rdwr_wunlock( &info->li_params_mutex );
147 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
148
149 return REWRITE_SUCCESS;
150 }
151
152