#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "./include/parse.h"
#include "./include/constr.h"
PROCESS *
AddFirstProcess()
{
PROCESS * pr;
pr=malloc(sizeof(PROCESS));
pr->p_next=NULL;
printf("First process added\n");
return(pr);
}
void
AddProcess(PROCESS * pr)
{
PROCESS *pr1;
pr1=malloc(sizeof(PROCESS));
pr->p_next=pr1;
pr1->p_next=NULL;
printf("Next process added\n");
}
void
DelProcess(PROCESS * pr)
{
unsigned short status;
if (pr->p_next) DelProcess(pr->p_next);
printf("Process %d kill\n",pr->pid);
if(kill(pr->pid,SIGINT)==-1)
{
perror("kill");
}
else waitpid(pr->pid,NULL,0);
free(pr);
}
// Schitaet chislo elementov v svuazannom spiske nachinaya s Plugin*
int
GetCfgNumber(Plugin *pl)
{
int i=0;
while(pl)
{
i++;
pl=pl->p_next;
}
#if DEBUG
printf("Put number %d",i);
#endif
return(i);
}
// Schitaet chislo elementov v svuazannom spiske nachinaya s PluginRecord*
short
GetPutNumber(PutSection *pr)
{
short i=0;
while(pr)
{
i++;
pr=pr->ps_next;
}
#if DEBUG
printf("Put number %d",i);
#endif
return(i);
}
// Schitaet chislo elementov v svuazannom spiske nachinaya s Host*
short
GetCellNumber(Host *h)
{
short i=0;
while(h)
{
i++;
h=h->h_next;
}
return(i);
}
//Vozvrashaet ukazatel' na putnumber ili NULL esli ne sovpadaet cfgname
short *
GetCfgByName(char * name,char * mem)
{
int cfgnum,cfglen,*in;
short cfgnamelen,*sh;
char *ch;
mem+=sizeof(long);//Propustili SHM_LEN i teper' ukazyvaem na cfgnum
// (chislo CFG seczcyi)
in=(int* )mem;
cfgnum=*in;
mem+=sizeof(int);//Ukazyvaet na nachalo sekzcii cfg(cfglen)
while(cfgnum)
{
in=(int*)mem;
cfglen=*in;
ch=mem+sizeof(int);//Ukazyvaet na cfgnamelen
sh=(short*)ch;
ch=mem+sizeof(int)+sizeof(short);//Ukazyvaet na nachlo cfgname
cfgnamelen=*sh;
if(!(strncmp(ch,name,cfgnamelen)))
{
ch=mem+sizeof(int)+sizeof(short)+cfgnamelen+sizeof(CELL_M);
sh=(short*)ch;
return(sh);
}
cfgnum--;
mem+=cfglen;
}
return(NULL);
}
//Vozvrashaet ukazatel' na cellnumber ili NULL esli ne sovpadaet putname
static short cellnum=0;// Schetchik proidennyh Yacheek
short *
GetPutByName(char * name,short * mem)
{
short putnum,putlen;
short putnamelen,*sh;
char *ch,*em;
putnum=*mem;
em=(char*)mem;
em+=sizeof(short);//Ukazyvaet na nachalo sekzcii put(putlen)
while(putnum)
{
sh=(short*)em;
putlen=*sh;
ch=em+sizeof(short);//Ukazyvaet na putnamelen
sh=(short*)ch;
ch=em+2*sizeof(short);//Ukazyvaet na nacahlo putname
putnamelen=*sh;
if(!(strncmp(ch,name,putnamelen)))
{
ch=em+2*sizeof(short)+putnamelen;
sh=(short*)ch;//Ukazyvaet na kol-vo structur CELL_M
cellnum=0;
return(sh);
}
putnum--;
em+=putlen;
}
return(NULL);
}
//Vozvrashaet ukazatel' na n-tyu struct CELL_M pri n-tom vyzove
//ili NULL esli n>=(*num)
CELL_M *
GetCELL_M(short * num)
{
char *ch;
CELL_M * ce;
ch=((char *)(num))+sizeof(short);//Ukazyvaet na pervyu structuru CELL_M
ce=(CELL_M*)ch;
if(cellnum<(*num))
{
ce+=cellnum;
cellnum++;
return (ce);
}
else return(NULL);
}
//Vozvrashaet ukazatel' na statusnuiy yacheiku plugina CELL_M
//Parametry name - imya plugina, mem - nachalo SHM
CELL_M *
GetStatusByName(char * name, char *mem)
{
char* me;
CELL_M * ce;
me=(char *)GetCfgByName(name,mem);
ce=(CELL_M *)(me-sizeof(CELL_M));
return(ce);
}
//Vozvrahsaet parametr, sootvetstvuyishiy StartCounter ili 10 esli
//net takogo parametra v spiske command
CELL
GetStartCounter(Plugin *pl)
{
Command * cmd;
cmd=pl->p_cmd;
while(cmd)
{
if(!strcmp("StartCounter",cmd->c_cmd)) return((CELL)(atoi(cmd->c_value)));
cmd=cmd->c_next;
}
return(10);
}
//Vozvrashaet 1 esli est' "Invisible" v spiske command ili 0
int
GetInvisible(Plugin* pl)
{
Command * cmd;
cmd=pl->p_cmd;
while(cmd)
{
if(!strcmp("Invisible",cmd->c_cmd)) return(1);
cmd=cmd->c_next;
}
return(0);
}
//Vozvrashaet Plugin * esli argument sovpadaet s pl->NameOfCfg
// ili NULL
Plugin*
GetPlugin(char * name,Plugin *pl)
{
while(pl)
{
if(!strcmp(name,pl->NameOfCfg)) return(pl);
pl=pl->p_next;
}
return(NULL);
}
#include "./include/view.h"
int
PrintTime(CELL_M *ce)
{
if ((ce->rate)>86400){ printf("%dd%dh",ce->rate/86400,(ce->rate%86400)/3600);return(0);}
if ((ce->rate)>3600){ printf("%dh%dm",ce->rate/3600,(ce->rate%3600)/60);return(0);}
if ((ce->rate)>60) {printf("%dm%ds",ce->rate/60,ce->rate%60);return(0);}
printf("%dm%ds",ce->rate/60,ce->rate);
return(0);
}
void
PrintOption(char * data)
{
int i,j;
while((i=strlen(data))>0)
{
printf("<OPTION>");
for (j=0;(j<i)&&(j<25);j++)
{
putchar(*data);
data++;
}
printf("\n");
}
}
//Vydaet ukazatel' na resursnuiy zapis' plugina NameOfExec="name" v grafe stattusa="status"
char *
GetData(Plugin *pl, char *name, int status)
{
PutSection *ps;
Host *h;
int i=0;
ps=pl->ps_next;
while(ps&&strcmp(name,ps->ps_name)) ps=ps->ps_next;
if(ps)
{
h=ps->h_next;
while(h&&(i<status)) i++,h=h->h_next;
if(h) return (h->_h_addr);
}
return(0);
}
void
PrintCell(CELL_M *ce,char * addr,Plugin *pl, char *name)
{
char *data;
if(data=GetData(pl,name,ce->status))
{
printf("<FORM><TD WIDTH=150 BGCOLOR=%s>\n",HTML_COLOR[ce->status]);
printf("<SELECT NAME=Choise WIDTH=150>\n");
printf("<FONT SIZE=-1>\n");
PrintOption(data);
PrintTime(ce);
printf("</FONT>\n");
PrintOption(addr);
printf("</SELECT>\n");
printf("</TD></FORM>\n");
}
else
{
printf("<FORM><TD WIDTH=150 BGCOLOR=%s>\n",HTML_COLOR[ce->status]);
printf("<SELECT NAME=Choise WIDTH=150>\n");
printf("<OPTION>Err #%d ",ce->status);
PrintTime(ce);
printf("\n");
PrintOption(addr);
printf("</SELECT>\n");
printf("</TD></FORM>\n");
}
}