Приложение 1: Библиотеки constr и view

Библиотека работы с SHM constr.c



#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);
}

Библиотека раздатчиков view.c


#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");
        	}
       
}