added configuration directive to disable octet-counted framing
authorRainer Gerhards <rgerhards@adiscon.com>
Tue, 20 Mar 2012 13:11:18 +0000 (14:11 +0100)
committerRainer Gerhards <rgerhards@adiscon.com>
Tue, 20 Mar 2012 13:11:18 +0000 (14:11 +0100)
for imptcp, directive is $InputPTCPServerSupportOctetCountedFraming

ChangeLog
doc/imptcp.html
plugins/imptcp/imptcp.c

index 775e7e3..f2a4e86 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
 - added configuration directive to disable octet-counted framing
   for imtcp, directive is $InputTCPServerSupportOctetCountedFraming 
+  for imptcp, directive is $InputPTCPServerSupportOctetCountedFraming 
 - added capability to use a local interface IP address as fromhost-ip for
   imuxsock imklog
   new config directives: $IMUXSockLocalIPIF, $klogLocalIPIF
index d422818..87d81a0 100644 (file)
@@ -43,6 +43,12 @@ very limited interest in fixing this issue. This directive <b>can not</b> fix th
 That would require much more code changes, which I was unable to do so far. Full details
 can be found at the <a href="http://www.rsyslog.com/Article321.phtml">Cisco tcp syslog anomaly</a>
 page.
+<li><b>$InputPTCPSupportOctetCountedFraming</b> &lt;<b>on</b>|off&gt;<br>
+If set to "on", the legacy octed-counted framing (similar to RFC5425 framing) is
+activated. This is the default and should be left unchanged until you know
+very well what you do. It may be useful to turn it off, if you know this framing
+is not used and some senders emit multi-line messages into the message stream.
+</li>
 <li>$InputPTCPServerNotifyOnConnectionClose [on/<b>off</b>]<br>
 instructs imptcp to emit a message if the remote peer closes a connection.<br>
 <li>$InputPTCPServerRun &lt;port&gt;<br>
