2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4 * Copyright 2000-2017 The OpenLDAP Foundation.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted only as authorized by the OpenLDAP
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>.
16 * This work was initially developed by Pierangelo Masarati for
17 * inclusion in OpenLDAP Software.
22 #include "rewrite-int.h"
25 * Compares two cookies
33 const struct rewrite_session *s1, *s2;
35 s1 = ( const struct rewrite_session * )c1;
36 s2 = ( const struct rewrite_session * )c2;
40 assert( s1->ls_cookie != NULL );
41 assert( s2->ls_cookie != NULL );
43 return ( ( s1->ls_cookie < s2->ls_cookie ) ? -1 :
44 ( ( s1->ls_cookie > s2->ls_cookie ) ? 1 : 0 ) );
56 struct rewrite_session *s1, *s2;
58 s1 = ( struct rewrite_session * )c1;
59 s2 = ( struct rewrite_session * )c2;
63 assert( s1->ls_cookie != NULL );
64 assert( s2->ls_cookie != NULL );
66 assert( s1->ls_cookie != s2->ls_cookie );
68 return ( ( s1->ls_cookie == s2->ls_cookie ) ? -1 : 0 );
74 struct rewrite_session *
76 struct rewrite_info *info,
80 struct rewrite_session *session, tmp;
83 assert( info != NULL );
84 assert( cookie != NULL );
86 #ifdef USE_REWRITE_LDAP_PVT_THREADS
87 ldap_pvt_thread_rdwr_wlock( &info->li_cookies_mutex );
88 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
90 tmp.ls_cookie = ( void * )cookie;
91 session = ( struct rewrite_session * )avl_find( info->li_cookies,
92 ( caddr_t )&tmp, rewrite_cookie_cmp );
95 #ifdef USE_REWRITE_LDAP_PVT_THREADS
96 ldap_pvt_thread_rdwr_wunlock( &info->li_cookies_mutex );
97 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
101 session = calloc( sizeof( struct rewrite_session ), 1 );
102 if ( session == NULL ) {
103 #ifdef USE_REWRITE_LDAP_PVT_THREADS
104 ldap_pvt_thread_rdwr_wunlock( &info->li_cookies_mutex );
105 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
108 session->ls_cookie = ( void * )cookie;
109 session->ls_count = 1;
111 #ifdef USE_REWRITE_LDAP_PVT_THREADS
112 if ( ldap_pvt_thread_mutex_init( &session->ls_mutex ) ) {
114 ldap_pvt_thread_rdwr_wunlock( &info->li_cookies_mutex );
117 if ( ldap_pvt_thread_rdwr_init( &session->ls_vars_mutex ) ) {
118 ldap_pvt_thread_mutex_destroy( &session->ls_mutex );
120 ldap_pvt_thread_rdwr_wunlock( &info->li_cookies_mutex );
123 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
125 rc = avl_insert( &info->li_cookies, ( caddr_t )session,
126 rewrite_cookie_cmp, rewrite_cookie_dup );
127 info->li_num_cookies++;
129 #ifdef USE_REWRITE_LDAP_PVT_THREADS
130 ldap_pvt_thread_rdwr_wunlock( &info->li_cookies_mutex );
131 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
134 #ifdef USE_REWRITE_LDAP_PVT_THREADS
135 ldap_pvt_thread_rdwr_destroy( &session->ls_vars_mutex );
136 ldap_pvt_thread_mutex_destroy( &session->ls_mutex );
137 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
149 struct rewrite_session *
150 rewrite_session_find(
151 struct rewrite_info *info,
155 struct rewrite_session *session, tmp;
157 assert( info != NULL );
158 assert( cookie != NULL );
160 tmp.ls_cookie = ( void * )cookie;
161 #ifdef USE_REWRITE_LDAP_PVT_THREADS
162 ldap_pvt_thread_rdwr_rlock( &info->li_cookies_mutex );
163 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
164 session = ( struct rewrite_session * )avl_find( info->li_cookies,
165 ( caddr_t )&tmp, rewrite_cookie_cmp );
166 #ifdef USE_REWRITE_LDAP_PVT_THREADS
168 ldap_pvt_thread_mutex_lock( &session->ls_mutex );
171 ldap_pvt_thread_rdwr_runlock( &info->li_cookies_mutex );
172 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
181 rewrite_session_return(
182 struct rewrite_info *info,
183 struct rewrite_session *session
186 assert( session != NULL );
188 ldap_pvt_thread_mutex_unlock( &session->ls_mutex );
192 * Defines and inits a var with session scope
195 rewrite_session_var_set_f(
196 struct rewrite_info *info,
203 struct rewrite_session *session;
204 struct rewrite_var *var;
206 assert( info != NULL );
207 assert( cookie != NULL );
208 assert( name != NULL );
209 assert( value != NULL );
211 session = rewrite_session_find( info, cookie );
212 if ( session == NULL ) {
213 session = rewrite_session_init( info, cookie );
214 if ( session == NULL ) {
218 #ifdef USE_REWRITE_LDAP_PVT_THREADS
219 ldap_pvt_thread_mutex_lock( &session->ls_mutex );
220 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
223 #ifdef USE_REWRITE_LDAP_PVT_THREADS
224 ldap_pvt_thread_rdwr_wlock( &session->ls_vars_mutex );
225 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
227 var = rewrite_var_find( session->ls_vars, name );
229 assert( var->lv_value.bv_val != NULL );
231 (void)rewrite_var_replace( var, value, flags );
234 var = rewrite_var_insert_f( &session->ls_vars, name, value, flags );
236 #ifdef USE_REWRITE_LDAP_PVT_THREADS
237 ldap_pvt_thread_rdwr_wunlock( &session->ls_vars_mutex );
238 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
239 rewrite_session_return( info, session );
244 #ifdef USE_REWRITE_LDAP_PVT_THREADS
245 ldap_pvt_thread_rdwr_wunlock( &session->ls_vars_mutex );
246 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
248 rewrite_session_return( info, session );
250 return REWRITE_SUCCESS;
254 * Gets a var with session scope
257 rewrite_session_var_get(
258 struct rewrite_info *info,
264 struct rewrite_session *session;
265 struct rewrite_var *var;
266 int rc = REWRITE_SUCCESS;
268 assert( info != NULL );
269 assert( cookie != NULL );
270 assert( name != NULL );
271 assert( value != NULL );
273 value->bv_val = NULL;
276 if ( cookie == NULL ) {
280 session = rewrite_session_find( info, cookie );
281 if ( session == NULL ) {
285 #ifdef USE_REWRITE_LDAP_PVT_THREADS
286 ldap_pvt_thread_rdwr_rlock( &session->ls_vars_mutex );
287 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
289 var = rewrite_var_find( session->ls_vars, name );
291 value->bv_val = strdup( var->lv_value.bv_val );
292 value->bv_len = var->lv_value.bv_len;
295 if ( var == NULL || value->bv_val == NULL ) {
299 #ifdef USE_REWRITE_LDAP_PVT_THREADS
300 ldap_pvt_thread_rdwr_runlock( &session->ls_vars_mutex );
301 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
303 rewrite_session_return( info, session );
309 rewrite_session_clean( void *v_session )
311 struct rewrite_session *session = (struct rewrite_session *)v_session;
313 #ifdef USE_REWRITE_LDAP_PVT_THREADS
314 ldap_pvt_thread_rdwr_wlock( &session->ls_vars_mutex );
315 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
317 rewrite_var_delete( session->ls_vars );
319 #ifdef USE_REWRITE_LDAP_PVT_THREADS
320 ldap_pvt_thread_rdwr_wunlock( &session->ls_vars_mutex );
321 ldap_pvt_thread_rdwr_destroy( &session->ls_vars_mutex );
322 ldap_pvt_thread_mutex_unlock( &session->ls_mutex );
323 ldap_pvt_thread_mutex_destroy( &session->ls_mutex );
324 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
328 rewrite_session_free( void *v_session )
330 struct rewrite_session *session = (struct rewrite_session *)v_session;
332 ldap_pvt_thread_mutex_lock( &session->ls_mutex );
333 rewrite_session_clean( v_session );
341 rewrite_session_delete(
342 struct rewrite_info *info,
346 struct rewrite_session *session, tmp = { 0 };
348 assert( info != NULL );
349 assert( cookie != NULL );
351 session = rewrite_session_find( info, cookie );
353 if ( session == NULL ) {
354 return REWRITE_SUCCESS;
357 if ( --session->ls_count > 0 ) {
358 rewrite_session_return( info, session );
359 return REWRITE_SUCCESS;
362 rewrite_session_clean( session );
364 #ifdef USE_REWRITE_LDAP_PVT_THREADS
365 ldap_pvt_thread_rdwr_wlock( &info->li_cookies_mutex );
366 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
368 assert( info->li_num_cookies > 0 );
369 info->li_num_cookies--;
372 * There is nothing to delete in the return value
374 tmp.ls_cookie = ( void * )cookie;
375 avl_delete( &info->li_cookies, ( caddr_t )&tmp, rewrite_cookie_cmp );
379 #ifdef USE_REWRITE_LDAP_PVT_THREADS
380 ldap_pvt_thread_rdwr_wunlock( &info->li_cookies_mutex );
381 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
383 return REWRITE_SUCCESS;
387 * Destroys the cookie tree
390 rewrite_session_destroy(
391 struct rewrite_info *info
396 assert( info != NULL );
398 #ifdef USE_REWRITE_LDAP_PVT_THREADS
399 ldap_pvt_thread_rdwr_wlock( &info->li_cookies_mutex );
400 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
403 * Should call per-session destruction routine ...
406 count = avl_free( info->li_cookies, rewrite_session_free );
407 info->li_cookies = NULL;
410 fprintf( stderr, "count = %d; num_cookies = %d\n",
411 count, info->li_num_cookies );
414 assert( count == info->li_num_cookies );
415 info->li_num_cookies = 0;
417 #ifdef USE_REWRITE_LDAP_PVT_THREADS
418 ldap_pvt_thread_rdwr_wunlock( &info->li_cookies_mutex );
419 #endif /* USE_REWRITE_LDAP_PVT_THREADS */
421 return REWRITE_SUCCESS;