diff --git a/src/dbtools/Makefile.Unix b/src/dbtools/Makefile.Unix index fdfcac2dd..7b6ddd089 100644 --- a/src/dbtools/Makefile.Unix +++ b/src/dbtools/Makefile.Unix @@ -10,14 +10,14 @@ INC += dbVarSub.h SRCS.c = ../dbVarSub.c dbLoadTemplate_lex.c dbLoadTemplate.c \ dbLoadRecords_lex.c dbLoadRecords.c \ - ../BSlib.c ../PVSserver.c ../rdbapplist.c ../rdbls.c + ../BSlib.c ../PVSserver.c ../rdbapplist.c ../rdbls.c ../ioc_stats.c VAR_OBJS = dbVarSub.o dbLoadTemplate.o dbLoadRecords.o LIBOBJS = BSlib.o LIBNAME = BSlib.a -PROD = subtool dbLoadTemplate rdbls rdbapplist PVSserver +PROD = subtool dbLoadTemplate rdbls rdbapplist PVSserver ioc_stats MAN1 = dbLoadTemplate.1 subtool.1 MAN3 = dbLoadRecords.3 dbLoadTemplate.3 @@ -34,6 +34,9 @@ PVSserver: PVSserver.o BSlib.o rdbls: rdbls.o BSlib.o $(LINK.c) -o $@ $^ $(LDLIBS) +ioc_stats: ioc_stats.o BSlib.o + $(LINK.c) -o $@ $^ $(LDLIBS) + rdbapplist: rdbapplist.o BSlib.o $(LINK.c) -o $@ $^ $(LDLIBS) diff --git a/src/dbtools/Makefile.Vx b/src/dbtools/Makefile.Vx index 54769adb6..1d6e320d6 100644 --- a/src/dbtools/Makefile.Vx +++ b/src/dbtools/Makefile.Vx @@ -5,9 +5,9 @@ YACCOPT = -l LEXOPT = -L SRCS.c = ../dbVarSub.c dbLoadTemplate_lex.c dbLoadTemplate.c \ - dbLoadRecords_lex.c dbLoadRecords.c ../BSlib.c ../PVSvx.c + dbLoadRecords_lex.c dbLoadRecords.c ../BSlib.c ../PVSvx.c ../vx_stats.c ../client_stats.c -LIBOBJS = dbVarSub.o dbLoadTemplate.o dbLoadRecords.o BSlib.o PVSvx.o +LIBOBJS = dbVarSub.o dbLoadTemplate.o dbLoadRecords.o BSlib.o PVSvx.o vx_stats.o client_stats.o LIBNAME = dbSubs @@ -17,6 +17,8 @@ MAN5 = templatefile.5 dbfile.5 include $(TOP)/config/RULES.Vx +USR_CFLAGS = -I../../rsrv -I../../ca + #dbLoadTemplate.o: dbLoadTemplate_lex.c dbLoadTemplate.c #dbLoadRecords.o: dbLoadRecords_lex.c dbLoadRecords.c dbLoadTemplate.o: dbLoadTemplate_lex.c diff --git a/src/dbtools/client_stats.c b/src/dbtools/client_stats.c new file mode 100644 index 000000000..ecb88f1b9 --- /dev/null +++ b/src/dbtools/client_stats.c @@ -0,0 +1,66 @@ + +/* + You must run PVSstart() in your vxWorks startup script before these + functions can be used. + + Just ld() the object file for this code in your vxWorks startup script. + + Services added in this file: + PVS_MemStats - Send the bytes free and allocated to the requestor. + PVS_ClientStats - Send a CA client statistics summary report to + the requestor. Includes host name, user id, number of channels + in use. + PVS_TaskList - Send a report of all the tasks in the IOC, along + with there state and priority. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include /* sucks, don't it */ + +/* required for client stat section */ +#include +#include +#include +#include +#include + +#include "PVS.h" + +void PVS_ClientStats(BS* bs) +{ + int len; + char line[120]; + char* ptr; + struct client *pclient; + + /* report columns: + client_host_name client_login_id number_of_channels + */ + + LOCK_CLIENTQ; + pclient = (struct client *) ellFirst(&clientQ); + while (pclient) + { + sprintf(line,"%s %s %d\n", + pclient->pHostName, pclient->pUserName, ellCount(&pclient->addrq)); + len=strlen(line)+1; + + if(BSsendHeader(bs,PVS_Data,len)<0) + printf("PVSserver: data cmd failed\n"); + else + { + if(BSsendData(bs,line,len)<0) + printf("PVSserver: data send failed\n"); + } + pclient = (struct client *) ellNext(&pclient->node); + } + UNLOCK_CLIENTQ; + BSsendHeader(bs,BS_Done,0); +} + diff --git a/src/dbtools/ioc_stats.c b/src/dbtools/ioc_stats.c new file mode 100644 index 000000000..fa08a4623 --- /dev/null +++ b/src/dbtools/ioc_stats.c @@ -0,0 +1,99 @@ + +#include "PVS.h" + +#include +#include +#include +#include + +static int read_data(BSDATA* info,char* service_name); + +int main(int argc,char** argv) +{ + BSDATA info; + int rc; + + if(argc<3) + { + fprintf(stderr,"usage: %s IOC-name service-name\n",argv[0]); + return -1; + } + + BSsetAddress(&info,argv[1]); + rc=read_data(&info,argv[2]); + if(rc<0) fprintf(stderr,"read of data failed horribly\n"); + return 0; +} + +static int read_data(BSDATA* info,char* sname) +{ + BS* bs; + int verb,size,done,len,i,port,rsize; + char* buffer; + char ip_from[40]; + FILE* fd; + + BSgetAddressPort(info,ip_from,&port); + BSsetPort(info,PVS_TCP_PORT); + done=0; + rsize=strlen(sname)+1; + fd=stdout; + + if((bs=BSipOpenData(info))==NULL) + { + fprintf(stderr,"Open of socket to IOC failed\n"); + return -1; + } + + if(BSsendHeader(bs,9999,rsize)<0) + { + fprintf(stderr,"Command send failed\n"); + return -1; + } + if(rsize>0) + { + if(BSsendData(bs,sname,rsize)<0) + { + fprintf(stderr,"send of command name failed\n"); + return -1; + } + } + + buffer=(char*)malloc(PVS_TRANSFER_SIZE+2); + + while(done==0) + { + if(BSreceiveHeader(bs,&verb,&size)<0) + { + fprintf(stderr,"Receive header failed\n"); + done=-1; + } + else + { + switch(verb) + { + case PVS_Data: /* read a block of names */ + if((len=BSreceiveData(bs,buffer,size))<0) + fprintf(stderr,"Receive data failed\n"); + else + { + /* buffer[len]='\n'; */ + buffer[len+1]='\0'; + fputs(buffer,fd); + } + break; + case BS_Done: /* transfers complete */ + BSclose(bs); + done=-1; + break; + default: + if(size>0) done=-1; + break; + } + } + } + free(buffer); + return 0; +} + + diff --git a/src/dbtools/vx_stats.c b/src/dbtools/vx_stats.c new file mode 100644 index 000000000..0158474d4 --- /dev/null +++ b/src/dbtools/vx_stats.c @@ -0,0 +1,150 @@ + +/* + You must run PVSstart() in your vxWorks startup script before these + functions can be used. + + Just ld() the object file for this code in your vxWorks startup script. + + Services added in this file: + PVS_MemStats - Send the bytes free and allocated to the requestor. + PVS_ClientStats - Send a CA client statistics summary report to + the requestor. Includes host name, user id, number of channels + in use. + PVS_TaskList - Send a report of all the tasks in the IOC, along + with there state and priority. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include /* sucks, don't it */ + +/* required for client stat section */ +#include +#include +#include +#include + +#include "PVS.h" + +#define MAX_TASK 100 + +extern struct dbBase *pdbbase; +static int* task_list=NULL; + +void PVS_MemStats(BS* bs) +{ + int len; + unsigned long b_free, b_alloc; + char line[100]; + + b_free=2*(memSysPartId->totalWords-memSysPartId->curWordsAllocated); + b_alloc=2*memSysPartId->curWordsAllocated; + + /* report columns: + bytes_free bytes allocated + */ + + sprintf(line,"%lu %lu\n",b_free,b_alloc); + len=strlen(line)+1; + + if(BSsendHeader(bs,PVS_Data,len)<0) + printf("PVSserver: data cmd failed\n"); + else + { + if(BSsendData(bs,line,len)<0) + printf("PVSserver: data send failed\n"); + } + BSsendHeader(bs,BS_Done,0); +} + +void PVS_TaskList(BS* bs) +{ + int len,i,tot,pri; + char line[100]; + char state[30]; + char* name; + + if(task_list==NULL) + task_list=(int*)malloc(sizeof(int)*MAX_TASK); + + if((tot=taskIdListGet(task_list,MAX_TASK))==0) + { + BSsendHeader(bs,BS_Done,0); + return; + } + + /* report columns: + name_of_task state_of_task priority of task + */ + + for(i=0;i, value=<%s>\n",name,value); + } + } + break; + default: + fprintf(stderr,"PVS_FieldList(): Unknown packet received\n"); + break; + default: + } + } + BSsendHeader(bs,BS_Done,0); +} +#endif