diff --git a/src/as/asCa.c b/src/as/asCa.c index 13a20303a..e8facb0c6 100644 --- a/src/as/asCa.c +++ b/src/as/asCa.c @@ -61,7 +61,7 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000). #include #include #include -#include +#include #include #include #include @@ -85,7 +85,6 @@ static void connectCallback(struct connection_handler_args cha) ASGINP *pasginp; ASG *pasg; CAPVT *pcapvt; - enum channel_state state; int Ilocked=FALSE; if(!caInitializing) { @@ -107,8 +106,6 @@ static void eventCallback(struct event_handler_args eha) ASGINP *pasginp; CAPVT *pcapvt; ASG *pasg; - int inpOk=TRUE; - enum channel_state state; struct dbr_sts_double *pdata = eha.dbr; int Ilocked=FALSE; @@ -141,15 +138,18 @@ static void asCaTask(void) taskwdInsert(taskIdSelf(),NULL,NULL); SEVCHK(ca_task_initialize(),"ca_task_initialize"); caInitializing = TRUE; + FASTLOCK(&asLock); pasg = (ASG *)ellFirst(&pasbase->asgList); while(pasg) { pasginp = (ASGINP *)ellFirst(&pasg->inpList); while(pasginp) { pasg->inpBad |= (1<inpIndex); pcapvt = pasginp->capvt = asCalloc(1,sizeof(CAPVT)); + /*Note calls connectCallback immediately called for local Pvs*/ SEVCHK(ca_build_and_connect(pasginp->inp,TYPENOTCONN,0, &pcapvt->chid,0,connectCallback,pasginp), "ca_build_and_connect"); + /*Note calls eventCallback immediately called for local Pvs*/ SEVCHK(ca_add_event(DBR_STS_DOUBLE,pcapvt->chid, eventCallback,pasginp,&pcapvt->evid), "ca_add_event"); @@ -157,7 +157,6 @@ static void asCaTask(void) } pasg = (ASG *)ellNext((ELLNODE *)pasg); } - FASTLOCK(&asLock); asComputeAllAsg(); caInitializing = FALSE; FASTUNLOCK(&asLock); @@ -167,7 +166,7 @@ static void asCaTask(void) void asCaStart(void) { - taskid = taskSpawn("asCa",CA_CLIENT_PRI-1,VX_FP_TASK,CA_CLIENT_STACK, + taskid = taskSpawn("asCaTask",CA_CLIENT_PRI-1,VX_FP_TASK,CA_CLIENT_STACK, (FUNCPTR)asCaTask,0,0,0,0,0,0,0,0,0,0); if(taskid==ERROR) { errMessage(0,"asCaStart: taskSpawn Failure\n"); @@ -180,7 +179,6 @@ void asCaStop(void) { ASG *pasg; ASGINP *pasginp; - CAPVT *pcapvt; STATUS status; if(taskid==0 || taskid==ERROR) return; diff --git a/src/as/asDbLib.c b/src/as/asDbLib.c index bf7cef4f2..eae09ca1b 100644 --- a/src/as/asDbLib.c +++ b/src/as/asDbLib.c @@ -158,6 +158,7 @@ static void asInitTask(ASDBCALLBACK *pcallback) FASTLOCKINIT(&asLock); asLockInit = FALSE; } + if(asActive)asCaStop(); FASTLOCK(&asLock); my_buffer = calloc(1,BUF_SIZE); my_buffer_ptr = my_buffer; @@ -177,25 +178,23 @@ static void asInitTask(ASDBCALLBACK *pcallback) status = asInitialize(my_yyinput); if(fclose(stream)==EOF) errMessage(0,"asInit fclose failure"); free((void *)my_buffer); - if(!status) { - asCaStop(); + if(asActive) { asDbAddRecords(); asCaStart(); } FASTUNLOCK(&asLock); + taskwdRemove(taskIdSelf()); + initTaskId = 0; if(pcallback) { pcallback->status = status; callbackRequest(&pcallback->callback); } - taskwdRemove(taskIdSelf()); - initTaskId = 0; status = taskDelete(taskIdSelf()); if(status!=OK) errMessage(0,"asInitTask: taskDelete Failure"); } int asInit(ASDBCALLBACK *pcallback) { - long status; if(!pacf) return(0); if(initTaskId) { @@ -230,7 +229,7 @@ static void myCallback(CALLBACK *pcallback) prset=(struct rset *)(precord->rset); precord->val = 0.0; if(pasdbcallback->status) { - recGblSetSevr(precord,READ_ALARM,INVALID_ALARM); + recGblSetSevr(precord,READ_ALARM,precord->brsv); recGblRecordError(pasdbcallback->status,precord,"asInit Failed"); } dbScanLock((struct dbCommon *)precord); @@ -317,7 +316,6 @@ int astac(char *pname,char *user,char *location) return(0); } -static char *asAccessName[] = {"NONE","READ","WRITE"}; static void myMemberCallback(ASMEMBERPVT memPvt) { struct dbCommon *precord; @@ -343,18 +341,20 @@ int aspuag(char *uagname) return(0); } -int asplag(char *lagname) +int asphag(char *hagname) { FASTLOCK(&asLock); - asDumpLag(lagname); + asDumpHag(hagname); FASTUNLOCK(&asLock); + return(0); } -int asplev(char *asgname) +int asprules(char *asgname) { FASTLOCK(&asLock); - asDumpLev(asgname); + asDumpRules(asgname); FASTUNLOCK(&asLock); + return(0); } int aspmem(char *asgname,int clients) @@ -362,4 +362,5 @@ int aspmem(char *asgname,int clients) FASTLOCK(&asLock); asDumpMem(asgname,myMemberCallback,clients); FASTUNLOCK(&asLock); + return(0); } diff --git a/src/as/asLib.y b/src/as/asLib.y index ca1e0eb90..b41dcb3a8 100644 --- a/src/as/asLib.y +++ b/src/as/asLib.y @@ -6,14 +6,14 @@ static int myParse(); static int yyFailed = FALSE; static int line_num=1; static UAG *yyUag=NULL; -static LAG *yyLag=NULL; +static HAG *yyHag=NULL; static ASG *yyAsg=NULL; -static ASGLEVEL *yyAsgLevel=NULL; +static ASGRULE *yyAsgRule=NULL; %} %start asconfig -%token tokenUAG tokenLAG tokenASG tokenLEVEL tokenCALC +%token tokenUAG tokenHAG tokenASG tokenRULE tokenCALC %token tokenINP %token tokenINTEGER %token tokenNAME tokenPVNAME tokenSTRING @@ -33,8 +33,8 @@ asconfig: asconfig asconfig_item asconfig_item: tokenUAG uag_head uag_body | tokenUAG uag_head - | tokenLAG lag_head lag_body - | tokenLAG lag_head + | tokenHAG hag_head hag_body + | tokenHAG hag_head | tokenASG asg_head asg_body | tokenASG asg_head ; @@ -70,28 +70,28 @@ uag_user_list_name: tokenNAME } ; -lag_head: '(' tokenNAME ')' +hag_head: '(' tokenNAME ')' { - yyLag = asLagAdd($2); - if(!yyLag) yyerror($2); + yyHag = asHagAdd($2); + if(!yyHag) yyerror($2); free((void *)$2); } ; -lag_body: '{' lag_user_list '}' +hag_body: '{' hag_user_list '}' ; -lag_user_list: lag_user_list ',' lag_user_list_name - | lag_user_list_name +hag_user_list: hag_user_list ',' hag_user_list_name + | hag_user_list_name ; -lag_user_list_name: tokenNAME +hag_user_list_name: tokenNAME { long status; - status = asLagAddLocation(yyLag,$1); + status = asHagAddHost(yyHag,$1); if(status) { - errMessage(status,"Error while adding LAG"); + errMessage(status,"Error while adding HAG"); yyerror($1); } free((void *)$1); @@ -113,7 +113,7 @@ asg_body: '{' asg_body_list '}' asg_body_list: asg_body_list asg_body_item | asg_body_item -asg_body_item: inp_config | level_config +asg_body_item: inp_config | rule_config ; inp_config: tokenINP '(' inp_body ')' @@ -132,10 +132,10 @@ inp_config: tokenINP '(' inp_body ')' inp_body: tokenNAME | tokenPVNAME ; -level_config: tokenLEVEL level_head level_body - | tokenLEVEL level_head +rule_config: tokenRULE rule_head rule_body + | tokenRULE rule_head -level_head: '(' tokenINTEGER ',' tokenNAME ')' +rule_head: '(' tokenINTEGER ',' tokenNAME ')' { asAccessRights rights; @@ -149,26 +149,26 @@ level_head: '(' tokenINTEGER ',' tokenNAME ')' yyerror("Illegal access type"); rights = asNOACCESS; } - yyAsgLevel = asAsgAddLevel(yyAsg,rights,$2); + yyAsgRule = asAsgAddRule(yyAsg,rights,$2); free((void *)$4); } ; -level_body: '{' level_list '}' +rule_body: '{' rule_list '}' ; -level_list: level_list level_list_item - | level_list_item +rule_list: rule_list rule_list_item + | rule_list_item ; -level_list_item: tokenUAG '(' level_uag_list ')' - | tokenLAG '(' level_lag_list ')' +rule_list_item: tokenUAG '(' rule_uag_list ')' + | tokenHAG '(' rule_hag_list ')' | tokenCALC '(' tokenSTRING ')' { long status; - status = asAsgLevelCalc(yyAsgLevel,$3); + status = asAsgRuleCalc(yyAsgRule,$3); if(status){ errMessage(status,$3); yyerror("CALC failure"); @@ -177,15 +177,15 @@ level_list_item: tokenUAG '(' level_uag_list ')' } ; -level_uag_list: level_uag_list ',' level_uag_list_name - | level_uag_list_name +rule_uag_list: rule_uag_list ',' rule_uag_list_name + | rule_uag_list_name ; -level_uag_list_name: tokenNAME +rule_uag_list_name: tokenNAME { long status; - status = asAsgLevelUagAdd(yyAsgLevel,$1); + status = asAsgRuleUagAdd(yyAsgRule,$1); if(status) { errMessage(status,"Error while adding UAG"); yyerror($1); @@ -194,17 +194,17 @@ level_uag_list_name: tokenNAME } ; -level_lag_list: level_lag_list ',' level_lag_list_name - | level_lag_list_name +rule_hag_list: rule_hag_list ',' rule_hag_list_name + | rule_hag_list_name ; -level_lag_list_name: tokenNAME +rule_hag_list_name: tokenNAME { long status; - status = asAsgLevelLagAdd(yyAsgLevel,$1); + status = asAsgRuleHagAdd(yyAsgRule,$1); if(status) { - errMessage(status,"Error while adding LAG"); + errMessage(status,"Error while adding HAG"); yyerror($1); } free((void *)$1); diff --git a/src/as/asLibRoutines.c b/src/as/asLibRoutines.c index 9676e3a63..d0a6a9ea3 100644 --- a/src/as/asLibRoutines.c +++ b/src/as/asLibRoutines.c @@ -79,14 +79,14 @@ long postfix(char *pinfix, char *ppostfix,short *perror); static void asFreeAll(ASBASE *pasbase); static UAG *asUagAdd(char *uagName); static long asUagAddUser(UAG *puag,char *user); -static LAG *asLagAdd(char *lagName); -static long asLagAddLocation(LAG *plag,char *location); +static HAG *asHagAdd(char *hagName); +static long asHagAddHost(HAG *phag,char *host); static ASG *asAsgAdd(char *asgName); static long asAsgAddInp(ASG *pasg,char *inp,int inpIndex); -static ASGLEVEL *asAsgAddLevel(ASG *pasg,asAccessRights access,int level); -static long asAsgLevelUagAdd(ASGLEVEL *pasglevel,char *name); -static long asAsgLevelLagAdd(ASGLEVEL *pasglevel,char *name); -static long asAsgLevelCalc(ASGLEVEL *pasglevel,char *calc); +static ASGRULE *asAsgAddRule(ASG *pasg,asAccessRights access,int level); +static long asAsgRuleUagAdd(ASGRULE *pasgrule,char *name); +static long asAsgRuleHagAdd(ASGRULE *pasgrule,char *name); +static long asAsgRuleCalc(ASGRULE *pasgrule,char *calc); long asInitialize(ASINPUTFUNCPTR inputfunction) { @@ -96,13 +96,13 @@ long asInitialize(ASINPUTFUNCPTR inputfunction) GPHENTRY *pgphentry; UAG *puag; UAGNAME *puagname; - LAG *plag; - LAGNAME *plagname; + HAG *phag; + HAGNAME *phagname; pasbaseold = pasbase; pasbase = asCalloc(1,sizeof(ASBASE)); ellInit(&pasbase->uagList); - ellInit(&pasbase->lagList); + ellInit(&pasbase->hagList); ellInit(&pasbase->asgList); asAsgAdd(DEFAULT); status = myParse(inputfunction); @@ -118,7 +118,7 @@ long asInitialize(ASINPUTFUNCPTR inputfunction) pasg = (ASG *)ellNext((ELLNODE *)pasg); } gphInitPvt(&pasbase->phash); - /*Hash each uagname and each lagname*/ + /*Hash each uagname and each hagname*/ puag = (UAG *)ellFirst(&pasbase->uagList); while(puag) { puagname = (UAGNAME *)ellFirst(&puag->list); @@ -129,15 +129,15 @@ long asInitialize(ASINPUTFUNCPTR inputfunction) } puag = (UAG *)ellNext((ELLNODE *)puag); } - plag = (LAG *)ellFirst(&pasbase->lagList); - while(plag) { - plagname = (LAGNAME *)ellFirst(&plag->list); - while(plagname) { - pgphentry = gphAdd(pasbase->phash,plagname->location,plag); + phag = (HAG *)ellFirst(&pasbase->hagList); + while(phag) { + phagname = (HAGNAME *)ellFirst(&phag->list); + while(phagname) { + pgphentry = gphAdd(pasbase->phash,phagname->host,phag); if(!pgphentry) errMessage(-1,"asInitialize: gphAdd logic error"); - plagname = (LAGNAME *)ellNext((ELLNODE *)plagname); + phagname = (HAGNAME *)ellNext((ELLNODE *)phagname); } - plag = (LAG *)ellNext((ELLNODE *)plag); + phag = (HAG *)ellNext((ELLNODE *)phag); } asActive = TRUE; if(pasbaseold) { @@ -165,8 +165,6 @@ long asAddMember(ASMEMBERPVT *pasMemberPvt,char *asgName) { ASGMEMBER *pasgmember; ASG *pgroup; - ASGCLIENT *pclient; - long status; if(!asActive) return(0); if(*pasMemberPvt) { @@ -258,7 +256,7 @@ void asPutMemberPvt(ASMEMBERPVT asMemberPvt,void *userPvt) } long asAddClient(ASCLIENTPVT *pasClientPvt,ASMEMBERPVT asMemberPvt, - int asl,char *user,char *location) + int asl,char *user,char *host) { ASGMEMBER *pasmember = asMemberPvt; ASGCLIENT *pasclient; @@ -269,7 +267,7 @@ long asAddClient(ASCLIENTPVT *pasClientPvt,ASMEMBERPVT asMemberPvt, pasclient->pasgMember = asMemberPvt; pasclient->level = asl; pasclient->user = user; - pasclient->location = location; + pasclient->host = host; #ifdef vxWorks FASTLOCK(&asLock); #endif @@ -281,7 +279,7 @@ long asAddClient(ASCLIENTPVT *pasClientPvt,ASMEMBERPVT asMemberPvt, return(status); } -long asChangeClient(ASCLIENTPVT asClientPvt,int asl,char *user,char *location) +long asChangeClient(ASCLIENTPVT asClientPvt,int asl,char *user,char *host) { ASGCLIENT *pasclient = asClientPvt; long status; @@ -289,7 +287,7 @@ long asChangeClient(ASCLIENTPVT asClientPvt,int asl,char *user,char *location) if(!asActive) return(0); pasclient->level = asl; pasclient->user = user; - pasclient->location = location; + pasclient->host = host; #ifdef vxWorks FASTLOCK(&asLock); #endif @@ -366,26 +364,26 @@ long asComputeAllAsg(void) long asComputeAsg(ASG *pasg) { - ASGLEVEL *pasglevel; + ASGRULE *pasgrule; ASGMEMBER *pasgmember; ASGCLIENT *pasgclient; if(!asActive) return(0); - pasglevel = (ASGLEVEL *)ellFirst(&pasg->levelList); - while(pasglevel) { + pasgrule = (ASGRULE *)ellFirst(&pasg->ruleList); + while(pasgrule) { double result; long status; - if(pasglevel->calc && (pasg->inpChanged & pasglevel->inpUsed)) { - status = calcPerform(pasg->pavalue,&result,pasglevel->rpcl); + if(pasgrule->calc && (pasg->inpChanged & pasgrule->inpUsed)) { + status = calcPerform(pasg->pavalue,&result,pasgrule->rpcl); if(status) { - pasglevel->result = 0; + pasgrule->result = 0; errMessage(status,"asComputeAsg"); } else { - pasglevel->result = ((result>.99) && (result<1.01)) ? 1 : 0; + pasgrule->result = ((result>.99) && (result<1.01)) ? 1 : 0; } } - pasglevel = (ASGLEVEL *)ellNext((ELLNODE *)pasglevel); + pasgrule = (ASGRULE *)ellNext((ELLNODE *)pasgrule); } pasg->inpChanged = FALSE; pasgmember = (ASGMEMBER *)ellFirst(&pasg->memberList); @@ -397,6 +395,7 @@ long asComputeAsg(ASG *pasg) } pasgmember = (ASGMEMBER *)ellNext((ELLNODE *)pasgmember); } + return(0); } long asCompute(ASCLIENTPVT asClientPvt) @@ -405,55 +404,53 @@ long asCompute(ASCLIENTPVT asClientPvt) ASGCLIENT *pasgClient = asClientPvt; ASGMEMBER *pasgMember = pasgClient->pasgMember; ASG *pasg = pasgMember->pasg; - ASGLEVEL *pasglevel; + ASGRULE *pasgrule; asAccessRights oldaccess=pasgClient->access; GPHENTRY *pgphentry; if(!pasg) return(0); - pasglevel = (ASGLEVEL *)ellFirst(&pasg->levelList); - while(pasglevel) { + pasgrule = (ASGRULE *)ellFirst(&pasg->ruleList); + while(pasgrule) { if(access == asWRITE) break; - if(access>=pasglevel->access) goto next_level; - if(pasgClient->level > pasglevel->level) goto next_level; + if(access>=pasgrule->access) goto next_rule; + if(pasgClient->level > pasgrule->level) goto next_rule; /*if uagList is empty then no need to check uag*/ - if(ellCount(&pasglevel->uagList)>0){ + if(ellCount(&pasgrule->uagList)>0){ ASGUAG *pasguag; UAG *puag; - UAGNAME *puagname; - pasguag = (ASGUAG *)ellFirst(&pasglevel->uagList); + pasguag = (ASGUAG *)ellFirst(&pasgrule->uagList); while(pasguag) { if(puag = pasguag->puag) { pgphentry = gphFind(pasbase->phash,pasgClient->user,puag); - if(pgphentry) goto check_lag; + if(pgphentry) goto check_hag; } pasguag = (ASGUAG *)ellNext((ELLNODE *)pasguag); } - goto next_level; + goto next_rule; } -check_lag: - /*if lagList is empty then no need to check lag*/ - if(ellCount(&pasglevel->lagList)>0) { - ASGLAG *pasglag; - LAG *plag; - LAGNAME *plagname; +check_hag: + /*if hagList is empty then no need to check hag*/ + if(ellCount(&pasgrule->hagList)>0) { + ASGHAG *pasghag; + HAG *phag; - pasglag = (ASGLAG *)ellFirst(&pasglevel->lagList); - while(pasglag) { - if(plag = pasglag->plag) { - pgphentry=gphFind(pasbase->phash,pasgClient->location,plag); + pasghag = (ASGHAG *)ellFirst(&pasgrule->hagList); + while(pasghag) { + if(phag = pasghag->phag) { + pgphentry=gphFind(pasbase->phash,pasgClient->host,phag); if(pgphentry) goto check_calc; } - pasglag = (ASGLAG *)ellNext((ELLNODE *)pasglag); + pasghag = (ASGHAG *)ellNext((ELLNODE *)pasghag); } - goto next_level; + goto next_rule; } check_calc: - if(!pasglevel->calc - || (!(pasg->inpBad & pasglevel->inpUsed) && (pasglevel->result==1))) - access = pasglevel->access; -next_level: - pasglevel = (ASGLEVEL *)ellNext((ELLNODE *)pasglevel); + if(!pasgrule->calc + || (!(pasg->inpBad & pasgrule->inpUsed) && (pasgrule->result==1))) + access = pasgrule->access; +next_rule: + pasgrule = (ASGRULE *)ellNext((ELLNODE *)pasgrule); } pasgClient->access = access; if(pasgClient->pcallback && oldaccess!=access) { @@ -471,12 +468,12 @@ int asDump( { UAG *puag; UAGNAME *puagname; - LAG *plag; - LAGNAME *plagname; + HAG *phag; + HAGNAME *phagname; ASG *pasg; ASGINP *pasginp; - ASGLEVEL *pasglevel; - ASGLAG *pasglag; + ASGRULE *pasgrule; + ASGHAG *pasghag; ASGUAG *pasguag; ASGMEMBER *pasgmember; ASGCLIENT *pasgclient; @@ -495,18 +492,18 @@ int asDump( } puag = (UAG *)ellNext((ELLNODE *)puag); } - plag = (LAG *)ellFirst(&pasbase->lagList); - if(!plag) printf("No LAGs\n"); - while(plag) { - printf("LAG(%s)",plag->name); - plagname = (LAGNAME *)ellFirst(&plag->list); - if(plagname) printf(" {"); else printf("\n"); - while(plagname) { - printf("%s",plagname->location); - plagname = (LAGNAME *)ellNext((ELLNODE *)plagname); - if(plagname) printf(","); else printf("}\n"); + phag = (HAG *)ellFirst(&pasbase->hagList); + if(!phag) printf("No HAGs\n"); + while(phag) { + printf("HAG(%s)",phag->name); + phagname = (HAGNAME *)ellFirst(&phag->list); + if(phagname) printf(" {"); else printf("\n"); + while(phagname) { + printf("%s",phagname->host); + phagname = (HAGNAME *)ellNext((ELLNODE *)phagname); + if(phagname) printf(","); else printf("}\n"); } - plag = (LAG *)ellNext((ELLNODE *)plag); + phag = (HAG *)ellNext((ELLNODE *)phag); } pasg = (ASG *)ellFirst(&pasbase->asgList); if(!pasg) printf("No ASGs\n"); @@ -515,8 +512,8 @@ int asDump( printf("ASG(%s)",pasg->name); pasginp = (ASGINP *)ellFirst(&pasg->inpList); - pasglevel = (ASGLEVEL *)ellFirst(&pasg->levelList); - if(pasginp || pasglevel) { + pasgrule = (ASGRULE *)ellFirst(&pasg->ruleList); + if(pasginp || pasgrule) { printf(" {\n"); print_end_brace = TRUE; } else { @@ -536,14 +533,14 @@ int asDump( printf("\n"); pasginp = (ASGINP *)ellNext((ELLNODE *)pasginp); } - while(pasglevel) { + while(pasgrule) { int print_end_brace; - printf("\tLEVEL(%d,%s)", - pasglevel->level,asAccessName[pasglevel->access]); - pasguag = (ASGUAG *)ellFirst(&pasglevel->uagList); - pasglag = (ASGLAG *)ellFirst(&pasglevel->lagList); - if(pasguag || pasglag || pasglevel->calc) { + printf("\tRULE(%d,%s)", + pasgrule->level,asAccessName[pasgrule->access]); + pasguag = (ASGUAG *)ellFirst(&pasgrule->uagList); + pasghag = (ASGHAG *)ellFirst(&pasgrule->hagList); + if(pasguag || pasghag || pasgrule->calc) { printf(" {\n"); print_end_brace = TRUE; } else { @@ -556,21 +553,21 @@ int asDump( pasguag = (ASGUAG *)ellNext((ELLNODE *)pasguag); if(pasguag) printf(","); else printf(")\n"); } - pasglag = (ASGLAG *)ellFirst(&pasglevel->lagList); - if(pasglag) printf("\t\tLAG("); - while(pasglag) { - printf("%s",pasglag->plag->name); - pasglag = (ASGLAG *)ellNext((ELLNODE *)pasglag); - if(pasglag) printf(","); else printf(")\n"); + pasghag = (ASGHAG *)ellFirst(&pasgrule->hagList); + if(pasghag) printf("\t\tHAG("); + while(pasghag) { + printf("%s",pasghag->phag->name); + pasghag = (ASGHAG *)ellNext((ELLNODE *)pasghag); + if(pasghag) printf(","); else printf(")\n"); } - if(pasglevel->calc) { - printf("\t\tCALC(\"%s\")",pasglevel->calc); + if(pasgrule->calc) { + printf("\t\tCALC(\"%s\")",pasgrule->calc); if(verbose) - printf(" result=%s",(pasglevel->result ? "TRUE" : "FALSE")); + printf(" result=%s",(pasgrule->result ? "TRUE" : "FALSE")); printf("\n"); } if(print_end_brace) printf("\t}\n"); - pasglevel = (ASGLEVEL *)ellNext((ELLNODE *)pasglevel); + pasgrule = (ASGRULE *)ellNext((ELLNODE *)pasgrule); } pasgmember = (ASGMEMBER *)ellFirst(&pasg->memberList); if(!verbose) pasgmember = NULL; @@ -584,7 +581,7 @@ int asDump( printf("\n"); pasgclient = (ASGCLIENT *)ellFirst(&pasgmember->clientList); while(pasgclient) { - printf("\t\t\t %s %s",pasgclient->user,pasgclient->location); + printf("\t\t\t %s %s",pasgclient->user,pasgclient->host); if(pasgclient->level>=0 && pasgclient->level<=1) printf(" %s",asLevelName[pasgclient->level]); else @@ -631,38 +628,38 @@ int asDumpUag(char *uagname) return(0); } -int asDumpLag(char *lagname) +int asDumpHag(char *hagname) { - LAG *plag; - LAGNAME *plagname; + HAG *phag; + HAGNAME *phagname; if(!asActive) return(0); - plag = (LAG *)ellFirst(&pasbase->lagList); - if(!plag) printf("No LAGs\n"); - while(plag) { - if(lagname && strcmp(lagname,plag->name)!=0) { - plag = (LAG *)ellNext((ELLNODE *)plag); + phag = (HAG *)ellFirst(&pasbase->hagList); + if(!phag) printf("No HAGs\n"); + while(phag) { + if(hagname && strcmp(hagname,phag->name)!=0) { + phag = (HAG *)ellNext((ELLNODE *)phag); continue; } - printf("LAG(%s)",plag->name); - plagname = (LAGNAME *)ellFirst(&plag->list); - if(plagname) printf(" {"); else printf("\n"); - while(plagname) { - printf("%s",plagname->location); - plagname = (LAGNAME *)ellNext((ELLNODE *)plagname); - if(plagname) printf(","); else printf("}\n"); + printf("HAG(%s)",phag->name); + phagname = (HAGNAME *)ellFirst(&phag->list); + if(phagname) printf(" {"); else printf("\n"); + while(phagname) { + printf("%s",phagname->host); + phagname = (HAGNAME *)ellNext((ELLNODE *)phagname); + if(phagname) printf(","); else printf("}\n"); } - plag = (LAG *)ellNext((ELLNODE *)plag); + phag = (HAG *)ellNext((ELLNODE *)phag); } return(0); } -int asDumpLev(char *asgname) +int asDumpRules(char *asgname) { ASG *pasg; ASGINP *pasginp; - ASGLEVEL *pasglevel; - ASGLAG *pasglag; + ASGRULE *pasgrule; + ASGHAG *pasghag; ASGUAG *pasguag; if(!asActive) return(0); @@ -677,8 +674,8 @@ int asDumpLev(char *asgname) } printf("ASG(%s)",pasg->name); pasginp = (ASGINP *)ellFirst(&pasg->inpList); - pasglevel = (ASGLEVEL *)ellFirst(&pasg->levelList); - if(pasginp || pasglevel) { + pasgrule = (ASGRULE *)ellFirst(&pasg->ruleList); + if(pasginp || pasgrule) { printf(" {\n"); print_end_brace = TRUE; } else { @@ -693,14 +690,14 @@ int asDumpLev(char *asgname) printf("\n"); pasginp = (ASGINP *)ellNext((ELLNODE *)pasginp); } - while(pasglevel) { + while(pasgrule) { int print_end_brace; - printf("\tLEVEL(%d,%s)", - pasglevel->level,asAccessName[pasglevel->access]); - pasguag = (ASGUAG *)ellFirst(&pasglevel->uagList); - pasglag = (ASGLAG *)ellFirst(&pasglevel->lagList); - if(pasguag || pasglag || pasglevel->calc) { + printf("\tRULE(%d,%s)", + pasgrule->level,asAccessName[pasgrule->access]); + pasguag = (ASGUAG *)ellFirst(&pasgrule->uagList); + pasghag = (ASGHAG *)ellFirst(&pasgrule->hagList); + if(pasguag || pasghag || pasgrule->calc) { printf(" {\n"); print_end_brace = TRUE; } else { @@ -713,20 +710,20 @@ int asDumpLev(char *asgname) pasguag = (ASGUAG *)ellNext((ELLNODE *)pasguag); if(pasguag) printf(","); else printf(")\n"); } - pasglag = (ASGLAG *)ellFirst(&pasglevel->lagList); - if(pasglag) printf("\t\tLAG("); - while(pasglag) { - printf("%s",pasglag->plag->name); - pasglag = (ASGLAG *)ellNext((ELLNODE *)pasglag); - if(pasglag) printf(","); else printf(")\n"); + pasghag = (ASGHAG *)ellFirst(&pasgrule->hagList); + if(pasghag) printf("\t\tHAG("); + while(pasghag) { + printf("%s",pasghag->phag->name); + pasghag = (ASGHAG *)ellNext((ELLNODE *)pasghag); + if(pasghag) printf(","); else printf(")\n"); } - if(pasglevel->calc) { - printf("\t\tCALC(\"%s\")",pasglevel->calc); - printf(" result=%s",(pasglevel->result ? "TRUE" : "FALSE")); + if(pasgrule->calc) { + printf("\t\tCALC(\"%s\")",pasgrule->calc); + printf(" result=%s",(pasgrule->result ? "TRUE" : "FALSE")); printf("\n"); } if(print_end_brace) printf("\t}\n"); - pasglevel = (ASGLEVEL *)ellNext((ELLNODE *)pasglevel); + pasgrule = (ASGRULE *)ellNext((ELLNODE *)pasgrule); } if(print_end_brace) printf("}\n"); pasg = (ASG *)ellNext((ELLNODE *)pasg); @@ -737,7 +734,6 @@ int asDumpLev(char *asgname) int asDumpMem(char *asgname,void (*memcallback)(ASMEMBERPVT),int clients) { ASG *pasg; - ASGINP *pasginp; ASGMEMBER *pasgmember; ASGCLIENT *pasgclient; @@ -764,7 +760,7 @@ int asDumpMem(char *asgname,void (*memcallback)(ASMEMBERPVT),int clients) if(!clients) pasgclient = NULL; while(pasgclient) { printf("\t\t\t %s %s", - pasgclient->user,pasgclient->location); + pasgclient->user,pasgclient->host); if(pasgclient->level>=0 && pasgclient->level<=1) printf(" %s",asLevelName[pasgclient->level]); else @@ -802,12 +798,12 @@ static void asFreeAll(ASBASE *pasbase) { UAG *puag; UAGNAME *puagname; - LAG *plag; - LAGNAME *plagname; + HAG *phag; + HAGNAME *phagname; ASG *pasg; ASGINP *pasginp; - ASGLEVEL *pasglevel; - ASGLAG *pasglag; + ASGRULE *pasgrule; + ASGHAG *pasghag; ASGUAG *pasguag; void *pnext; @@ -825,19 +821,19 @@ static void asFreeAll(ASBASE *pasbase) free((void *)puag); puag = pnext; } - plag = (LAG *)ellFirst(&pasbase->lagList); - while(plag) { - plagname = (LAGNAME *)ellFirst(&plag->list); - while(plagname) { - pnext = ellNext((ELLNODE *)plagname); - ellDelete(&plag->list,(ELLNODE *)plagname); - free((void *)plagname); - plagname = pnext; + phag = (HAG *)ellFirst(&pasbase->hagList); + while(phag) { + phagname = (HAGNAME *)ellFirst(&phag->list); + while(phagname) { + pnext = ellNext((ELLNODE *)phagname); + ellDelete(&phag->list,(ELLNODE *)phagname); + free((void *)phagname); + phagname = pnext; } - pnext = ellNext((ELLNODE *)plag); - ellDelete(&pasbase->lagList,(ELLNODE *)plag); - free((void *)plag); - plag = pnext; + pnext = ellNext((ELLNODE *)phag); + ellDelete(&pasbase->hagList,(ELLNODE *)phag); + free((void *)phag); + phag = pnext; } pasg = (ASG *)ellFirst(&pasbase->asgList); while(pasg) { @@ -849,28 +845,28 @@ static void asFreeAll(ASBASE *pasbase) free((void *)pasginp); pasginp = pnext; } - pasglevel = (ASGLEVEL *)ellFirst(&pasg->levelList); - while(pasglevel) { - free((void *)pasglevel->calc); - free((void *)pasglevel->rpcl); - pasguag = (ASGUAG *)ellFirst(&pasglevel->uagList); + pasgrule = (ASGRULE *)ellFirst(&pasg->ruleList); + while(pasgrule) { + free((void *)pasgrule->calc); + free((void *)pasgrule->rpcl); + pasguag = (ASGUAG *)ellFirst(&pasgrule->uagList); while(pasguag) { pnext = ellNext((ELLNODE *)pasguag); - ellDelete(&pasglevel->uagList,(ELLNODE *)pasguag); + ellDelete(&pasgrule->uagList,(ELLNODE *)pasguag); free((void *)pasguag); pasguag = pnext; } - pasglag = (ASGLAG *)ellFirst(&pasglevel->lagList); - while(pasglag) { - pnext = ellNext((ELLNODE *)pasglag); - ellDelete(&pasglevel->lagList,(ELLNODE *)pasglag); - free((void *)pasglag); - pasglag = pnext; + pasghag = (ASGHAG *)ellFirst(&pasgrule->hagList); + while(pasghag) { + pnext = ellNext((ELLNODE *)pasghag); + ellDelete(&pasgrule->hagList,(ELLNODE *)pasghag); + free((void *)pasghag); + pasghag = pnext; } - pnext = ellNext((ELLNODE *)pasglevel); - ellDelete(&pasg->levelList,(ELLNODE *)pasglevel); - free((void *)pasglevel); - pasglevel = pnext; + pnext = ellNext((ELLNODE *)pasgrule); + ellDelete(&pasg->ruleList,(ELLNODE *)pasgrule); + free((void *)pasgrule); + pasgrule = pnext; } pnext = ellNext((ELLNODE *)pasg); ellDelete(&pasbase->asgList,(ELLNODE *)pasg); @@ -925,47 +921,47 @@ static long asUagAddUser(UAG *puag,char *user) return(0); } -static LAG *asLagAdd(char *lagName) +static HAG *asHagAdd(char *hagName) { - LAG *pprev; - LAG *pnext; - LAG *plag; + HAG *pprev; + HAG *pnext; + HAG *phag; int cmpvalue; ASBASE *pbase = (ASBASE *)pasbase; /*Insert in alphabetic order*/ - pnext = (LAG *)ellFirst(&pasbase->lagList); + pnext = (HAG *)ellFirst(&pasbase->hagList); while(pnext) { - cmpvalue = strcmp(lagName,pnext->name); + cmpvalue = strcmp(hagName,pnext->name); if(cmpvalue < 0) break; if(cmpvalue==0) { - errMessage(-1,"Duplicate Location Access Group"); + errMessage(-1,"Duplicate Host Access Group"); return(NULL); } - pnext = (LAG *)ellNext((ELLNODE *)pnext); + pnext = (HAG *)ellNext((ELLNODE *)pnext); } - plag = asCalloc(1,sizeof(LAG)+strlen(lagName)+1); - ellInit(&plag->list); - plag->name = (char *)(plag+1); - strcpy(plag->name,lagName); + phag = asCalloc(1,sizeof(HAG)+strlen(hagName)+1); + ellInit(&phag->list); + phag->name = (char *)(phag+1); + strcpy(phag->name,hagName); if(pnext==NULL) { /*Add to end of list*/ - ellAdd(&pbase->lagList,(ELLNODE *)plag); + ellAdd(&pbase->hagList,(ELLNODE *)phag); } else { - pprev = (LAG *)ellPrevious((ELLNODE *)pnext); - ellInsert(&pbase->lagList,(ELLNODE *)pprev,(ELLNODE *)plag); + pprev = (HAG *)ellPrevious((ELLNODE *)pnext); + ellInsert(&pbase->hagList,(ELLNODE *)pprev,(ELLNODE *)phag); } - return(plag); + return(phag); } -static long asLagAddLocation(LAG *plag,char *location) +static long asHagAddHost(HAG *phag,char *host) { - LAGNAME *plagname; + HAGNAME *phagname; - if(!plag) return(0); - plagname = asCalloc(1,sizeof(LAG)+strlen(location)+1); - plagname->location = (char *)(plagname+1); - strcpy(plagname->location,location); - ellAdd(&plag->list,(ELLNODE *)plagname); + if(!phag) return(0); + phagname = asCalloc(1,sizeof(HAG)+strlen(host)+1); + phagname->host = (char *)(phagname+1); + strcpy(phagname->host,host); + ellAdd(&phag->list,(ELLNODE *)phagname); return(0); } @@ -985,7 +981,7 @@ static ASG *asAsgAdd(char *asgName) if(cmpvalue==0) { if(strcmp(DEFAULT,pnext->name)==0) { if(ellCount(&pnext->inpList)==0 - && ellCount(&pnext->levelList)==0) + && ellCount(&pnext->ruleList)==0) return(pnext); } errMessage(S_asLib_dupAsg,NULL); @@ -995,7 +991,7 @@ static ASG *asAsgAdd(char *asgName) } pasg = asCalloc(1,sizeof(ASG)+strlen(asgName)+1); ellInit(&pasg->inpList); - ellInit(&pasg->levelList); + ellInit(&pasg->ruleList); ellInit(&pasg->memberList); pasg->name = (char *)(pasg+1); strcpy(pasg->name,asgName); @@ -1022,27 +1018,26 @@ static long asAsgAddInp(ASG *pasg,char *inp,int inpIndex) return(0); } -static ASGLEVEL *asAsgAddLevel(ASG *pasg,asAccessRights access,int level) +static ASGRULE *asAsgAddRule(ASG *pasg,asAccessRights access,int level) { - ASGLEVEL *pasglevel; - int bit; + ASGRULE *pasgrule; if(!pasg) return(0); - pasglevel = asCalloc(1,sizeof(ASGLEVEL)); - pasglevel->access = access; - pasglevel->level = level; - ellInit(&pasglevel->uagList); - ellInit(&pasglevel->lagList); - ellAdd(&pasg->levelList,(ELLNODE *)pasglevel); - return(pasglevel); + pasgrule = asCalloc(1,sizeof(ASGRULE)); + pasgrule->access = access; + pasgrule->level = level; + ellInit(&pasgrule->uagList); + ellInit(&pasgrule->hagList); + ellAdd(&pasg->ruleList,(ELLNODE *)pasgrule); + return(pasgrule); } -static long asAsgLevelUagAdd(ASGLEVEL *pasglevel,char *name) +static long asAsgRuleUagAdd(ASGRULE *pasgrule,char *name) { ASGUAG *pasguag; UAG *puag; - if(!pasglevel) return(0); + if(!pasgrule) return(0); puag = (UAG *)ellFirst(&pasbase->uagList); while(puag) { if(strcmp(puag->name,name)==0) break; @@ -1051,50 +1046,50 @@ static long asAsgLevelUagAdd(ASGLEVEL *pasglevel,char *name) if(!puag) return(S_asLib_noUag); pasguag = asCalloc(1,sizeof(ASGUAG)); pasguag->puag = puag; - ellAdd(&pasglevel->uagList,(ELLNODE *)pasguag); + ellAdd(&pasgrule->uagList,(ELLNODE *)pasguag); return(0); } -static long asAsgLevelLagAdd(ASGLEVEL *pasglevel,char *name) +static long asAsgRuleHagAdd(ASGRULE *pasgrule,char *name) { - ASGLAG *pasglag; - LAG *plag; + ASGHAG *pasghag; + HAG *phag; - if(!pasglevel) return(0); - plag = (LAG *)ellFirst(&pasbase->lagList); - while(plag) { - if(strcmp(plag->name,name)==0) break; - plag = (LAG *)ellNext((ELLNODE *)plag); + if(!pasgrule) return(0); + phag = (HAG *)ellFirst(&pasbase->hagList); + while(phag) { + if(strcmp(phag->name,name)==0) break; + phag = (HAG *)ellNext((ELLNODE *)phag); } - if(!plag) return(S_asLib_noLag); - pasglag = asCalloc(1,sizeof(ASGLAG)); - pasglag->plag = plag; - ellAdd(&pasglevel->lagList,(ELLNODE *)pasglag); + if(!phag) return(S_asLib_noHag); + pasghag = asCalloc(1,sizeof(ASGHAG)); + pasghag->phag = phag; + ellAdd(&pasgrule->hagList,(ELLNODE *)pasghag); return(0); } -static long asAsgLevelCalc(ASGLEVEL *pasglevel,char *calc) +static long asAsgRuleCalc(ASGRULE *pasgrule,char *calc) { short error_number; long status; - if(!pasglevel) return(0); - pasglevel->calc = asCalloc(1,strlen(calc)+1); - strcpy(pasglevel->calc,calc); - pasglevel->rpcl = asCalloc(1,RPCL_LEN); - status=postfix(pasglevel->calc,pasglevel->rpcl,&error_number); + if(!pasgrule) return(0); + pasgrule->calc = asCalloc(1,strlen(calc)+1); + strcpy(pasgrule->calc,calc); + pasgrule->rpcl = asCalloc(1,RPCL_LEN); + status=postfix(pasgrule->calc,pasgrule->rpcl,&error_number); if(status) { - free((void *)pasglevel->calc); - free((void *)pasglevel->rpcl); - pasglevel->calc = NULL; - pasglevel->rpcl = NULL; + free((void *)pasgrule->calc); + free((void *)pasgrule->rpcl); + pasgrule->calc = NULL; + pasgrule->rpcl = NULL; status = S_asLib_badCalc; } else { int i; for(i=0; iinpUsed |= (1<inpUsed |= (1<inpUsed |= (1<inpUsed |= (1<] string [a-zA-Z0-9_\,\./\*#\[\]%: ;!|\'\-&\(\)@\?\+<>=\$] @@ -20,9 +20,9 @@ yyreset() %% UAG {return(tokenUAG);} -LAG {return(tokenLAG);} +HAG {return(tokenHAG);} ASG {return(tokenASG);} -LEVEL {return(tokenLEVEL);} +RULE {return(tokenRULE);} CALC {return(tokenCALC);} INP[A-L] {/* If A-L is changed then ASMAXINP must also be changed*/ yylval.Int = (unsigned char)yytext[3];