From 0c3b8a35249942dc58f0746d3cb4510c072d4344 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ond=C5=99ej=20Kuzn=C3=ADk?= Date: Mon, 2 Nov 2020 16:53:49 +0000 Subject: [PATCH] ITS#9363 Store defaults in ArgConf --- servers/slapd/config.c | 24 ++++++++++++++++-------- servers/slapd/config.h | 34 +++++++++++++++++++--------------- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 9149adf2ca..8f17b44acc 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -482,22 +482,30 @@ config_del_vals(ConfigTable *cf, ConfigArgs *c) if ( cf->arg_type & ARGS_TYPES ) switch ( cf->arg_type & ARGS_TYPES ) { case ARG_ON_OFF: - case ARG_INT: *(int *)ptr = 0; break; - case ARG_UINT: *(unsigned *)ptr = 0; break; - case ARG_LONG: *(long *)ptr = 0; break; - case ARG_ULONG: *(size_t *)ptr = 0; break; - case ARG_BER_LEN_T: *(ber_len_t *)ptr = 0; break; + case ARG_INT: *(int *)ptr = cf->arg_default.v_int; break; + case ARG_UINT: *(unsigned *)ptr = cf->arg_default.v_uint; break; + case ARG_LONG: *(long *)ptr = cf->arg_default.v_long; break; + case ARG_ULONG: *(size_t *)ptr = cf->arg_default.v_ulong; break; + case ARG_BER_LEN_T: *(ber_len_t *)ptr = cf->arg_default.v_ber_t; break; case ARG_STRING: ch_free( *(char**)ptr ); - *(char **)ptr = NULL; + if ( cf->arg_default.v_string ) { + *(char **)ptr = ch_strdup( cf->arg_default.v_string ); + } else { + *(char **)ptr = NULL; + } break; case ARG_BERVAL: case ARG_BINARY: ch_free( ((struct berval *)ptr)->bv_val ); - BER_BVZERO( (struct berval *)ptr ); + if ( !BER_BVISNULL( &cf->arg_default.v_bv ) ) { + ber_dupbv( (struct berval *)ptr, &cf->arg_default.v_bv ); + } else { + BER_BVZERO( (struct berval *)ptr ); + } break; case ARG_ATDESC: - *(AttributeDescription **)ptr = NULL; + *(AttributeDescription **)ptr = cf->arg_default.v_ad; break; } return rc; diff --git a/servers/slapd/config.h b/servers/slapd/config.h index 8a4c7247df..5f8724acdb 100644 --- a/servers/slapd/config.h +++ b/servers/slapd/config.h @@ -21,6 +21,23 @@ LDAP_BEGIN_DECL +typedef union config_values_u { + /* Drop-in to make existing "notify" initialisers quietly work */ + void *dummy; + int v_int; + unsigned v_uint; + long v_long; + size_t v_ulong; + ber_len_t v_ber_t; + char *v_string; + struct berval v_bv; + struct { + struct berval vdn_dn; + struct berval vdn_ndn; + } v_dn; + AttributeDescription *v_ad; +} ConfigValues; + typedef struct ConfigTable { const char *name; const char *what; @@ -31,7 +48,7 @@ typedef struct ConfigTable { void *arg_item; const char *attribute; AttributeDescription *ad; - void *notify; + ConfigValues arg_default; } ConfigTable; /* search entries are returned according to this order */ @@ -142,20 +159,7 @@ typedef struct config_args_s { int depth; int valx; /* multi-valued value index */ /* parsed first val for simple cases */ - union { - int v_int; - unsigned v_uint; - long v_long; - size_t v_ulong; - ber_len_t v_ber_t; - char *v_string; - struct berval v_bv; - struct { - struct berval vdn_dn; - struct berval vdn_ndn; - } v_dn; - AttributeDescription *v_ad; - } values; + ConfigValues values; /* return values for emit mode */ BerVarray rvalue_vals; BerVarray rvalue_nvals; -- 2.47.3