1/*	$NetBSD$	*/
2
3/* OpenLDAP: pkg/ldap/libraries/librewrite/params.c,v 1.9.2.6 2010/04/13 20:23:08 kurt Exp */
4/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 *
6 * Copyright 2000-2010 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 */
29int
30rewrite_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 */
72int
73rewrite_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 REWRITE_SUCCESS;
108}
109
110static void
111rewrite_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 */
129int
130rewrite_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