So I dont loose everything I have done

This commit is contained in:
Marty Kraimer
1994-02-14 13:07:01 +00:00
parent 6991308d5f
commit 9a9b81130d
2 changed files with 178 additions and 85 deletions
+6 -10
View File
@@ -1,4 +1,5 @@
%{
static int yyerror();
#include "asLibRoutines.c"
static int line_num=1;
static UAG *yyUag=NULL;
@@ -37,6 +38,7 @@ asconfig_item: tokenUAG uag_head uag_body
uag_head: O_PAREN tokenNAME C_PAREN
{
yyUag = asUagAdd($2);
if(!yyUag) yyerror($2);
free((void *)$2);
}
;
@@ -67,6 +69,7 @@ uag_user_list_name: tokenNAME
lag_head: O_PAREN tokenNAME C_PAREN
{
yyLag = asLagAdd($2);
if(!yyLag) yyerror($2);
free((void *)$2);
}
;
@@ -94,6 +97,7 @@ lag_user_list_name: tokenNAME
asg_head: O_PAREN tokenNAME C_PAREN
{
yyAsg = asAsgAdd($2);
if(!yyAsg) yyerror($2);
free((void *)$2);
}
;
@@ -125,6 +129,7 @@ inp_body: tokenNAME | tokenPVNAME
;
level_config: tokenLEVEL level_head level_body
| tokenLEVEL level_head
level_head: O_PAREN level_range ',' tokenNAME C_PAREN
{
@@ -162,17 +167,7 @@ level_list: level_list level_list_item
;
level_list_item: tokenUAG O_PAREN level_uag_list C_PAREN
| tokenUAG O_PAREN '*' C_PAREN
{
if(asAsgLevelSetUagAll(yyAsgLevel))
yyerror("Why did asAsgLevelSetUagAll fail");
}
| tokenLAG O_PAREN level_lag_list C_PAREN
| tokenLAG O_PAREN '*' C_PAREN
{
if(asAsgLevelSetLagAll(yyAsgLevel))
yyerror("Why did asAsgLevelSetLagAll fail");
}
| tokenCALC O_PAREN tokenSTRING C_PAREN
{
long status;
@@ -217,6 +212,7 @@ static int yyerror(str)
char *str;
{
fprintf(stderr,"Error line %d : %s %s\n",line_num,str,yytext);
return(0);
}
static int myParse(ASINPUTFUNCPTR inputfunction)
{
+172 -75
View File
@@ -35,9 +35,19 @@
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
#ifdef vxWorks
#include <taskLib.h>
#endif
/*Forward declarations for Non ANSI routines*/
long calcPerform(double *parg,double *presult,char *post);
long postfix(char *pinfix, char *ppostfix,short *perror);
#define RPCL_LEN 184
#define DEFAULT "DEFAULT"
static ASBASE *pasbase=NULL;
int asActive = FALSE;
/*private routines */
void * asCalloc(size_t nobj,size_t size);
@@ -50,9 +60,7 @@ static ASG *asAsgAdd(char *asgName);
static long asAsgAddInp(ASG *pasg,char *inp,int inpIndex);
static ASGLEVEL *asAsgAddLevel(ASG *pasg,asAccessRights access,
int levlow,int levHigh);
static long asAsgLevelSetUagAll(ASGLEVEL *pasglevel);
static long asAsgLevelUagAdd(ASGLEVEL *pasglevel,char *name);
static long asAsgLevelSetLagAll(ASGLEVEL *pasglevel);
static long asAsgLevelLagAdd(ASGLEVEL *pasglevel,char *name);
static long asAsgLevelCalc(ASGLEVEL *pasglevel,char *calc);
static void asCaStart(void);
@@ -62,19 +70,18 @@ static int myParse(ASINPUTFUNCPTR inputfunction);
long asInitialize(ASINPUTFUNCPTR inputfunction)
{
ASG *pasg;
ASGMEMBER *porphan;
ASGMEMBER *pnextorphan;
long status;
ASBASE *pasbaseold = pasbase;
if(pasbaseold) {
asCaStop();
}
asActive = TRUE;
pasbase = asCalloc(1,sizeof(ASBASE));
ellInit(&pasbase->uagList);
ellInit(&pasbase->lagList);
ellInit(&pasbase->asgList);
ellInit(&pasbase->orphanList);
asAsgAdd(DEFAULT);
status = myParse(inputfunction);
if(status) {
status = S_asLib_badConfig;
@@ -88,19 +95,20 @@ long asInitialize(ASINPUTFUNCPTR inputfunction)
pasg = (ASG *)ellNext((ELLNODE *)pasg);
}
if(pasbaseold) {
porphan = (ASGMEMBER *)ellFirst(&pasbase->asgList);
while(porphan) {
pnextorphan = (ASGMEMBER *)ellNext((ELLNODE *)porphan);
ellDelete(&pasbase->orphanList,(ELLNODE *)porphan);
status = asAddMember(&porphan,porphan->asgName);
porphan = pnextorphan;
}
porphan = (ASGMEMBER *)ellFirst(&pasbase->orphanList);
while(porphan) {
pnextorphan = (ASGMEMBER *)ellNext((ELLNODE *)porphan);
ellDelete(&pasbase->orphanList,(ELLNODE *)porphan);
status = asAddMember(&porphan,porphan->asgName);
porphan = pnextorphan;
ASG *poldasg;
ASGMEMBER *poldmem;
ASGMEMBER *pnextoldmem;
poldasg = (ASG *)ellFirst(&pasbaseold->asgList);
while(poldasg) {
poldmem = (ASGMEMBER *)ellFirst(&poldasg->memberList);
while(poldmem) {
pnextoldmem = (ASGMEMBER *)ellNext((ELLNODE *)poldmem);
ellDelete(&poldasg->memberList,(ELLNODE *)poldmem);
status = asAddMember(&poldmem,poldmem->asgName);
poldmem = pnextoldmem;
}
poldasg = (ASG *)ellNext((ELLNODE *)poldasg);
}
asFreeAll(pasbaseold);
}
@@ -115,6 +123,7 @@ long asAddMember(ASMEMBERPVT *asMemberPvt,char *asgName)
ASGCLIENT *pclient;
long status;
if(!asActive) return(0);
if(*asMemberPvt) {
pasgmember = *asMemberPvt;
} else {
@@ -125,24 +134,27 @@ long asAddMember(ASMEMBERPVT *asMemberPvt,char *asgName)
pasgmember->asgName = asgName;
pgroup = (ASG *)ellFirst(&pasbase->asgList);
while(pgroup) {
if(strcmp(pgroup->name,pasgmember->asgName)==0) {
pasgmember->pasg = pgroup;
ellAdd(&pgroup->memberList,(ELLNODE *)pasgmember);
pclient = (ASGCLIENT *)ellFirst(&pasgmember->clientList);
while(pclient) {
status = asCompute(pclient);
if(status) {
errMessage(status,"asAddMember");
}
pclient = (ASGCLIENT *)ellNext((ELLNODE *)pclient);
}
break;
}
if(strcmp(pgroup->name,pasgmember->asgName)==0) goto got_it;
pgroup = (ASG *)ellNext((ELLNODE *)pgroup);
}
if(!pgroup) {
pasgmember->pasg = NULL;
ellAdd(&pasbase->orphanList,(ELLNODE *)pasgmember);
/* Put it in DEFAULT*/
pgroup = (ASG *)ellFirst(&pasbase->asgList);
while(pgroup) {
if(strcmp(pgroup->name,DEFAULT)==0) goto got_it;
pgroup = (ASG *)ellNext((ELLNODE *)pgroup);
}
errMessage(-1,"Logic Error in asAddMember");
exit(1);
got_it:
pasgmember->pasg = pgroup;
ellAdd(&pgroup->memberList,(ELLNODE *)pasgmember);
pclient = (ASGCLIENT *)ellFirst(&pasgmember->clientList);
while(pclient) {
status = asCompute(pclient);
if(status) {
errMessage(status,"asAddMember");
}
pclient = (ASGCLIENT *)ellNext((ELLNODE *)pclient);
}
return(0);
}
@@ -151,12 +163,14 @@ long asRemoveMember(ASMEMBERPVT *asMemberPvt)
{
ASGMEMBER *pasgmember;
if(!asActive) return(0);
pasgmember = *asMemberPvt;
if(ellCount(&pasgmember->clientList)>0) return(S_asLib_clientsExist);
if(pasgmember->pasg) {
ellDelete(&pasgmember->pasg->memberList,(ELLNODE *)pasgmember);
} else {
ellDelete(&pasbase->orphanList,(ELLNODE *)pasgmember);
errMessage(-1,"Logic error in asRemoveMember");
exit(-1);
}
free((void *)pasgmember);
*asMemberPvt = NULL;
@@ -168,33 +182,56 @@ long asChangeGroup(ASMEMBERPVT *asMemberPvt,char *newAsgName)
ASGMEMBER *pasgmember;
long status;
if(!asActive) return(0);
pasgmember = *asMemberPvt;
if(pasgmember->pasg) {
ellDelete(&pasgmember->pasg->memberList,(ELLNODE *)pasgmember);
} else {
ellDelete(&pasbase->orphanList,(ELLNODE *)pasgmember);
errMessage(-1,"Logic error in asChangeGroup");
exit(-1);
}
status = asAddMember(asMemberPvt,newAsgName);
return(status);
}
void *asGetMemberPvt(ASMEMBERPVT asMemberPvt)
{
ASGMEMBER *pasmember = asMemberPvt;
if(!asActive) return(NULL);
if(!pasmember) return(NULL);
return(pasmember->userPvt);
}
void asPutMemberPvt(ASMEMBERPVT asMemberPvt,void *userPvt)
{
ASGMEMBER *pasmember = asMemberPvt;
if(!asActive) return;
if(!pasmember) return;
pasmember->userPvt = userPvt;
}
long asAddClient(ASCLIENTPVT *asClientPvt,ASMEMBERPVT asMemberPvt,
int asl,char *user,char *location)
{
ASGMEMBER *pasmember = asMemberPvt;
ASGCLIENT *pasclient;
long status;
if(!asActive) return(0);
pasclient = asCalloc(1,sizeof(ASCLIENTPVT));
*asClientPvt = pasclient;
pasclient->pasgMember = asMemberPvt;
pasclient->level = asl;
pasclient->user = user;
pasclient->location = location;
printf("Calling asCompute\n");
status = asCompute(pasclient);
if(status) return(status);
if(!asCheckGet((*asClientPvt))) {
asRemoveClient(asClientPvt);
return(S_asLib_noAccess);
}
ellAdd(&pasmember->clientList,(ELLNODE *)pasclient);
return(status);
}
@@ -203,6 +240,7 @@ long asChangeClient(ASCLIENTPVT asClientPvt,int asl,char *user,char *location)
ASGCLIENT *pasclient = asClientPvt;
long status;
if(!asActive) return(0);
pasclient->level = asl;
pasclient->user = user;
pasclient->location = location;
@@ -215,6 +253,7 @@ long asRemoveClient(ASCLIENTPVT *asClientPvt)
ASGCLIENT *pasgClient = *asClientPvt;
ASGMEMBER *pasgMember;
if(!asActive) return(0);
if(!pasgClient) return(0);
pasgMember = pasgClient->pasgMember;
if(!pasgMember) {
@@ -227,6 +266,23 @@ long asRemoveClient(ASCLIENTPVT *asClientPvt)
return(0);
}
void *asGetClientPvt(ASCLIENTPVT asClientPvt)
{
ASGCLIENT *pasclient = asClientPvt;
if(!asActive) return(NULL);
if(!pasclient) return(NULL);
return(pasclient->userPvt);
}
void asPutClientPvt(ASCLIENTPVT asClientPvt,void *userPvt)
{
ASGCLIENT *pasclient = asClientPvt;
if(!asActive) return;
if(!pasclient) return;
pasclient->userPvt = userPvt;
}
long asCompute(ASCLIENTPVT asClientPvt)
{
asAccessRights access=0;
@@ -242,7 +298,8 @@ long asCompute(ASCLIENTPVT asClientPvt)
while(pasglevel) {
if(access>=pasglevel->access) goto next_level;
if(!((1<<pasgClient->level)&pasglevel->level_mask)) goto next_level;
if(!pasglevel->all_uag) {/*if all_uag then no need to check uag*/
/*if uagList is empty then no need to check uag*/
if(ellCount(&pasglevel->uagList)>0){
ASGUAG *pasguag;
UAG *puag;
UAGNAME *puagname;
@@ -262,7 +319,8 @@ long asCompute(ASCLIENTPVT asClientPvt)
goto next_level;
}
check_lag:
if(!pasglevel->all_lag) {/*if all_lag then no need to check lag*/
/*if lagList is empty then no need to check lag*/
if(ellCount(&pasglevel->lagList)>0) {
ASGLAG *pasglag;
LAG *plag;
LAGNAME *plagname;
@@ -295,7 +353,9 @@ next_level:
return(0);
}
void asDump(void)
void asDump(
void (*memcallback)(struct asgMember *),
void (*clientcallback)(struct asgClient *))
{
UAG *puag;
UAGNAME *puagname;
@@ -346,7 +406,7 @@ void asDump(void)
}
pasglevel = (ASGLEVEL *)ellFirst(&pasg->levelList);
while(pasglevel) {
printf("\tLEVEL(0x%0.2x,%d) {\n",
printf("\tLEVEL(0x%.2x,%d) {\n",
pasglevel->level_mask,pasglevel->access);
pasguag = (ASGUAG *)ellFirst(&pasglevel->uagList);
if(pasguag) printf("\t\tUAG(");
@@ -355,7 +415,6 @@ void asDump(void)
pasguag = (ASGUAG *)ellNext((ELLNODE *)pasguag);
if(pasguag) printf(","); else printf(")\n");
}
if(pasglevel->all_uag) printf("\t\tUAG(*)\n");
pasglag = (ASGLAG *)ellFirst(&pasglevel->lagList);
if(pasglag) printf("\t\tLAG(");
while(pasglag) {
@@ -363,7 +422,6 @@ void asDump(void)
pasglag = (ASGLAG *)ellNext((ELLNODE *)pasglag);
if(pasglag) printf(","); else printf(")\n");
}
if(pasglevel->all_lag) printf("\t\tLAG(*)\n");
if(pasglevel->calc) printf("\t\tCALC(\"%s\")\n",pasglevel->calc);
pasglevel = (ASGLEVEL *)ellNext((ELLNODE *)pasglevel);
if(!pasglevel) printf("\t}\n");
@@ -371,31 +429,25 @@ void asDump(void)
pasgmember = (ASGMEMBER *)ellFirst(&pasg->memberList);
if(pasgmember) printf("\tMEMBERLIST\n");
while(pasgmember) {
printf("\t\t%s\n",pasgmember->asgName);
if(strlen(pasgmember->asgName)==0)
printf("\t\t<null>");
else
printf("\t\t%s",pasgmember->asgName);
if(memcallback) memcallback(pasgmember);
printf("\n");
pasgclient = (ASGCLIENT *)ellFirst(&pasgmember->clientList);
while(pasgclient) {
printf("\t\t\t %s %s %d %d\n",
printf("\t\t\t %s %s %d %d",
pasgclient->user,pasgclient->location,
pasgclient->level,pasgclient->access);
pasgclient = (ASGCLIENT *)((ELLNODE *)pasgclient);
if(clientcallback) clientcallback(pasgclient);
printf("\n");
pasgclient = (ASGCLIENT *)ellNext((ELLNODE *)pasgclient);
}
pasgmember = (ASGMEMBER *)ellNext((ELLNODE *)pasgmember);
}
printf("}\n");
pasg = (ASG *)ellNext((ELLNODE *)pasg);
if(!pasg) printf("}\n");
}
pasgmember = (ASGMEMBER *)ellFirst(&pasbase->orphanList);
if(pasgmember) printf("ORPHANLIST\n");
while(pasgmember) {
printf("\t%s\n",pasgmember->asgName);
pasgclient = (ASGCLIENT *)ellFirst(&pasgmember->clientList);
while(pasgclient) {
printf("\t\t %s %s %d %d\n",
pasgclient->user,pasgclient->location,
pasgclient->level,pasgclient->access);
pasgclient = (ASGCLIENT *)((ELLNODE *)pasgclient);
}
pasgmember = (ASGMEMBER *)ellNext((ELLNODE *)pasgmember);
}
}
@@ -498,13 +550,28 @@ static void asFreeAll(ASBASE *pasbase)
static UAG *asUagAdd(char *uagName)
{
UAG *pprev;
UAG *pnext;
UAG *puag;
int cmpvalue;
/*Insert in alphabetic order*/
pprev = pnext = (UAG *)ellFirst(&pasbase->uagList);
while(pnext) {
cmpvalue = strcmp(uagName,pnext->name);
if(cmpvalue > 0) break;
if(cmpvalue==0) {
errMessage(-1,"Duplicate User Access Group");
return(NULL);
}
pprev = pnext;
pnext = (UAG *)ellNext((ELLNODE *)pnext);
}
puag = asCalloc(1,sizeof(UAG)+strlen(uagName)+1);
ellInit(&puag->list);
puag->name = (char *)(puag+1);
strcpy(puag->name,uagName);
ellAdd(&pasbase->uagList,(ELLNODE *)puag);
ellInsert(&pasbase->uagList,(ELLNODE *)pprev,(ELLNODE *)puag);
return(puag);
}
@@ -512,6 +579,7 @@ static long asUagAddUser(UAG *puag,char *user)
{
UAGNAME *puagname;
if(!puag) return(0);
puagname = asCalloc(1,sizeof(UAG)+strlen(user)+1);
puagname->user = (char *)(puagname+1);
strcpy(puagname->user,user);
@@ -521,13 +589,28 @@ static long asUagAddUser(UAG *puag,char *user)
static LAG *asLagAdd(char *lagName)
{
LAG *pprev;
LAG *pnext;
LAG *plag;
int cmpvalue;
/*Insert in alphabetic order*/
pprev = pnext = (LAG *)ellFirst(&pasbase->lagList);
while(pnext) {
cmpvalue = strcmp(lagName,pnext->name);
if(cmpvalue > 0) break;
if(cmpvalue==0) {
errMessage(-1,"Duplicate Location Access Group");
return(NULL);
}
pprev = pnext;
pnext = (LAG *)ellNext((ELLNODE *)pnext);
}
plag = asCalloc(1,sizeof(LAG)+strlen(lagName)+1);
ellInit(&plag->list);
plag->name = (char *)(plag+1);
strcpy(plag->name,lagName);
ellAdd(&pasbase->lagList,(ELLNODE *)plag);
ellInsert(&pasbase->lagList,(ELLNODE *)pprev,(ELLNODE *)plag);
return(plag);
}
@@ -535,6 +618,7 @@ static long asLagAddLocation(LAG *plag,char *location)
{
LAGNAME *plagname;
if(!plag) return(0);
plagname = asCalloc(1,sizeof(LAG)+strlen(location)+1);
plagname->location = (char *)(plagname+1);
strcpy(plagname->location,location);
@@ -544,15 +628,35 @@ static long asLagAddLocation(LAG *plag,char *location)
static ASG *asAsgAdd(char *asgName)
{
ASG *pprev;
ASG *pnext;
ASG *pasg;
int cmpvalue;
/*Insert in alphabetic order*/
pprev = pnext = (ASG *)ellFirst(&pasbase->asgList);
while(pnext) {
cmpvalue = strcmp(asgName,pnext->name);
if(cmpvalue > 0) break;
if(cmpvalue==0) {
if(strcmp(DEFAULT,pnext->name)==0) {
if(ellCount(&pnext->inpList)==0
&& ellCount(&pnext->levelList)==0)
return(pnext);
}
errMessage(-1,"Access Security Group");
return(NULL);
}
pprev = pnext;
pnext = (ASG *)ellNext((ELLNODE *)pnext);
}
pasg = asCalloc(1,sizeof(ASG)+strlen(asgName)+1);
ellInit(&pasg->inpList);
ellInit(&pasg->levelList);
ellInit(&pasg->memberList);
pasg->name = (char *)(pasg+1);
strcpy(pasg->name,asgName);
ellAdd(&pasbase->asgList,(ELLNODE *)pasg);
ellInsert(&pasbase->asgList,(ELLNODE *)pprev,(ELLNODE *)pasg);
return(pasg);
}
@@ -560,6 +664,7 @@ static long asAsgAddInp(ASG *pasg,char *inp,int inpIndex)
{
ASGINP *pasginp;
if(!pasg) return(0);
pasginp = asCalloc(1,sizeof(ASGINP)+strlen(inp)+1);
pasginp->inp = (char *)(pasginp+1);
strcpy(pasginp->inp,inp);
@@ -575,6 +680,7 @@ static ASGLEVEL *asAsgAddLevel(ASG *pasg,asAccessRights access,
ASGLEVEL *pasglevel;
int bit;
if(!pasg) return(0);
pasglevel = asCalloc(1,sizeof(ASGLEVEL));
pasglevel->access = access;
for(bit=levlow; bit<=levHigh; bit++) {
@@ -586,17 +692,12 @@ static ASGLEVEL *asAsgAddLevel(ASG *pasg,asAccessRights access,
return(pasglevel);
}
static long asAsgLevelSetUagAll(ASGLEVEL *pasglevel)
{
pasglevel->all_uag = TRUE;
return(0);
}
static long asAsgLevelUagAdd(ASGLEVEL *pasglevel,char *name)
{
ASGUAG *pasguag;
UAG *puag;
if(!pasglevel) return(0);
puag = (UAG *)ellFirst(&pasbase->uagList);
while(puag) {
if(strcmp(puag->name,name)==0) break;
@@ -609,17 +710,12 @@ static long asAsgLevelUagAdd(ASGLEVEL *pasglevel,char *name)
return(0);
}
static long asAsgLevelSetLagAll(ASGLEVEL *pasglevel)
{
pasglevel->all_lag = TRUE;
return(0);
}
static long asAsgLevelLagAdd(ASGLEVEL *pasglevel,char *name)
{
ASGLAG *pasglag;
LAG *plag;
if(!pasglevel) return(0);
plag = (LAG *)ellFirst(&pasbase->lagList);
while(plag) {
if(strcmp(plag->name,name)==0) break;
@@ -637,6 +733,7 @@ static long asAsgLevelCalc(ASGLEVEL *pasglevel,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);