Home | History | Annotate | Line # | Download | only in slapd
      1 /*	$NetBSD: slap-config.h,v 1.3 2025/09/05 21:16:26 christos Exp $	*/
      2 
      3 /* slap-config.h - configuration abstraction structure */
      4 /* $OpenLDAP$ */
      5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
      6  *
      7  * Copyright 1998-2024 The OpenLDAP Foundation.
      8  * All rights reserved.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted only as authorized by the OpenLDAP
     12  * Public License.
     13  *
     14  * A copy of this license is available in the file LICENSE in the
     15  * top-level directory of the distribution or, alternatively, at
     16  * <http://www.OpenLDAP.org/license.html>.
     17  */
     18 
     19 #ifndef CONFIG_H
     20 #define CONFIG_H
     21 
     22 #include<ac/string.h>
     23 
     24 LDAP_BEGIN_DECL
     25 
     26 typedef union config_values_u {
     27 	/* Drop-in to make existing "notify" initialisers quietly work */
     28 	void *dummy;
     29 	int v_int;
     30 	unsigned v_uint;
     31 	long v_long;
     32 	size_t v_ulong;
     33 	ber_len_t v_ber_t;
     34 	char *v_string;
     35 	struct berval v_bv;
     36 	struct {
     37 		struct berval vdn_dn;
     38 		struct berval vdn_ndn;
     39 	} v_dn;
     40 	AttributeDescription *v_ad;
     41 } ConfigValues;
     42 
     43 typedef struct ConfigTable {
     44 	const char *name;
     45 	const char *what;
     46 	int min_args;
     47 	int max_args;
     48 	int length;
     49 	unsigned int arg_type;
     50 	void *arg_item;
     51 	const char *attribute;
     52 	AttributeDescription *ad;
     53 	ConfigValues arg_default;
     54 } ConfigTable;
     55 
     56 /* search entries are returned according to this order */
     57 typedef enum {
     58 	Cft_Abstract = 0,
     59 	Cft_Global,
     60 	Cft_Module,
     61 	Cft_Schema,
     62 	Cft_Backend,
     63 	Cft_Database,
     64 	Cft_Overlay,
     65 	Cft_Misc	/* backend/overlay defined */
     66 } ConfigType;
     67 
     68 #define ARGS_USERLAND	0x00000fff
     69 
     70 /* types are enumerated, not a bitmask */
     71 #define ARGS_TYPES	0x0000f000
     72 #define ARG_INT		0x00001000
     73 #define ARG_LONG	0x00002000
     74 #define ARG_BER_LEN_T	0x00003000
     75 #define ARG_ON_OFF	0x00004000
     76 #define ARG_STRING	0x00005000
     77 #define ARG_BERVAL	0x00006000
     78 #define ARG_DN		0x00007000
     79 #define ARG_UINT	0x00008000
     80 #define ARG_ATDESC	0x00009000
     81 #define ARG_ULONG	0x0000a000
     82 #define ARG_BINARY	0x0000b000
     83 
     84 #define ARGS_SYNTAX	0xffff0000
     85 #define ARG_IGNORED	0x00080000
     86 #define ARG_PRE_BI	0x00100000
     87 #define ARG_PRE_DB	0x00200000
     88 #define ARG_DB		0x00400000	/* Only applies to DB */
     89 #define ARG_MAY_DB	0x00800000	/* May apply to DB */
     90 #define ARG_PAREN	0x01000000
     91 #define ARG_NONZERO	0x02000000
     92 #define	ARG_NO_INSERT	0x04000000	/* no arbitrary inserting */
     93 #define	ARG_NO_DELETE	0x08000000	/* no runtime deletes */
     94 #define ARG_UNIQUE	0x10000000
     95 #define	ARG_QUOTE	0x20000000	/* wrap with quotes before parsing */
     96 #define ARG_OFFSET	0x40000000
     97 #define ARG_MAGIC	0x80000000
     98 
     99 #define ARG_BAD_CONF	0xdead0000	/* overload return values */
    100 
    101 /* This is a config entry's e_private data */
    102 typedef struct CfEntryInfo {
    103 	struct CfEntryInfo *ce_parent;
    104 	struct CfEntryInfo *ce_sibs;
    105 	struct CfEntryInfo *ce_kids;
    106 	Entry *ce_entry;
    107 	ConfigType ce_type;
    108 	BackendInfo *ce_bi;
    109 	BackendDB *ce_be;
    110 	void *ce_private;
    111 } CfEntryInfo;
    112 
    113 struct config_args_s;
    114 
    115 /* Check if the child is allowed to be LDAPAdd'd to the parent */
    116 typedef int (ConfigLDAPadd)(
    117 	CfEntryInfo *parent, Entry *child, struct config_args_s *ca);
    118 
    119 /* Let the object create children out of slapd.conf */
    120 typedef int (ConfigCfAdd)(
    121 	Operation *op, SlapReply *rs, Entry *parent, struct config_args_s *ca );
    122 
    123 #ifdef SLAP_CONFIG_DELETE
    124 /* Called when deleting a Cft_Misc Child object from cn=config */
    125 typedef int (ConfigLDAPdel)(
    126 	CfEntryInfo *ce, Operation *op );
    127 #endif
    128 
    129 typedef struct ConfigOCs {
    130 	const char *co_def;
    131 	ConfigType co_type;
    132 	ConfigTable *co_table;
    133 	ConfigLDAPadd *co_ldadd;
    134 	ConfigCfAdd *co_cfadd;
    135 #ifdef SLAP_CONFIG_DELETE
    136 	ConfigLDAPdel *co_lddel;
    137 #endif
    138 	ObjectClass *co_oc;
    139 	struct berval *co_name;
    140 } ConfigOCs;
    141 
    142 typedef int (ConfigDriver)(struct config_args_s *c);
    143 
    144 struct config_reply_s {
    145 	int err;
    146 	char msg[SLAP_TEXT_BUFLEN];
    147 };
    148 
    149 typedef struct config_args_s {
    150 	int argc;
    151 	char **argv;
    152 	int argv_size;
    153 	char *line;
    154 	char *tline;
    155 	const char *fname;
    156 	int lineno;
    157 	int linelen;
    158 	char log[MAXPATHLEN + STRLENOF(": line ") + LDAP_PVT_INTTYPE_CHARS(unsigned long)];
    159 #define cr_msg reply.msg
    160 	ConfigReply reply;
    161 	int depth;
    162 	int valx;	/* multi-valued value index */
    163 	/* parsed first val for simple cases */
    164 	ConfigValues values;
    165 	/* return values for emit mode */
    166 	BerVarray rvalue_vals;
    167 	BerVarray rvalue_nvals;
    168 #define	SLAP_CONFIG_EMIT	0x2000	/* emit instead of set */
    169 #define SLAP_CONFIG_ADD		0x4000	/* config file add vs LDAP add */
    170 	int op;
    171 	int type;	/* ConfigTable.arg_type & ARGS_USERLAND */
    172 	Operation *ca_op;
    173 	BackendDB *be;
    174 	BackendInfo *bi;
    175 	Entry *ca_entry;	/* entry being modified */
    176 	void *ca_private;	/* anything */
    177 #ifndef SLAP_CONFIG_CLEANUP_MAX
    178 #define SLAP_CONFIG_CLEANUP_MAX	16
    179 #endif
    180 	ConfigDriver *cleanups[SLAP_CONFIG_CLEANUP_MAX];
    181 	ConfigType table;	/* what kind of config table did we come from */
    182 	ConfigTable *ca_desc;
    183 	int num_cleanups;
    184 } ConfigArgs;
    185 
    186 /* If lineno is zero, we have an actual LDAP Add request from a client.
    187  * Otherwise, we're reading a config file or a config dir.
    188  */
    189 #define CONFIG_ONLINE_ADD(ca)	(!((ca)->lineno))
    190 
    191 #define value_int values.v_int
    192 #define value_uint values.v_uint
    193 #define value_long values.v_long
    194 #define value_ulong values.v_ulong
    195 #define value_ber_t values.v_ber_t
    196 #define value_string values.v_string
    197 #define value_bv values.v_bv
    198 #define value_dn values.v_dn.vdn_dn
    199 #define value_ndn values.v_dn.vdn_ndn
    200 #define value_ad values.v_ad
    201 
    202 LDAP_SLAPD_F (int) config_fp_parse_line(ConfigArgs *c);
    203 
    204 LDAP_SLAPD_F (int) config_register_schema(ConfigTable *ct, ConfigOCs *co);
    205 LDAP_SLAPD_F (int) config_del_vals(ConfigTable *cf, ConfigArgs *c);
    206 LDAP_SLAPD_F (int) config_get_vals(ConfigTable *ct, ConfigArgs *c);
    207 LDAP_SLAPD_F (int) config_add_vals(ConfigTable *ct, ConfigArgs *c);
    208 
    209 LDAP_SLAPD_F (int) config_push_cleanup(ConfigArgs *c, ConfigDriver *cleanup);
    210 LDAP_SLAPD_F (int) config_run_cleanup(ConfigArgs *c);
    211 
    212 LDAP_SLAPD_F (void) init_config_argv( ConfigArgs *c );
    213 LDAP_SLAPD_F (int) init_config_attrs(ConfigTable *ct);
    214 LDAP_SLAPD_F (int) init_config_ocs( ConfigOCs *ocs );
    215 LDAP_SLAPD_F (void) config_parse_ldif( ConfigArgs *c );
    216 LDAP_SLAPD_F (int) config_parse_vals(ConfigTable *ct, ConfigArgs *c, int valx);
    217 LDAP_SLAPD_F (int) config_parse_add(ConfigTable *ct, ConfigArgs *c, int valx);
    218 LDAP_SLAPD_F (int) read_config_file(const char *fname, int depth, ConfigArgs *cf,
    219 	ConfigTable *cft );
    220 
    221 LDAP_SLAPD_F (ConfigTable *) config_find_keyword(ConfigTable *ct, ConfigArgs *c);
    222 LDAP_SLAPD_F (Entry *) config_build_entry( Operation *op, SlapReply *rs, CfEntryInfo *parent,
    223 	ConfigArgs *c, struct berval *rdn, ConfigOCs *main, ConfigOCs *extra );
    224 
    225 LDAP_SLAPD_F (Listener *) config_check_my_url(const char *url, LDAPURLDesc *lud);
    226 LDAP_SLAPD_F (int) config_shadow( ConfigArgs *c, slap_mask_t flag );
    227 #define	config_slurp_shadow(c)	config_shadow((c), SLAP_DBFLAG_SLURP_SHADOW)
    228 #define	config_sync_shadow(c)	config_shadow((c), SLAP_DBFLAG_SYNC_SHADOW)
    229 
    230 	/* Make sure we don't exceed the bits reserved for userland */
    231 #define	config_check_userland(last) \
    232 	assert( ( ( (last) - 1 ) & ARGS_USERLAND ) == ( (last) - 1 ) );
    233 
    234 #define	SLAP_X_ORDERED_FMT	"{%d}"
    235 
    236 LDAP_SLAPD_V (slap_verbmasks *) slap_ldap_response_code;
    237 LDAP_SLAPD_F (int) slap_ldap_response_code_register( struct berval *bv, int err );
    238 
    239 LDAP_SLAPD_V (ConfigTable) olcDatabaseDummy[];
    240 
    241 LDAP_END_DECL
    242 
    243 #endif /* CONFIG_H */
    244