]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#9363 Store defaults in ArgConf
authorOndřej Kuzník <ondra@mistotebe.net>
Mon, 2 Nov 2020 16:53:49 +0000 (16:53 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Tue, 8 Dec 2020 19:11:22 +0000 (19:11 +0000)
servers/slapd/config.c
servers/slapd/config.h

index 9149adf2cad2ca28e4b816e17d417a5d77f8eb14..8f17b44acc757ea1f180dfbf99cdd23e887b9996 100644 (file)
@@ -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;
index 8a4c7247df9d16e43c7e768824e0f2cf9cb2ce10..5f8724acdbe75bd7b3d36df7e77f070c3a3de470 100644 (file)
 
 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;