#ifndef OPT_POLICY_H #define OPT_POLICY_H #include "opt_serv.h" #include #define OPT_POLICY_CONF_DEF_POLICY_NAME "" typedef struct Opt_policy_ipv4 { unsigned char ipv4[4]; unsigned int cidr; } Opt_policy_ipv4; extern void opt_policy_exit(Opt_serv_policy_opts *); extern int opt_policy_init(Opt_serv_opts *, Opt_serv_policy_opts *); extern Opt_serv_policy_opts *opt_policy_make(Opt_serv_opts *); extern int opt_policy_copy(Opt_serv_policy_opts *, const Opt_serv_policy_opts *); extern Opt_serv_policy_opts *opt_policy_find(Opt_serv_opts *, const Conf_parse *, Conf_token *); extern void opt_policy_add(Opt_serv_opts *, Opt_serv_policy_opts *); extern int opt_policy_name_eq(const Conf_parse *, Conf_token *, const Opt_serv_policy_opts *, int *); extern int opt_policy_ipv4_make(Conf_parse *, Conf_token *, unsigned int, struct sockaddr *, int *); extern int opt_policy_ipv4_cidr_eq(Opt_policy_ipv4 *, struct sockaddr *); extern Opt_serv_policy_opts *opt_policy_sc_conf_make(Opt_serv_opts *, const Conf_parse *, const Conf_token *, const Vstr_sect_node *); extern unsigned int opt_policy_sc_conf_parse(Opt_serv_opts *, const Conf_parse *, Conf_token *, Opt_serv_policy_opts **); extern void opt_policy_sc_all_ref_del(Opt_serv_opts *); extern int opt_policy_sc_tst(Conf_parse *, Conf_token *, int *, int (*)(Conf_parse *, Conf_token *, int *, void *), void *); #if !defined(OPT_POLICY_COMPILE_INLINE) # ifdef VSTR_AUTOCONF_NDEBUG # define OPT_POLICY_COMPILE_INLINE 1 # else # define OPT_POLICY_COMPILE_INLINE 0 # endif #endif #if defined(VSTR_AUTOCONF_HAVE_INLINE) && OPT_POLICY_COMPILE_INLINE #ifndef VSTR_AUTOCONF_NDEBUG # define OPT_POLICY__ASSERT ASSERT #else # define OPT_POLICY__ASSERT(x) #endif #define OPT_POLICY__TRUE 1 #define OPT_POLICY__FALSE 0 extern inline int opt_policy_copy(Opt_serv_policy_opts *dst, const Opt_serv_policy_opts *src) { dst->idle_timeout = src->idle_timeout; dst->max_connections = src->max_connections; return (OPT_POLICY__TRUE); } extern inline Opt_serv_policy_opts *opt_policy_find(Opt_serv_opts *beg_opts, const Conf_parse *conf, Conf_token *token) { const Vstr_sect_node *val = conf_token_value(token); Opt_serv_policy_opts *opts = NULL; if (!val) return (NULL); opts = beg_opts->def_policy; if (vstr_cmp_cstr_eq(conf->data, val->pos, val->len, "")) return (opts); while ((opts = opts->next)) { Vstr_base *tmp = opts->policy_name; int cmp = 0; OPT_POLICY__ASSERT(!opts->next || (tmp->len < opts->next->policy_name->len) || ((tmp->len == opts->next->policy_name->len) && vstr_cmp(tmp, 1, tmp->len, opts->next->policy_name, 1, opts->next->policy_name->len) < 0)); if (val->len > tmp->len) continue; if (val->len < tmp->len) break; cmp = vstr_cmp(conf->data, val->pos, val->len, tmp, 1, tmp->len); if (!cmp) return (opts); if (cmp < 0) break; } return (NULL); } extern inline int opt_policy_name_eq(const Conf_parse *conf, Conf_token *token, const Opt_serv_policy_opts *policy, int *matches) { const Vstr_base *tmp = policy->policy_name; CONF_SC_PARSE_TOP_TOKEN_RET(conf, token, OPT_POLICY__FALSE); *matches = conf_token_cmp_val_eq(conf, token, tmp, 1, tmp->len); return (OPT_POLICY__TRUE); } #endif #endif