index 9c6c64e..3973041 100644 (file)
@@ -89,6 +89,7 @@ DEFobjCurrIf(statsobj)
 /* config settings */
 typedef struct configSettings_s {
        int bEmitMsgOnClose;            /* emit an informational message on close by remote peer */
+       int bSuppOctetFram;             /* support octet-counted framing? */
        int iAddtlFrameDelim;           /* addtl frame delimiter, e.g. for netscreen, default none */
        uchar *pszInputName;            /* value for inputname property, NULL is OK and handled by core engine */
        uchar *lstnIP;                  /* which IP we should listen on? */
@@ -111,7 +112,8 @@ struct ptcpsrv_s {
        ptcpsrv_t *pNext;               /* linked list maintenance */
        uchar *port;                    /* Port to listen to */
        uchar *lstnIP;                  /* which IP we should listen on? */
-       int bEmitMsgOnClose;
+       sbool bEmitMsgOnClose;
+       sbool bSuppOctetFram;
        int iAddtlFrameDelim;
        uchar *pszInputName;
        prop_t *pInputName;             /* InputName in (fast to process) property format */
@@ -132,6 +134,7 @@ struct ptcpsess_s {
 //--- from tcps_sess.h
        int iMsg;                /* index of next char to store in msg */
        int bAtStrtOfFram;      /* are we at the very beginning of a new frame? */
+       sbool bSuppOctetFram;   /**< copy from listener, to speed up access */
        enum {
                eAtStrtFram,
                eInOctetCnt,
@@ -152,6 +155,7 @@ struct ptcplstn_s {
        ptcpsrv_t *pSrv;        /* our server */
        ptcplstn_t *prev, *next;
        int sock;
+       sbool bSuppOctetFram;
        epolld_t *epd;
        statsobj_t *stats;      /* listener stats */
        STATSCOUNTER_DEF(ctrSubmit, mutCtrSubmit)
@@ -551,7 +555,7 @@ processDataRcvd(ptcpsess_t *pThis, char c, struct syslogTime *stTime, time_t ttG
        DEFiRet;
 
        if(pThis->inputState == eAtStrtFram) {
-               if(isdigit((int) c)) {
+               if(pThis->bSuppOctetFram && isdigit((int) c)) {
                        pThis->inputState = eInOctetCnt;
                        pThis->iOctetsRemain = 0;
                        pThis->eFraming = TCP_FRAMING_OCTET_COUNTING;
@@ -690,6 +694,7 @@ static inline void
 initConfigSettings(void)
 {
        cs.bEmitMsgOnClose = 0;
+       cs.bSuppOctetFram = 1;
        cs.iAddtlFrameDelim = TCPSRV_NO_ADDTL_DELIMITER;
        cs.pszInputName = NULL;
        cs.pRuleset = NULL;
@@ -705,7 +710,7 @@ addEPollSock(epolld_type_t typ, void *ptr, int sock, epolld_t **pEpd)
        DEFiRet;
        epolld_t *epd = NULL;
 
-       CHKmalloc(epd = malloc(sizeof(epolld_t)));
+       CHKmalloc(epd = calloc(sizeof(epolld_t), 1));
        epd->typ = typ;
        epd->ptr = ptr;
        *pEpd = epd;
@@ -767,6 +772,7 @@ addLstn(ptcpsrv_t *pSrv, int sock, int isIPv6)
 
        CHKmalloc(pLstn = malloc(sizeof(ptcplstn_t)));
        pLstn->pSrv = pSrv;
+       pLstn->bSuppOctetFram = pSrv->bSuppOctetFram;
        pLstn->sock = sock;
        /* support statistics gathering */
        CHKiRet(statsobj.Construct(&(pLstn->stats)));
@@ -807,6 +813,7 @@ addSess(ptcplstn_t *pLstn, int sock, prop_t *peerName, prop_t *peerIP)
        CHKmalloc(pSess->pMsg = malloc(iMaxLine * sizeof(uchar)));
        pSess->pLstn = pLstn;
        pSess->sock = sock;
+       pSess->bSuppOctetFram = pLstn->bSuppOctetFram;
        pSess->inputState = eAtStrtFram;
        pSess->iMsg = 0;
        pSess->bAtStrtOfFram = 1;
@@ -907,6 +914,7 @@ static rsRetVal addTCPListener(void __attribute__((unused)) *pVal, uchar *pNewVa
        CHKmalloc(pSrv = malloc(sizeof(ptcpsrv_t)));
        pSrv->pSess = NULL;
        pSrv->pLstn = NULL;
+       pSrv->bSuppOctetFram = cs.bSuppOctetFram;
        pSrv->bEmitMsgOnClose = cs.bEmitMsgOnClose;
        pSrv->port = pNewVal;
        pSrv->iAddtlFrameDelim = cs.iAddtlFrameDelim;
@@ -1172,6 +1180,7 @@ static rsRetVal
 resetConfigVariables(uchar __attribute__((unused)) *pp, void __attribute__((unused)) *pVal)
 {
        cs.bEmitMsgOnClose = 0;
+       cs.bSuppOctetFram = 1;
        cs.iAddtlFrameDelim = TCPSRV_NO_ADDTL_DELIMITER;
        free(cs.pszInputName);
        cs.pszInputName = NULL;
@@ -1205,6 +1214,8 @@ CODEmodInit_QueryRegCFSLineHdlr
        /* register config file handlers */
        CHKiRet(omsdRegCFSLineHdlr(UCHAR_CONSTANT("inputptcpserverrun"), 0, eCmdHdlrGetWord,
                                   addTCPListener, NULL, STD_LOADABLE_MODULE_ID));
+       CHKiRet(omsdRegCFSLineHdlr(UCHAR_CONSTANT("inputptcpserversupportoctetcountedframing"), 0, eCmdHdlrBinary,
+                                  NULL, &cs.bSuppOctetFram, STD_LOADABLE_MODULE_ID));
        CHKiRet(omsdRegCFSLineHdlr(UCHAR_CONSTANT("inputptcpservernotifyonconnectionclose"), 0,
                                   eCmdHdlrBinary, NULL, &cs.bEmitMsgOnClose, STD_LOADABLE_MODULE_ID));
        CHKiRet(omsdRegCFSLineHdlr(UCHAR_CONSTANT("inputptcpserveraddtlframedelimiter"), 0, eCmdHdlrInt,