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