summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2009-03-18 17:55:15 +0100
committerRainer Gerhards <rgerhards@adiscon.com>2009-03-18 17:55:15 +0100
commit27a639ed8875969574543f7738c7bcb14c6149d2 (patch)
tree5cd29af194fba23b765476a0f4897d6d08cf3f7c
parent7268b9bc5b8a7d4ea58cbec7fb6180574e2b20d6 (diff)
downloadrsyslog-27a639ed8875969574543f7738c7bcb14c6149d2.tar.gz
rsyslog-27a639ed8875969574543f7738c7bcb14c6149d2.tar.xz
rsyslog-27a639ed8875969574543f7738c7bcb14c6149d2.zip
omfile bugfixing
- fixed a bug that caused action retries not to work correctly situation was only cleared by a restart - bugfix: closed dynafile was potentially never written until another dynafile name was generated - potential loss of messages
-rw-r--r--ChangeLog4
-rw-r--r--action.c8
-rw-r--r--doc/rsyslog_conf_global.html1
-rw-r--r--tools/omfile.c20
4 files changed, 28 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 18bb0e53..ae700656 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
---------------------------------------------------------------------------
Version 4.1.6 [DEVEL] (rgerhards), 2009-03-??
+- fixed a bug that caused action retries not to work correctly
+ situation was only cleared by a restart
+- bugfix: closed dynafile was potentially never written until another
+ dynafile name was generated - potential loss of messages
---------------------------------------------------------------------------
Version 4.1.5 [DEVEL] (rgerhards), 2009-03-11
- bugfix: parser did not correctly parse fields in UDP-received messages
diff --git a/action.c b/action.c
index a41f976c..10607e72 100644
--- a/action.c
+++ b/action.c
@@ -353,7 +353,13 @@ static rsRetVal actionTryResume(action_t *pThis)
ASSERT(pThis != NULL);
- ttNow = getActNow(pThis); /* cache "now" */
+ /* for resume handling, we must always obtain a fresh timestamp. We used
+ * to use the action timestamp, but in this case we will never reach a
+ * point where a resumption is actually tried, because the action timestamp
+ * is always in the past. So we can not avoid doing a fresh time() call
+ * here. -- rgerhards, 2009-03-18
+ */
+ time(&ttNow); /* cache "now" */
/* first check if it is time for a re-try */
if(ttNow > pThis->ttResumeRtry) {
diff --git a/doc/rsyslog_conf_global.html b/doc/rsyslog_conf_global.html
index b0c1e400..d011bd2b 100644
--- a/doc/rsyslog_conf_global.html
+++ b/doc/rsyslog_conf_global.html
@@ -103,6 +103,7 @@ default 60000 (1 minute)]</li>
<li>$DefaultNetstreamDriver &lt;drivername&gt;, the default <a href="netstream.html">network stream driver</a> to use. Defaults to&nbsp;ptcp.$DefaultNetstreamDriverCAFile &lt;/path/to/cafile.pem&gt;</li>
<li>$DefaultNetstreamDriverCertFile &lt;/path/to/certfile.pem&gt;</li>
<li>$DefaultNetstreamDriverKeyFile &lt;/path/to/keyfile.pem&gt;</li>
+<li><b>$CreateDirs</b> [<b>on</b>/off] - create directories on an as-needed basis</li>
<li><a href="rsconf1_dircreatemode.html">$DirCreateMode</a></li>
<li><a href="rsconf1_dirgroup.html">$DirGroup</a></li>
<li><a href="rsconf1_dirowner.html">$DirOwner</a></li>
diff --git a/tools/omfile.c b/tools/omfile.c
index 8be815f2..bf84d1a7 100644
--- a/tools/omfile.c
+++ b/tools/omfile.c
@@ -457,6 +457,8 @@ static int prepareDynFile(instanceData *pData, uchar *newFileName, unsigned iMsg
int i;
int iFirstFree;
dynaFileCacheEntry **pCache;
+
+ BEGINfunc
ASSERT(pData != NULL);
ASSERT(newFileName != NULL);
@@ -542,6 +544,8 @@ static int prepareDynFile(instanceData *pData, uchar *newFileName, unsigned iMsg
pData->iCurrElt = iFirstFree;
DBGPRINTF("Added new entry %d for file cache, file '%s'.\n", iFirstFree, newFileName);
+ ENDfunc
+
return 0;
}
@@ -553,6 +557,7 @@ static int prepareDynFile(instanceData *pData, uchar *newFileName, unsigned iMsg
static rsRetVal writeFile(uchar **ppString, unsigned iMsgOpts, instanceData *pData)
{
off_t actualFileSize;
+ int iLenWritten;
DEFiRet;
ASSERT(pData != NULL);
@@ -563,7 +568,9 @@ static rsRetVal writeFile(uchar **ppString, unsigned iMsgOpts, instanceData *pDa
if(pData->bDynamicName) {
if(prepareDynFile(pData, ppString[1], iMsgOpts) != 0)
ABORT_FINALIZE(RS_RET_SUSPENDED); // TODO: different state? conditional based on what went wrong? 2009-03-11
- } else if(pData->fd == -1) {
+ }
+
+ if(pData->fd == -1) {
prepareFile(pData, pData->f_fname);
}
@@ -600,16 +607,21 @@ again:
}
}
- if(write(pData->fd, ppString[0], strlen((char*)ppString[0])) < 0) {
+ iLenWritten = write(pData->fd, ppString[0], strlen((char*)ppString[0]));
+//dbgprintf("lenwritten: %d\n", iLenWritten);
+ if(iLenWritten < 0) {
int e = errno;
-dbgprintf("++++++++++ log file writer error %d\n", e);
+ char errStr[1024];
+ rs_strerror_r(errno, errStr, sizeof(errStr));
+ DBGPRINTF("log file (%d) write error %d: %s\n", pData->fd, e, errStr);
/* If a named pipe is full, just ignore it for now
- mrn 24 May 96 */
- if (pData->fileType == eTypePIPE && e == EAGAIN)
+ if(pData->fileType == eTypePIPE && e == EAGAIN)
ABORT_FINALIZE(RS_RET_SUSPENDED);
(void) close(pData->fd);
+ pData->fd = -1; /* tell that fd is no longer open! */
/* Check for EBADF on TTY's due to vhangup()
* Linux uses EIO instead (mrn 12 May 96)
*/