#ifndef MPLIB1_WATCHDOG_H #define MPLIB1_WATCHDOG_H /* ******************************************************************************* * Copyright (c) 1997 Martin Poole * ******************************************************************************* ** ** WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! ** ** Any changes to be made to this file should first be checked with ** mplib1 source control for library integrity. ** ** mplib1 source control can be reached at mplib1@quatermass.co.uk ** * * $Source$ * $Author$ * $Date$ * $Revision$ * ******************************************************************************* * * Change History * * $Log$ * ******************************************************************************* */ #ident "$Header$" #ifdef CXREF #include #include #endif #ifndef MPLIB1_CONFIG #include #endif #ifndef MPLIB1_DL_LIST #include #endif #ifndef MPLIB1_BPO_LOCK #include #endif #ifndef MPLIB1_BPO_LIST #include #endif #ifndef MPLIB1_BPO_INIT #include #endif /* ------------------------------------------------------------------ defines ------------------------------------------------------------------ */ #define WATCH_CTRL_Q "Watchdog Control Queue" #define CTL_BUF_SZ 200 #define CTL_REP_SZ 200 /* ------------------------------------------------------------------ structures ------------------------------------------------------------------ */ #define PRG_HDR_DAEMON BIT(0) #define PRG_HDR_BATCH BIT(1) #define PRG_HDR_DAEMON_C 'D' #define PRG_HDR_BATCH_C 'B' #define LVL_HDR_C 'L' struct program_hdr { dl_Node_t prg_Node; /* First the values inherited from the control file */ char *prg_name; char *grp_name; char *exe_name; char *opt_name; char *pid_name; char *env_name; char *out_name; char *err_name; int ptype; int level; int copies; int active; int exclusive; int track_by_pid; int startup; /* Startup timeout */ int sp_limit; /* spawn limit source */ int sp_hold; /* spawn hold source */ int sp_window; /* spawn window source */ /* Now the derived values */ time_t pid_f_time; int lvl_exclude; /* Increment for each level based exclude */ int spawn_cnt; /* Count of unsuccessful spawns */ time_t spawn_time; /* backoff timer */ time_t spawn_window; /* when did we last try */ dl_List_t mem_bits; dl_List_t running_pids; /* Parameters for subfunctions */ int param1; int param2; void *ptr1; void *ptr2; /* And the search name buffer */ char key[2]; }; struct level_hdr { dl_Node_t lvl_hdr; int lower_level; int upper_level; int active; char key[2]; }; struct pid_track { dl_Node_t pid_node; pid_t the_pid; char pid_str[PID_STR_LEN]; int starting; int dying; time_t expire; struct program_hdr *pptr; int track_by_pid; }; struct watchdog_ctrl_msg { struct bpo_Q_Mesg ctrl_msg; char comm_buf[CTL_BUF_SZ]; char rep_buf[CTL_REP_SZ]; }; typedef int (* level_func_t)(const char *, char *, int); typedef int (* prog_func_t)(const char *, char *, int, int); typedef void (*prog_walk_t)(struct program_hdr *, void *param); typedef void (*level_walk_t)(struct level_hdr *, void *param); /* ------------------------------------------------------------------ function definitions ------------------------------------------------------------------ */ extern int get_default_int( int first_val, const char *def_name, int def_val ); extern int parse_level_tag( struct level_hdr *lptr, char *lbuf ); extern int parse_program_tag( struct program_hdr *pptr, char *lbuf ); extern int parse_this_line( char *lbuf, level_func_t level_func, prog_func_t prog_func, int db_save ); extern int parse_watch_line( char *lbuf ); extern struct program_hdr *find_program_hdr( const char *name ); extern struct level_hdr *find_level_hdr( const char *name ); extern int close_job_file( void ); extern int open_job_file( void ); extern int read_job_file( void ); extern int dump_jobs( FILE *fp ); extern void free_level( struct level_hdr *lptr ); extern void free_program( struct program_hdr *pptr ); extern size_t gen_level_line( char *obuf, struct level_hdr *lptr ); extern int print_lvl_hdr( struct level_hdr *lptr, FILE *fp ); extern int save_lvl_hdr( struct level_hdr *lptr ); extern int delete_lvl_hdr( struct level_hdr *lptr ); extern size_t gen_program_line( char *line, struct program_hdr *pptr ); extern int print_prg_hdr( struct program_hdr *pptr, FILE *fp ); extern int save_prg_hdr( struct program_hdr *pptr ); extern int delete_prg_hdr( struct program_hdr *pptr ); extern int add_this_program( const char *prg_name, char *prg_line, int db_save, int p_type ); extern int add_this_level( const char *level_name, char *level_line, int db_save ); extern struct level_hdr * find_level_hdr( const char *name ); extern struct program_hdr * find_program_hdr( const char *name ); extern int level_applies_to_program( struct level_hdr *lptr, struct program_hdr *pptr ); extern int apply_levels_to_program( struct program_hdr *pptr ); extern int set_all_program_levels( void ); extern int walk_all_programs( prog_walk_t pfunc, void *param ); extern int walk_all_levels( level_walk_t pfunc, void *param ); extern int walk_all_programs_in_level( struct level_hdr *lptr, prog_walk_t pfunc, void *param ); extern int kill_current_instances( struct program_hdr *pptr ); extern int pid_alive( pid_t pid ); extern int being_killed( pid_t pid ); extern int kill_pid( pid_t thispid, int in_shared, FILE *fp ); extern int check_kills( FILE *fp ); extern struct pid_track * alloc_pid_track( struct program_hdr *pptr, int exp_time ); extern int prog_track( const void *hint ); extern int count_all_starting( const void *hint ); extern int start_this_program( int nbr_to_start, struct program_hdr *pptr, const char *env_name, const char *out_name, const char *err_name, int exp_time, int track_pid ); extern void start_some_program( struct program_hdr *pptr, int copies ); extern int read_file_into_db( const char *fname ); extern int dump_db_to_file( const char *fname ); extern int exclude_named_level( const char *lvl_nm ); extern int create_watch_queues( const void *comms_hint ); extern int delete_watch_queues( const void *comms_hint ); extern int watch_ctrl( const void *comms_hint ); extern int lock_watch_lock( void ); extern int watchdog_main_loop( const void *comms_hint ); extern void do_cleanup( const void *hint, int force ); #endif /* -- End of File -- */