diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | runtime/stream.c | 27 |
2 files changed, 32 insertions, 3 deletions
@@ -41,6 +41,14 @@ Version 7.2.2 [v7-stable] 2012-10-?? aborted on startup. Note that no segfault could happen if the initial startup went well (this was a problem with the config parser). closes: http://bugzilla.adiscon.com/show_bug.cgi?id=381 +- bugfix: imfile discarded some file parts + File lines that were incomplete (LF missing) *at the time imfile polled + the file* were partially discarded. That part of the line that was read + without the LF was discarded, and the rest of the line was submitted in + the next polling cycle. This is now changed so that the partial content + is saved until the complete line is read. Note that the patch affects + only read mode 0. + Thanks to Milan Bartos for providing the patch. ---------------------------------------------------------------------------- Version 7.2.1 [v7-stable] 2012-10-29 - bugfix: ruleset()-object did only support a single statement diff --git a/runtime/stream.c b/runtime/stream.c index 906a45fc..52d143de 100644 --- a/runtime/stream.c +++ b/runtime/stream.c @@ -589,19 +589,40 @@ strmReadLine(strm_t *pThis, cstr_t **ppCStr, int mode) uchar c; uchar finished; + rsRetVal readCharRet; + + static cstr_t *prevCStr = NULL; + ASSERT(pThis != NULL); ASSERT(ppCStr != NULL); CHKiRet(cstrConstruct(ppCStr)); - /* now read the line */ + /* append previous message to current message if necessary */ + if (prevCStr != NULL) { + CHKiRet(cstrAppendCStr(*ppCStr, prevCStr)); + } + CHKiRet(strmReadChar(pThis, &c)); if (mode == 0){ - while(c != '\n') { + while(c != '\n') { CHKiRet(cstrAppendChar(*ppCStr, c)); - CHKiRet(strmReadChar(pThis, &c)); + + readCharRet = strmReadChar(pThis, &c); + + /* end of file has been reached without \n */ + if (readCharRet == RS_RET_EOF) { + CHKiRet(rsCStrConstructFromCStr(&prevCStr, *ppCStr)); + } + + CHKiRet(readCharRet); } CHKiRet(cstrFinalize(*ppCStr)); + /* message has been finalized, destruct message from previous */ + if (prevCStr) { + cstrDestruct(&prevCStr); + prevCStr = NULL; + } } if (mode == 1){ finished=0; |