#include <unistd.h>
#include <htable.h>
#include <argv.h>
#include <dict.h>
#include <name_code.h>
#define PCF_SHOW_NONDEF (1<<0)
#define PCF_SHOW_DEFS (1<<1)
#define PCF_HIDE_NAME (1<<2)
#define PCF_SHOW_MAPS (1<<3)
#define PCF_EDIT_CONF (1<<4)
#define PCF_SHOW_LOCKS (1<<5)
#define PCF_SHOW_EVAL (1<<6)
#define PCF_SHOW_SASL_SERV (1<<7)
#define PCF_SHOW_SASL_CLNT (1<<8)
#define PCF_COMMENT_OUT (1<<9)
#define PCF_MASTER_ENTRY (1<<10)
#define PCF_FOLD_LINE (1<<11)
#define PCF_EDIT_EXCL (1<<12)
#define PCF_MASTER_FLD (1<<13)
#define PCF_MAIN_PARAM (1<<14)
#define PCF_EXP_DSN_TEMPL (1<<15)
#define PCF_PARAM_CLASS (1<<16)
#define PCF_MAIN_OVER (1<<17)
#define PCF_DUMP_DSN_TEMPL (1<<18)
#define PCF_MASTER_PARAM (1<<19)
#define PCF_HIDE_VALUE (1<<20)
#define PCF_SHOW_TLS (1<<21)
#define PCF_DEF_MODE 0
typedef struct {
int flags;
void *param_data;
const char *(*convert_fn) (void *);
} PCF_PARAM_NODE;
#define PCF_PARAM_FLAG_RAW (1<<0)
#define PCF_PARAM_FLAG_BUILTIN (1<<1)
#define PCF_PARAM_FLAG_SERVICE (1<<2)
#define PCF_PARAM_FLAG_USER (1<<3)
#define PCF_PARAM_FLAG_LEGACY (1<<4)
#define PCF_PARAM_FLAG_READONLY (1<<5)
#define PCF_PARAM_FLAG_DBMS (1<<6)
#define PCF_PARAM_MASK_CLASS \
(PCF_PARAM_FLAG_BUILTIN | PCF_PARAM_FLAG_SERVICE | PCF_PARAM_FLAG_USER)
#define PCF_PARAM_CLASS_OVERRIDE(node, class) \
((node)->flags = (((node)->flags & ~PCF_PARAM_MASK_CLASS) | (class)))
#define PCF_RAW_PARAMETER(node) ((node)->flags & PCF_PARAM_FLAG_RAW)
#define PCF_LEGACY_PARAMETER(node) ((node)->flags & PCF_PARAM_FLAG_LEGACY)
#define PCF_READONLY_PARAMETER(node) ((node)->flags & PCF_PARAM_FLAG_READONLY)
#define PCF_DBMS_PARAMETER(node) ((node)->flags & PCF_PARAM_FLAG_DBMS)
#define PCF_PARAM_NO_DATA ((char *) 0)
#define PCF_PARAM_TABLE HTABLE
#define PCF_PARAM_INFO HTABLE_INFO
extern PCF_PARAM_TABLE *pcf_param_table;
#define PCF_PARAM_TABLE_CREATE(size) htable_create(size);
#define PCF_PARAM_NODE_CAST(ptr) ((PCF_PARAM_NODE *) (ptr))
#define PCF_PARAM_TABLE_LIST(table) htable_list(table)
#define PCF_PARAM_INFO_NAME(ht) ((const char *) (ht)->key)
#define PCF_PARAM_INFO_NODE(ht) PCF_PARAM_NODE_CAST((ht)->value)
#define PCF_PARAM_TABLE_FIND(table, name) \
PCF_PARAM_NODE_CAST(htable_find((table), (name)))
#define PCF_PARAM_TABLE_LOCATE(table, name) htable_locate((table), (name))
#define PCF_PARAM_TABLE_ENTER(table, name, flags, data, func) \
htable_enter((table), (name), (char *) pcf_make_param_node((flags), \
(data), (func)))
extern PCF_PARAM_NODE *pcf_make_param_node(int, void *, const char *(*) (void *));
extern const char *pcf_convert_param_node(int, const char *, PCF_PARAM_NODE *);
extern VSTRING *pcf_param_string_buf;
typedef struct {
char *name_space;
ARGV *argv;
DICT *all_params;
HTABLE *valid_names;
} PCF_MASTER_ENT;
#define PCF_MASTER_MIN_FIELDS 8
#define PCF_MASTER_NAME_SERVICE "service"
#define PCF_MASTER_NAME_TYPE "type"
#define PCF_MASTER_NAME_PRIVATE "private"
#define PCF_MASTER_NAME_UNPRIV "unprivileged"
#define PCF_MASTER_NAME_CHROOT "chroot"
#define PCF_MASTER_NAME_WAKEUP "wakeup"
#define PCF_MASTER_NAME_MAXPROC "process_limit"
#define PCF_MASTER_NAME_CMD "command"
#define PCF_MASTER_FLD_SERVICE 0
#define PCF_MASTER_FLD_TYPE 1
#define PCF_MASTER_FLD_PRIVATE 2
#define PCF_MASTER_FLD_UNPRIV 3
#define PCF_MASTER_FLD_CHROOT 4
#define PCF_MASTER_FLD_WAKEUP 5
#define PCF_MASTER_FLD_MAXPROC 6
#define PCF_MASTER_FLD_CMD 7
#define PCF_MASTER_FLD_WILDC -1
#define PCF_MASTER_FLD_NONE -2
PCF_MASTER_ENT *pcf_master_table;
#define PCF_LINE_LIMIT 80
#define PCF_SEPARATORS " \t\r\n"
#define PCF_INDENT_LEN 4
#define PCF_INDENT_TEXT " "
extern int pcf_cmd_mode;
extern void pcf_set_config_dir(void);
extern void pcf_read_parameters(void);
extern void pcf_set_parameters(char **);
extern void pcf_show_parameters(VSTREAM *, int, int, char **);
extern void pcf_edit_main(int, int, char **);
extern void pcf_edit_master(int, int, char **);
extern const char pcf_daemon_options_expecting_value[];
extern void pcf_read_master(int);
extern void pcf_show_master_entries(VSTREAM *, int, int, char **);
extern const char *pcf_parse_master_entry(PCF_MASTER_ENT *, const char *);
extern void pcf_print_master_entry(VSTREAM *, int, PCF_MASTER_ENT *);
extern void pcf_free_master_entry(PCF_MASTER_ENT *);
extern void pcf_show_master_fields(VSTREAM *, int, int, char **);
extern void pcf_edit_master_field(PCF_MASTER_ENT *, int, const char *);
extern void pcf_show_master_params(VSTREAM *, int, int, char **);
extern void pcf_edit_master_param(PCF_MASTER_ENT *, int, const char *, const char *);
#define PCF_WARN_ON_OPEN_ERROR 0
#define PCF_FAIL_ON_OPEN_ERROR 1
#define PCF_MASTER_BLANKS " \t\r\n"
#define PCF_NAMESP_SEP_CH '/'
#define PCF_NAMESP_SEP_STR "/"
#define PCF_LEGACY_SEP_CH '.'
#define PCF_MATCH_WILDC_STR "*"
#define PCF_MATCH_ANY(p) ((p)[0] == PCF_MATCH_WILDC_STR[0] && (p)[1] == 0)
#define PCF_MATCH_STRING(p, s) (PCF_MATCH_ANY(p) || strcmp((p), (s)) == 0)
extern ARGV *pcf_parse_service_pattern(const char *, int, int);
extern int pcf_parse_field_pattern(const char *);
#define PCF_IS_MAGIC_SERVICE_PATTERN(pat) \
(PCF_MATCH_ANY((pat)->argv[0]) || PCF_MATCH_ANY((pat)->argv[1]))
#define PCF_MATCH_SERVICE_PATTERN(pat, name, type) \
(PCF_MATCH_STRING((pat)->argv[0], (name)) \
&& PCF_MATCH_STRING((pat)->argv[1], (type)))
#define pcf_is_magic_field_pattern(pat) ((pat) == PCF_MASTER_FLD_WILDC)
#define pcf_str_field_pattern(pat) ((const char *) (pcf_field_name_offset[pat].name))
#define PCF_IS_MAGIC_PARAM_PATTERN(pat) PCF_MATCH_ANY(pat)
#define PCF_MATCH_PARAM_PATTERN(pat, name) PCF_MATCH_STRING((pat), (name))
extern NAME_CODE pcf_field_name_offset[];
extern void pcf_register_builtin_parameters(const char *, pid_t);
extern void pcf_register_service_parameters(void);
typedef struct {
PCF_MASTER_ENT *local_scope;
int param_class;
} PCF_PARAM_CTX;
extern void pcf_register_user_parameters(void);
extern void pcf_register_dbms_parameters(const char *,
const char *(*) (const char *, int, PCF_MASTER_ENT *),
PCF_MASTER_ENT *);
extern const char *pcf_lookup_parameter_value(int, const char *,
PCF_MASTER_ENT *,
PCF_PARAM_NODE *);
extern char *pcf_expand_parameter_value(VSTRING *, int, const char *,
PCF_MASTER_ENT *);
extern void PRINTFLIKE(3, 4) pcf_print_line(VSTREAM *, int, const char *,...);
extern void pcf_flag_unused_main_parameters(void);
extern void pcf_flag_unused_master_parameters(void);
extern void pcf_show_maps(void);
extern void pcf_show_locks(void);
extern void pcf_show_sasl(int);
extern void pcf_show_tls(const char *);