/*-------------------------------------------------------------------------- C O N N E C T I O N O B J E C T This file defines the connection object data structure and the interface to this data structure. This is one of the most important SICS components. Substantially revised from a prior version. Mark Koennecke, September 1997 Mark Koennecke, Aprl 2003 Mark Koennecke, December 2004 copyright: see copyright.h ----------------------------------------------------------------------------*/ #ifndef SICSCONNECT #define SICSCONNECT #include #include "costa.h" #include "SCinter.h" #include "network.h" #include "obdes.h" #include "commandcontext.h" #include "dynstring.h" #define MAXLOGFILES 10 typedef int (*writeFunc)(struct __SConnection *pCon, char *pMessage, int iCode); typedef struct __SConnection { /* object basics */ pObjectDescriptor pDes; long lMagic; long ident; struct __SConnection *next; /* I/O control */ /* our socket */ mkChannel *pSock; /* per connection log files */ FILE *pFiles[MAXLOGFILES]; int iFiles; int iMacro; /* suppress I/O in macro*/ int iTelnet; /* telnet flag */ int iOutput; writeFunc write; /* function doing writing */ int listening; /* for listening to commandlog or other data */ /* execution context */ int eInterrupt; int iUserRights; int inUse; int iGrab; /* grab flag for token*/ int sicsError; /* * for I/O Buffering */ pDynString data; writeFunc oldWriteFunc; /* stuff supporting the sycamore protocol and a command context */ long iCmdCtr; int conEventType; int conStatus; /* should use status enum ffr */ int iProtocolID; int contextStack; /* a FIFO */ pCosta pStack; /* callback registry */ int iList; /* Tasking Stuff */ int iEnd; /* for keeping track of the login process on a non telnet connection. Should only be used in SCTaskFunction */ int iLogin; time_t conStart; } SConnection; #include "nserver.h" /*------------------------------ live & death ----------------------------*/ SConnection *SCreateConnection(SicsInterp *pSics, mkChannel *pSock, int iUserRights); SConnection *SCCreateDummyConnection(SicsInterp *pSics); void SCDeleteConnection(void *pVictim); /*------------------------------- tasking --------------------------------*/ int SCTaskFunction(void *pCon); void SCSignalFunction(void *pCon, int iSignal, void *pSigData); /* ***************************** I/O ************************************** */ int SCAddLogFile(SConnection *self, char *name); int SCDelLogFile(SConnection *pCon, int iFile); void SCSetOutputClass(SConnection *self, int iClass); int SCWrite(SConnection *self, char *pBuffer, int iOut); int SCPrintf(SConnection *self, int iOut, char *fmt, ...); int SCRead(SConnection *self, char *pBuffer, int iBufLen); int SCPrompt(SConnection *pCon, char *pPrompt, char *pResult, int iLen); int SCSendOK(SConnection *self); int SCnoSock(SConnection *pCon); int SCWriteUUencoded(SConnection *pCon, char *pName, void *iData, int iLen); int SCWriteZipped(SConnection *pCon, char *pName, void *pData, int iDataLen); writeFunc SCGetWriteFunc(SConnection *pCon); void SCSetWriteFunc(SConnection *pCon, writeFunc x); int SCOnlySockWrite(SConnection *self, char *buffer, int iOut); int SCFileWrite(SConnection *self, char *buffer, int iOut); int SCNotWrite(SConnection *self, char *buffer, int iOut); int SCNormalWrite(SConnection *self, char *buffer, int iOut); int SCWriteWithOutcode(SConnection *self, char *buffer, int iOut); int SCACTWrite(SConnection *self, char *buffer, int iOut); /*********************** I/O Buffering ***********************************/ int SCStartBuffering(SConnection *pCon); pDynString SCEndBuffering(SConnection *pCon); /************************* CallBack *********************************** */ int SCRegister(SConnection *pCon, SicsInterp *pSics, void *pInter, long lID); int SCUnregister(SConnection *pCon, void *pInter); /** * delete a callback with the given ID */ int SCUnregisterID(SConnection *pCon, long ID); /** * retrieve the ID of a callback on the callback interface * given in pData. This, together with SCUnregisterID allows to * ceanly remove all callbacks on a connection * returns -1 if no ID can be found. */ long SCgetCallbackID(SConnection *pCon, void *pData); /******************************* Error **************************************/ void SCSetInterrupt(SConnection *self, int eCode); int SCGetInterrupt(SConnection *self); /****************************** Macro ***************************************/ int SCinMacro(SConnection *pCon); int SCsetMacro(SConnection *pCon, int iMode); /************************** parameters changed ? **************************/ void SCparChange(SConnection *pCon); /* *************************** Info *************************************** */ int SCGetRights(SConnection *self); int SCSetRights(SConnection *pCon, int iNew); int SCMatchRights(SConnection *pCon, int iCode); int SCGetOutClass(SConnection *self); int SCGetGrab(SConnection *pCon); int SCActive(SConnection *pCon); /********************* simulation mode ************************************/ void SCSetSimMode(SConnection *pCon, int value); int SCinSimMode(SConnection *pCon); /* **************************** Invocation ******************************** */ int SCInvoke(SConnection *self,SicsInterp *pInter,char *pCommand); /*************************** User Command **********************************/ int ConfigCon(SConnection *pCon, SicsInterp *pSics, void *pData, int argc, char *argv[]); int ConSicsAction(SConnection *pCon, SicsInterp *pSics, void *pData, int argc, char *argv[]); /******************************** Store ************************************/ typedef struct SCStore SCStore; SCStore *SCSave(SConnection *pCon, SCStore *oldStore); /* save a connection and its context for later use. */ SConnection *SCLoad(SCStore *conStore); /* check con and return SConnection if still valid or a dummy connection otherwise. */ SConnection *SCStorePush(SCStore *conStore); /* load connection and push stored context. Must be paired with an SCStorePop command */ void SCStorePop(SCStore *conStore); /* pop context */ int SCStoreConnected(SCStore *conStore); /* check if a stored connection is not closed */ void SCStoreFree(SCStore *conStore); /* free an SCStore */ void KillFreeConnections(void); /*------------------------------------------------------------------------*/ int SCVerifyConnection(SConnection *self); void SCWriteToLogFiles(SConnection *self, char *buffer); int SCDoSockWrite(SConnection *self, char *buffer); int SCWriteInContext(SConnection *pCon, char *buffer, int code, commandContext cc); long SCTagContext(SConnection *self, char *tagName); long SCAdvanceContext(SConnection *self, char *tagName); int SCPushContext(SConnection *pCon, int ID, char *deviceID); int SCPushContext2(SConnection *pCon, commandContext cc); int SCPopContext(SConnection *pCon); commandContext SCGetContext(SConnection *pCon); #endif