-#define ARGS_USERLAND 0x0000ffffL
-#define ARGS_TYPES 0x00ff0000L
-#define ARGS_POINTER 0x001f0000L
-#define ARGS_NUMERIC 0x000f0000L
-#define ARG_INT 0x00010000L
-#define ARG_LONG 0x00020000L
-#define ARG_BER_LEN_T 0x00040000L
-#define ARG_ON_OFF 0x00080000L
-#define ARG_STRING 0x00100000L
-#define ARG_BERVAL 0x00200000L /* XXX not yet */
-#define ARG_EXISTS 0x00400000L /* XXX not yet */
-#define ARG_IGNORED 0x00800000L
-
-#define ARGS_SYNTAX 0xff000000L
-#define ARG_DB 0x01000000L
-#define ARG_PRE_DB 0x02000000L
-#define ARG_PAREN 0x04000000L
-#define ARG_NONZERO 0x08000000L
-#define ARG_UNIQUE 0x10000000L /* XXX not yet */
-#define ARG_SPECIAL 0x20000000L /* one special case */
-#define ARG_OFFSET 0x40000000L
-#define ARG_MAGIC 0x80000000L
-
-#define ARG_BAD_CONF 0xdead0000L /* overload return values */
-#define ARG_UNKNOWN 0xc0de0000L
+/* search entries are returned according to this order */
+typedef enum {
+ Cft_Abstract = 0,
+ Cft_Global,
+ Cft_Module,
+ Cft_Schema,
+ Cft_Backend,
+ Cft_Database,
+ Cft_Overlay,
+ Cft_Misc /* backend/overlay defined */
+} ConfigType;
+
+#define ARGS_USERLAND 0x00000fff
+
+/* types are enumerated, not a bitmask */
+#define ARGS_TYPES 0x0000f000
+#define ARG_INT 0x00001000
+#define ARG_LONG 0x00002000
+#define ARG_BER_LEN_T 0x00003000
+#define ARG_ON_OFF 0x00004000
+#define ARG_STRING 0x00005000
+#define ARG_BERVAL 0x00006000
+#define ARG_DN 0x00007000
+#define ARG_UINT 0x00008000
+#define ARG_ATDESC 0x00009000
+#define ARG_ULONG 0x0000a000
+
+#define ARGS_SYNTAX 0xffff0000
+#define ARG_IGNORED 0x00080000
+#define ARG_PRE_BI 0x00100000
+#define ARG_PRE_DB 0x00200000
+#define ARG_DB 0x00400000 /* Only applies to DB */
+#define ARG_MAY_DB 0x00800000 /* May apply to DB */
+#define ARG_PAREN 0x01000000
+#define ARG_NONZERO 0x02000000
+#define ARG_NO_INSERT 0x04000000 /* no arbitrary inserting */
+#define ARG_NO_DELETE 0x08000000 /* no runtime deletes */
+#define ARG_UNIQUE 0x10000000
+#define ARG_QUOTE 0x20000000 /* wrap with quotes before parsing */
+#define ARG_OFFSET 0x40000000
+#define ARG_MAGIC 0x80000000
+
+#define ARG_BAD_CONF 0xdead0000 /* overload return values */
+
+/* This is a config entry's e_private data */
+typedef struct CfEntryInfo {
+ struct CfEntryInfo *ce_parent;
+ struct CfEntryInfo *ce_sibs;
+ struct CfEntryInfo *ce_kids;
+ Entry *ce_entry;
+ ConfigType ce_type;
+ BackendInfo *ce_bi;
+ BackendDB *ce_be;
+ void *ce_private;
+} CfEntryInfo;
+
+struct config_args_s;
+
+/* Check if the child is allowed to be LDAPAdd'd to the parent */
+typedef int (ConfigLDAPadd)(
+ CfEntryInfo *parent, Entry *child, struct config_args_s *ca);
+
+/* Let the object create children out of slapd.conf */
+typedef int (ConfigCfAdd)(
+ Operation *op, SlapReply *rs, Entry *parent, struct config_args_s *ca );
+
+#ifdef SLAP_CONFIG_DELETE
+/* Called when deleting a Cft_Misc Child object from cn=config */
+typedef int (ConfigLDAPdel)(
+ CfEntryInfo *ce, Operation *op );
+#endif
+
+typedef struct ConfigOCs {
+ const char *co_def;
+ ConfigType co_type;
+ ConfigTable *co_table;
+ ConfigLDAPadd *co_ldadd;
+ ConfigCfAdd *co_cfadd;
+#ifdef SLAP_CONFIG_DELETE
+ ConfigLDAPdel *co_lddel;
+#endif
+ ObjectClass *co_oc;
+ struct berval *co_name;
+} ConfigOCs;
+
+typedef int (ConfigDriver)(struct config_args_s *c);
+
+struct config_reply_s {
+ int err;
+ char msg[SLAP_TEXT_BUFLEN];
+};