diff --git a/conman.c b/conman.c index dadb375d..d4cd8e3a 100644 --- a/conman.c +++ b/conman.c @@ -85,6 +85,8 @@ extern struct json_object *mkJSON_Object(SConnection * pCon, char *pBuffer, int iOut); +/* from loglisten.c */ +void LogListenRegister(SConnection * pCon); /* #define UUDEB 1 @@ -117,9 +119,6 @@ typedef struct { /*------------- a number for generating automatic names --------------------*/ static int iName = 0; static long lastIdent = 0; -/*------------- sending connection (prevent double write when listening) ----*/ -static SConnection *sendingConnection = NULL; -static int sendingSockHandle = 0; /* * This will return the value of a SICS int variable called "sicsdebug" @@ -165,24 +164,7 @@ static void FreeConnection(SConnection * pCon) free(pCon); } -/*---------------------------------------------------------------------------*/ -SConnection *GetSendingConnection(void) -{ - return sendingConnection; -} - -/*---------------------------------------------------------------------------*/ -static void SetSendingConnection(SConnection *pCon) -{ - sendingConnection = pCon; - if (pCon) { - sendingSockHandle = pCon->sockHandle; - } else { - sendingSockHandle = 0; - } -} - - /*-------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ static SConnection *SCMakeConnection() { SConnection *pRes = NULL; @@ -656,6 +638,35 @@ int SCPrintf(SConnection * self, int iOut, char *fmt, ...) return SCWrite(self, buf, iOut); } +/*-------------------------------------------------------------------------*/ +int SCPf(writeFunc func, SConnection * self, int iOut, char *fmt, ...) +{ + va_list ap; + char buf[256]; + char *dyn; + unsigned int l; + int res; + + va_start(ap, fmt); + l = vsnprintf(buf, sizeof buf, fmt, ap); + va_end(ap); + if (l >= sizeof buf) { + /* we have probably a C99 conforming snprintf and + need a larger buffer + */ + dyn = malloc(l + 1); + if (dyn != NULL) { + va_start(ap, fmt); + vsnprintf(dyn, l + 1, fmt, ap); + va_end(ap); + res = func(self, dyn, iOut); + free(dyn); + return res; + } + } + return func(self, buf, iOut); +} + /*-------------------------------------------------------------------------*/ writeFunc SCGetWriteFunc(SConnection * self) { @@ -1072,9 +1083,7 @@ int SCLogWrite(SConnection * self, char *buffer, int iOut) if (!VerifyConnection(self)) { return 0; } - SetSendingConnection(self); - Log(INFO,"com","sock%03.3d%s", self->sockHandle, buffer); - SetSendingConnection(NULL); + Log(INFO,"com","sock%03.3d:%s", self->sockHandle, buffer); if(self->iProtocolID == PROTACT) { /* act */ if (strlen(buffer) + 30 > 1024) { @@ -1627,7 +1636,6 @@ int SCInvoke(SConnection * self, SicsInterp * pInter, char *pCommand) * case */ if (SCGetWriteFunc(self) != SCNotWrite) { - SetSendingConnection(self); if (self->sockHandle >= 0) { if(strstr(pCommand,"Poch") == NULL){ Log(INFO,"com","sock%03.3d:",self->sockHandle, pCommand); @@ -1635,7 +1643,6 @@ int SCInvoke(SConnection * self, SicsInterp * pInter, char *pCommand) } else { Log(INFO,"sys","CRON:%s", pCommand); } - SetSendingConnection(NULL); } } @@ -1738,6 +1745,7 @@ int ConfigCon(SConnection * pCon, SicsInterp * pSics, void *pData, return 0; } pMaster->listening = pCon->listening; + LogListenRegister(pMaster); SCSendOK(pCon); return 1; } @@ -2251,11 +2259,6 @@ void SCSignalFunction(void *pData, int iSignal, void *pSigData) if (pPtr != NULL) { SCPureSockWrite(self, pPtr, eWarning); } - } else if (iSignal == COMLOG && self->listening == 1) { - pPtr = (char *) pSigData; - if (pPtr != NULL && self->sockHandle != sendingSockHandle) { - doSockWrite(self, pPtr); - } } else if (iSignal == TOKENRELEASE) { self->iGrab = 0; } else if (iSignal == TOKENGRAB) { diff --git a/conman.h b/conman.h index 2b37cc49..58e941bb 100644 --- a/conman.h +++ b/conman.h @@ -100,6 +100,7 @@ int SCWrite(SConnection * self, char *pBuffer, int iOut); #define G_GNUC_PRINTF( format_idx, arg_idx ) #endif int SCPrintf(SConnection * self, int iOut, char *fmt, ...) G_GNUC_PRINTF (3, 4); +int SCPf(writeFunc func, SConnection * self, int iOut, char *fmt, ...) G_GNUC_PRINTF (4, 5); #undef G_GNUC_PRINTF int SCRead(SConnection * self, char *pBuffer, int iBufLen); int SCPrompt(SConnection * pCon, char *pPrompt, char *pResult, int iLen);