solanum/include/newconf.h
Keith Buck dceac3e4fb conf parsing: Fix memory leaks and clean up code a bit.
Charybdis currently leaks about 45-50k per configuration parse,
including every rehash. This change plugs these leaks by properly
iterating through all conf_parm_t structures to seek all strings that
should be freed and also by freeing the conf_parm_t structures
themselves.

These leaks have been present since the original rewrite of the
configuration parsing system in ircd-ratbox r11953.

Additionally, this change also cleans up and documents the parsing code
a bit.
2014-02-28 17:35:51 +00:00

80 lines
2.2 KiB
C

/* This code is in the public domain.
* $Nightmare: nightmare/include/config.h,v 1.32.2.2.2.2 2002/07/02 03:41:28 ejb Exp $
* $Id: newconf.h 1735 2006-07-19 02:35:40Z nenolod $
*/
#ifndef _NEWCONF_H_INCLUDED
#define _NEWCONF_H_INCLUDED
struct ConfEntry
{
const char *cf_name;
int cf_type;
void (*cf_func) (void *);
int cf_len;
void *cf_arg;
};
struct TopConf
{
const char *tc_name;
int (*tc_sfunc) (struct TopConf *);
int (*tc_efunc) (struct TopConf *);
rb_dlink_list tc_items;
struct ConfEntry *tc_entries;
};
#define CF_QSTRING 0x01 /* quoted string */
#define CF_INT 0x02
#define CF_STRING 0x03 /* unquoted string */
#define CF_TIME 0x04
#define CF_YESNO 0x05
#define CF_MTYPE 0xFF /* mask for type */
/* CF_FLIST is used to allow specifying that an option accepts a list of (type)
* values. conf_parm_t.type will never actually have another type & CF_FLIST;
* it's only used as a true flag in newconf.c (which only consumes conf_parm_t
* structures and doesn't create them itself).
*/
#define CF_FLIST 0x0100 /* flag for list */
#define CF_MFLAG 0xFF00 /* mask for flags */
/* conf_parm_t.type must be either one type OR one flag. this is pretty easy to
* enforce because lists always contain nested conf_parm_t structures whose
* .type is the real type, so it doesn't need to be stored in the top-level one
* anyway.
*/
typedef struct conf_parm_t_stru
{
struct conf_parm_t_stru *next;
int type;
union
{
char *string;
int number;
struct conf_parm_t_stru *list;
}
v;
}
conf_parm_t;
extern struct TopConf *conf_cur_block;
extern char *current_file;
int read_config(char *);
int conf_start_block(char *, char *);
int conf_end_block(struct TopConf *);
int conf_call_set(struct TopConf *, char *, conf_parm_t *);
void conf_report_error(const char *, ...);
void newconf_init(void);
int add_conf_item(const char *topconf, const char *name, int type, void (*func) (void *));
int remove_conf_item(const char *topconf, const char *name);
int add_top_conf(const char *name, int (*sfunc) (struct TopConf *), int (*efunc) (struct TopConf *), struct ConfEntry *items);
int remove_top_conf(char *name);
struct TopConf *find_top_conf(const char *name);
struct ConfEntry *find_conf_item(const struct TopConf *top, const char *name);
#endif