/*- * Copyright (c) 2003 Andrey Simonenko * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)$Id: ipa_limits.h,v 1.1.4.1 2007/02/17 09:21:54 simon Exp $ */ #ifndef IPA_LIMITS_H #define IPA_LIMITS_H #ifdef WITH_LIMITS #define IS_REACHED(x) (x->is_reached) #define IS_NOTREACHED(x) (!x->is_reached) #ifndef LIMIT_NSIZE # define LIMIT_NSIZE 30 #endif #ifndef LIMIT_NALLOC # define LIMIT_NALLOC 20 #endif #ifdef WITH_SUBLIMITS #ifndef SUBLIMIT_NSIZE # define SUBLIMIT_NSIZE LIMIT_NSIZE #endif #ifndef SUBLIMIT_NALLOC # define SUBLIMIT_NALLOC LIMIT_NALLOC #endif struct rule; /* * limit { sublimit {}} section. */ struct sublimit { STAILQ_ENTRY(sublimit) link; /* Link for list of sublimits. */ char *sublimit_name; /* sublimit string. */ uint64_t lim; /* sublimit */ u_int lim_per_cent; /* sublimit if it is xx%. */ u_int cnt_type; /* Type of the "sublimit" parameter's argument. */ struct cmd_list reach; /* sublimit { reach {}} */ struct cmds_limit rc[2]; /* sublimit { startup|shutdown {}} */ struct wpid wpid; /* Sublimit's wpid structure. */ int is_reached; /* 1, if sublimit is reached. */ struct limit *limit; /* Pointer to sublimit's limit. */ }; extern ipa_mzone *sublimit_mzone; extern int reach_sublimit(const struct rule *, const struct limit *, struct sublimit *); extern void init_cmds_in_sublimit(struct sublimit *); #endif /* WITH_SUBLIMITS */ /* * limit { expire {}} section. */ struct expire { struct texp expire; /* expire { expire } */ struct cmd_list cmdl; /* "exec" parameters. */ }; /* * limit { restart {}} section. */ struct restart { struct texp restart; /* restart { restart } */ struct cmd_list cmdl; /* "exec" parameters. */ }; /* * rule { limit {}} section. */ struct limit { STAILQ_ENTRY(limit) link; /* Link for list of limits. */ char *limit_name; /* Name of this limit. */ char *limit_info; /* limit { info } */ u_int limitno; /* Order number of this limit in its rule. */ uint64_t lim; /* limit { limit } */ uint64_t cnt; /* Counter. */ uint64_t cnt_neg; /* Negative counter. */ u_int cnt_type; /* Type of the "limit" parameter's argument. */ int load_limit; /* limit { load_limit } */ struct restart restart; /* limit { restart {}} */ struct cmd_list reach; /* limit { reach {}} */ struct expire expire; /* limit { expire {}} */ const struct worktime *worktime;/* limit { worktime } */ int is_active; /* [IN]ACTIVE_FLAG */ const struct db_list *db_list; /* limit { db_list } */ struct cmds_limit rc[2]; /* limit { startup|shutdown {}} */ #ifdef WITH_SUBLIMITS STAILQ_HEAD(, sublimit) sublimits; /* limit { sublimit {}} */ #endif struct wpid wpid; /* Limit's wpid structure. */ int is_reached; /* 1, if limit is reached. */ ipa_tm event_tm; /* Exact time when to check some limit's event. */ u_int event_sec; /* Time when to check some limit's event. */ u_int event_date_set; /* The same as in ipa_limit_state. */ ipa_tm event_date[IPA_LIMIT_EVENT_NUM]; /* The same as in ipa_limit_state. */ const struct rule *rule; /* Pointer to limit's rule. */ }; /* * List of all limits in one rule. */ STAILQ_HEAD(limits_list, limit); extern const char *const limit_event_msg[]; extern int global_debug_limit; extern int global_debug_limit_init; extern int global_load_limit; extern ipa_mzone *limit_mzone; extern int add_chunk_to_limit(const struct rule *, struct limit *, const uint64_t *); extern int add_chunk_to_limits(const struct rule *, const uint64_t *); extern int sub_chunk_from_limit(const struct rule *, struct limit *, const uint64_t *); extern int sub_chunk_from_limits(const struct rule *, const uint64_t *); extern int init_limits(const struct rule *); extern int check_limits_events(const struct rule *, u_int *); extern void limit_set_event_sec(struct limit *); extern int limits_newday(struct rule *); extern int restart_limit(const struct rule *, struct limit *); extern int reach_limit(const struct rule *, struct limit *); extern int expire_limit(const struct rule *, struct limit *); #define set_limit_inactive(r, l) mod_set_limit_active((r), (l), INACTIVE_FLAG) extern int mod_set_limit_active(const struct rule *, struct limit *, int); extern int copy_limits(struct rule *, const struct limits_list *, int); extern void free_limits(u_int, struct limits_list *, int); extern void init_cmds_in_limit(struct limit *); extern void set_sync_exec_in_limit(struct limit *); extern struct limit *limit_by_name(const struct rule *, const char *); #endif /* WITH_LIMITS */ extern u_int nstatlimits; extern u_int ndynlimits; extern u_int nstatsublimits; extern u_int ndynsublimits; #endif /* !IPA_LIMITS_H */