/*- * Copyright (c) 2000-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_cmd.h,v 1.1.4.1 2006/12/15 16:31:21 simon Exp $ */ #ifndef IPA_CMD_H #define IPA_CMD_H #define CMD_NSIZE 30 #define CMD_NALLOC 20 #define RC_STARTUP 0 /* Any startup {} */ #define RC_SHUTDOWN 1 /* Any shutdown {} */ #ifdef WITH_LIMITS struct limit; #endif #ifdef WITH_THRESHOLDS struct threshold; #endif enum { #ifdef WITH_LIMITS WPID_TYPE_LIMIT, #endif #ifdef WITH_SUBLIMITS WPID_TYPE_SUBLIMIT, #endif #ifdef WITH_THRESHOLDS WPID_TYPE_THRESHOLD, #endif WPID_TYPE_NOT_USED }; /* * Wpid ("wait PID") describes one forked process, which runs * a list of commands from some section in background. */ struct wpid { LIST_ENTRY(wpid) hlink; /* All wpids list in one hash bucket. */ pid_t pid; /* PID of background process. */ int type; /* Selector for next union. */ #ifdef WITH_ANY_LIMITS union { # ifdef WITH_LIMITS const struct limit *limit; # endif # ifdef WITH_SUBLIMITS const struct sublimit *sublimit; # endif # ifdef WITH_THRESHOLDS const struct threshold *threshold; # endif } u; #endif /* WITH_ANY_LIMITS */ }; #ifdef WITH_ANY_LIMITS #ifndef WPID_HASH_BUCKETS # define WPID_HASH_BUCKETS 64 /* Must be power of 2. */ #endif LIST_HEAD(wpid_hash, wpid); extern struct wpid_hash wpid_hash[]; #define get_wpid_bucket(pid) ((u_int)(pid) & (WPID_HASH_BUCKETS - 1)) extern void init_wpid_hash(void); extern int wpid_hash_is_empty(void); extern void rem_wpid_from_hash(struct wpid *); #endif /* WITH_ANY_LIMITS */ #define CMD_FREE_STR 0x01 /* Free str buffer. */ #define CMD_FREE_USER 0x02 /* Free user buffer. */ /* * Structure for "exec" parameter. */ struct cmd { STAILQ_ENTRY(cmd) link; /* For list building. */ char *str; /* Command string. */ char *user; /* User name or NULL. */ u_int free_mask; /* CMD_FREE_xxx bits. */ size_t str_size; /* Length of str, including trailing '\0'. */ u_int subst_per_cent; /* Number of "%%" in str. */ u_int subst_rule; /* Number of "%rule%" in str. */ }; /* * All commands in one section, which can contain "exec" parameters. * By default any startup or shutdown section has sync_exec == 1, * any other section has sync_exec == 0. */ struct cmd_list { int sync_exec; /* "sync_exec" parameter. */ STAILQ_HEAD(, cmd) list; /* List of all commands. */ }; /* * rule|rulepat|autorule { startup|shutdown{}} */ struct cmds_rule { int set; /* 1, if startup|shutdown{} section is specified. */ struct cmd_list cmdl; #ifdef WITH_LIMITS struct cmd_list cmdl_if_all_reached; struct cmd_list cmdl_if_all_not_reached; struct cmd_list cmdl_if_any_reached; struct cmd_list cmdl_if_any_not_reached; #endif }; #ifdef WITH_LIMITS /* * limit|sublimit { startup|shutdown{}}} */ struct cmds_limit { int set; /* 1, if startup|shutdown{} section is specified. */ struct cmd_list cmdl; struct cmd_list cmdl_if_reached; struct cmd_list cmdl_if_not_reached; }; #endif extern int global_debug_exec; extern char *shell_path; extern char *shell_path_default; extern char *shell_arg1; extern char *shell_arg1_default; extern ipa_mzone *cmd_mzone; extern ipa_mem_type *m_cmd; extern struct cmd_list cmds_startup; extern struct cmd_list cmds_shutdown; extern const char *const sync_exec_msg[]; extern int setsuppgids(const char *, gid_t); struct rule; extern int exec_cmd_list(const struct rule *, struct wpid *, const struct cmd_list *, const char *, ...) ATTR_FORMAT(printf, 4, 5); extern int exec_cmd_list_cons(const struct cmd_list *, const char *, ...) ATTR_FORMAT(printf, 2, 3); extern void init_cmd_list(struct cmd_list *); extern void init_cmds_rule(struct cmds_rule *); extern void free_cmd_list(struct cmd_list *); extern void set_sync_exec_cmds_rule(struct cmds_rule *); extern int run_cmds(int); extern void free_cmds_rule(struct cmds_rule *); #ifdef WITH_LIMITS extern void init_cmds_limit(struct cmds_limit *); extern void free_cmds_limit(struct cmds_limit *); extern void set_sync_exec_cmds_limit(struct cmds_limit *); #endif struct rule; extern int copy_cmd_list(const struct rule *, struct cmd_list *, const struct cmd_list *); extern int copy_cmds_rule(const struct rule *, struct cmds_rule *, const struct cmds_rule *); #ifdef WITH_LIMITS extern int copy_cmds_limit(const struct rule *, struct cmds_limit *, const struct cmds_limit *); #endif #endif /* !IPA_CMD_H */