/* ******************************************************************************* * 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: /home/cvs/cvsroot/onelan/onelan/src/mplib1/util/watch_parse.c,v $ * $Author: mpoole $ * $Date: 2002/10/07 09:37:30 $ * $Revision: 1.2 $ * Purpose : Generic Program Watchdog * ******************************************************************************* * * Change History * * $Log: watch_parse.c,v $ * Revision 1.2 2002/10/07 09:37:30 mpoole * Initial checkin of mplib1-3.1.0 * * Revision 1.1 2002/10/07 09:37:09 mpoole * Initial checkin of mplib1-3.1.0 * * ******************************************************************************* */ #ident "$Header: /home/cvs/cvsroot/onelan/onelan/src/mplib1/util/watch_parse.c,v 1.2 2002/10/07 09:37:30 mpoole Exp $" /* ------------------------------------------------------------------ Include files ------------------------------------------------------------------ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "watchdog.h" /* ------------------------------------------------------------------ structures / defines ------------------------------------------------------------------ */ static struct match_token active_tokens[] = { { 1, "^TRUE" }, { 1, "^true" }, { 2, "^FALSE" }, { 2, "^false" }, { 0, NULL } }; static struct match_token line_tokens[] = { { 1, "^LEVEL" }, { 1, "^level" }, { 2, "^DAEMON" }, { 2, "^daemon" }, { 3, "^BATCH" }, { 3, "^batch" }, { 0, NULL } }; static struct match_token lvl_tokens[] = { { 1, "^LEVEL" }, { 1, "^level" }, { 2, "^UPPER" }, { 2, "^upper" }, { 3, "^LOWER" }, { 3, "^lower" }, { 4, "^ACTIVE" }, { 4, "^active" }, { 0, NULL } }; enum prg_enums { PE_BATCH=1, PE_GROUP, PE_LEVEL, PE_EXE, PE_PARAMS, PE_PIDFILE, PE_COPIES, PE_ACTIVE, PE_DAEMON, PE_STDERR, PE_STDOUT, PS_ENVIRON, PE_PIDTRACK, PE_STARTUP, PE_SP_LIMIT, PE_SP_HOLD, PE_SP_WINDOW, PE_EXCLUSIVE, PE_RUN_DIR, }; static struct match_token prg_tokens[] = { { PE_BATCH, "^BATCH" }, { PE_BATCH, "^batch" }, { PE_GROUP, "^GROUP" }, { PE_GROUP, "^group" }, { PE_LEVEL, "^LEVEL" }, { PE_LEVEL, "^level" }, { PE_EXE, "^EXE" }, { PE_EXE, "^exe" }, { PE_PARAMS, "^PARAMS" }, { PE_PARAMS, "^params" }, { PE_PARAMS, "^CONFIG" }, { PE_PARAMS, "^config" }, { PE_PIDFILE, "^PIDFILE" }, { PE_PIDFILE, "^pidfile" }, { PE_COPIES, "^COPIES" }, { PE_COPIES, "^copies" }, { PE_ACTIVE, "^ACTIVE" }, { PE_ACTIVE, "^active" }, { PE_DAEMON, "^DAEMON" }, { PE_DAEMON, "^daemon" }, { PE_STDERR,"^STDERR" }, { PE_STDERR,"^stderr" }, { PE_STDOUT,"^STDOUT" }, { PE_STDOUT,"^stdout" }, { PS_ENVIRON,"^ENVIROMENT" }, { PS_ENVIRON,"^enviroment" }, { PE_PIDTRACK,"^PIDTRACK" }, { PE_PIDTRACK,"^pidtrack" }, { PE_STARTUP,"^STARTUP" }, { PE_STARTUP,"^startup" }, { PE_SP_LIMIT,"^SPAWN_LIMIT" }, { PE_SP_LIMIT,"^spawn_limit" }, { PE_SP_HOLD,"^SPAWN_HOLD" }, { PE_SP_HOLD,"^spawn_hold" }, { PE_SP_WINDOW,"^SPAWN_WINDOW" }, { PE_SP_WINDOW,"^spawn_window" }, { PE_EXCLUSIVE,"^EXCLUSIVE" }, { PE_EXCLUSIVE,"^exclusive" }, { PE_RUN_DIR,"^RUN_DIR" }, { PE_RUN_DIR,"^run_dir" }, { 0, NULL } }; static char vol_seps[]=", \t"; static int watch_parse_debug=0; /* ------------------------------------------------------------------ Code starts here ------------------------------------------------------------------ */ int parse_level_tag( struct level_hdr *lptr, char *lbuf ) { char *cp; int lvlk,rv=0; void *tokptr; if (lbuf==NULL) cp=NULL; else cp = mpstrtok( lbuf, &tokptr, vol_seps ); while (cp && (lvlk=match_a_string( cp, lvl_tokens, NULL )) ) { switch( lvlk ) { case 1 : /* level name, ignore, assume already set */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (lptr->key[0]=='\0') { lptr->key[0] = LVL_HDR_C; strcpy( &lptr->key[1], cp ); } break; case 2 : /* upper */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) { lvlk = strtol(cp, NULL, 0 ); if (lptr->lower_level==0 || lptr->lower_level>lvlk) lptr->lower_level = lvlk; lptr->upper_level = lvlk; } break; case 3 : /* lower */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) { lvlk = strtol(cp, NULL, 0 ); if (lptr->upper_level==0 || lptr->upper_levelupper_level = lvlk; lptr->lower_level = lvlk; } break; case 4 : /* active */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) lptr->active = (1==match_a_string( cp, active_tokens, NULL )); break; default : fprintfile(stderr,"did not recognise token <%s>\n", cp ); cp = mpstrtok( NULL, &tokptr, vol_seps ); break; }; cp = mpstrtok( NULL, &tokptr, vol_seps ); }; (void) mpstrtok( NULL, &tokptr, NULL ); return(rv); } int parse_program_tag( struct program_hdr *pptr, char *lbuf ) { char *cp; int lvlk,rv=0; void *tokptr; if (lbuf==NULL) cp=NULL; else cp = mpstrtok( lbuf, &tokptr, vol_seps ); while (cp && (lvlk=match_a_string( cp, prg_tokens, NULL )) ) { switch( lvlk ) { case PE_BATCH : /* program name, ignore, assume already set */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (pptr->key[0]=='\0') { pptr->key[0] = PRG_HDR_BATCH_C; strcpy( &pptr->key[1], cp ); } pptr->prg_name = cp; /* fprintfile(stderr, "Setting prg_name to %s\n", pptr->prg_name );*/ break; case PE_GROUP : /* group */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) pptr->grp_name = cp; break; case PE_LEVEL : /* level */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) { lvlk = strtol(cp, NULL, 0 ); /* fprintf(stderr, "prog level <%s> %d\n", cp, lvlk );*/ pptr->level = lvlk; } /* else*/ /* fprintf(stderr, "no level for prog\n" );*/ break; case PE_EXE : /* exe */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) pptr->exe_name = cp; break; case PE_PARAMS : /* params */ cp = mpstrtok( NULL, &tokptr, "\n" ); /* rest of line is params */ if (cp) pptr->opt_name = cp; break; case PE_PIDFILE : /* pidfile */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) pptr->pid_name = cp; break; case PE_COPIES : /* copies */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) { lvlk = strtol(cp, NULL, 0 ); pptr->copies = lvlk; if (pptr->copies<=0) pptr->copies=1; } break; case PE_ACTIVE : /* active */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) pptr->active = (1==match_a_string( cp, active_tokens, NULL )); break; case PE_DAEMON : /* daemon name, ignore, assume already set */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (pptr->key[0]=='\0') { pptr->key[0] = PRG_HDR_DAEMON_C; strcpy( &pptr->key[1], cp ); } pptr->prg_name = cp; /* fprintfile(stderr, "Setting prg_name to %s\n", pptr->prg_name );*/ break; case PE_STDERR : /* STDERR */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) pptr->err_name = cp; break; case PE_STDOUT : /* STDOUT */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) pptr->out_name = cp; break; case PS_ENVIRON : /* Environment */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) pptr->env_name = cp; break; case PE_PIDTRACK : /* Track by pid */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) pptr->track_by_pid = (1==match_a_string( cp, active_tokens, NULL )); break; case PE_STARTUP : /* Startup timeout */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) { pptr->startup = strtol(cp, NULL, 0 ); if (pptr->startup<0) pptr->startup=0; } break; case PE_SP_LIMIT : /* spawn limit */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) { pptr->sp_limit = strtol(cp, NULL, 0 ); if (pptr->sp_limit<0) pptr->sp_limit=0; } break; case PE_SP_HOLD : /* spawn holdoff */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) { pptr->sp_hold = strtol(cp, NULL, 0 ); if (pptr->sp_hold<0) pptr->sp_hold=0; } break; case PE_SP_WINDOW : /* spawn window */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) { pptr->sp_window = strtol(cp, NULL, 0 ); if (pptr->sp_window<0) pptr->sp_window=0; } break; case PE_EXCLUSIVE : /* exclusive */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) pptr->exclusive = (1==match_a_string( cp, active_tokens, NULL )); break; case PE_RUN_DIR : /* run directory */ cp = mpstrtok( NULL, &tokptr, vol_seps ); if (cp) pptr->run_dir = cp; break; default : fprintfile(stderr,"did not recognise token <%s>\n", cp ); cp = mpstrtok( NULL, &tokptr, vol_seps ); break; }; cp = mpstrtok( NULL, &tokptr, vol_seps ); }; (void) mpstrtok( NULL, &tokptr, NULL ); return(rv); } int parse_this_line( char *lbuf, level_func_t level_func, prog_func_t prog_func, int db_save ) { char *cp,*tagp; int lvlk,rv=0; void *tokptr; watch_parse_debug = get_config_flag("WATCH_PARSE_DEBUG"); if (watch_parse_debug) fprintfile( stderr, "parse_this_line: Check %s\n", lbuf ); cp = mpstrtok( lbuf, &tokptr, vol_seps ); if (cp && (lvlk=match_a_string( cp, line_tokens, NULL )) ) { switch( lvlk ) { case 1 : /* level name */ tagp = mpstrtok( NULL, &tokptr, vol_seps ); if (tagp) { cp=mpstrtok( NULL, &tokptr, "\n" ); rv = (* level_func)( tagp, cp, db_save ); } break; case 2 : /* daemon name */ tagp = mpstrtok( NULL, &tokptr, vol_seps ); if (tagp) { cp=mpstrtok( NULL, &tokptr, "\n" ); if (cp && db_save) cp=strdup( cp ); rv = (* prog_func)( tagp, cp, db_save, PRG_HDR_DAEMON ); } break; case 3 : /* program name */ tagp = mpstrtok( NULL, &tokptr, vol_seps ); if (tagp) { cp=mpstrtok( NULL, &tokptr, "\n" ); if (cp && db_save) cp=strdup( cp ); rv = (* prog_func)( tagp, cp, db_save, PRG_HDR_BATCH ); } break; } }; (void) mpstrtok( NULL, &tokptr, NULL ); return(rv); } int parse_watch_line( char *lbuf ) { int rv; rv = parse_this_line( lbuf, add_this_level, add_this_program, 1 ); return(rv); } /* -- End of File -- */