Files
sics/Busy.c

116 lines
2.9 KiB
C

/*------------------------------------------------------------------------
A busy flag module for SICS.
Mark Koennecke, July 2002
-------------------------------------------------------------------------*/
#include <stdlib.h>
#include <assert.h>
#include "fortify.h"
#include "sics.h"
/*----------------------------------------------------------------------*/
typedef struct BUSY__ {
pObjectDescriptor pDes;
int iBusy;
}Busy;
/*---------------------------------------------------------------------*/
busyPtr makeBusy(void){
busyPtr result = NULL;
result = (busyPtr)malloc(sizeof(Busy));
if(!result){
return NULL;
}
result->pDes = CreateDescriptor("BusyFlag");
if(!result->pDes){
free(result);
return NULL;
}
result->iBusy = 0;
return result;
}
/*---------------------------------------------------------------------*/
void killBusy(void *self){
busyPtr busy;
if(self != NULL){
busy = (busyPtr)self;
if(busy->pDes != NULL){
DeleteDescriptor(busy->pDes);
}
free(busy);
}
}
/*---------------------------------------------------------------------*/
void incrementBusy(busyPtr self){
assert(self != NULL);
self->iBusy++;
}
/*--------------------------------------------------------------------*/
void decrementBusy(busyPtr self){
assert(self != NULL);
self->iBusy--;
if(self->iBusy < 0){
self->iBusy = 0;
}
}
/*--------------------------------------------------------------------*/
void clearBusy(busyPtr self){
assert(self != NULL);
self->iBusy = 0;
}
/*--------------------------------------------------------------------*/
void setBusy(busyPtr self, int val){
assert(self != NULL);
self->iBusy = val;
}
/*--------------------------------------------------------------------*/
int isBusy(busyPtr self){
assert(self != NULL);
return self->iBusy;
}
/*--------------------------------------------------------------------*/
int BusyAction(SConnection *pCon,SicsInterp *pSics, void *pData,
int argc, char *argv[]){
busyPtr self = NULL;
char pBuffer[80];
self = (busyPtr)pData;
assert(self != NULL);
if(argc > 1){
strtolower(argv[1]);
if(usUser < SCGetRights(pCon)){
SCWrite(pCon,"ERROR: no privilege to manipulate busy flag",eError);
return 0;
}
if(strcmp(argv[1],"incr") == 0){
incrementBusy(self);
SCSendOK(pCon);
return 1;
} else if(strcmp(argv[1],"decr") == 0){
decrementBusy(self);
SCSendOK(pCon);
return 1;
} else if(strcmp(argv[1],"clear") == 0){
clearBusy(self);
SCSendOK(pCon);
return 1;
}
}
sprintf(pBuffer,"Busy = %d", isBusy(self));
SCWrite(pCon,pBuffer,eValue);
return 1;
}
/*---------------------------------------------------------------------*/
busyPtr findBusy(SicsInterp *pInter){
CommandList *pCom = NULL;
pCom = FindCommand(pInter,"busy");
if(pCom != NULL){
return (busyPtr)pCom->pData;
}
}