summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2009-06-12 11:47:00 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2009-06-12 11:47:00 +0200
commite3d9843c85b1dfddabc937ac6ccb4057d626bf03 (patch)
tree734265f50321802e047a29b984391b619e7bd85f
parent1af948107e6e520788e374adccf4986bf07e92f5 (diff)
downloadrsyslog-e3d9843c85b1dfddabc937ac6ccb4057d626bf03.tar.gz
rsyslog-e3d9843c85b1dfddabc937ac6ccb4057d626bf03.tar.xz
rsyslog-e3d9843c85b1dfddabc937ac6ccb4057d626bf03.zip
re-enabled pipe, tty and console in omfile
... by moving code to stream.c. Thanks to the new design, new cases are not really needed, resulting in cleaner code. I also did a cleanup of header file usage as a side-activity.
-rw-r--r--dirty.h4
-rw-r--r--plugins/omgssapi/omgssapi.c1
-rw-r--r--plugins/ommail/ommail.c2
-rw-r--r--plugins/ommysql/ommysql.c2
-rw-r--r--plugins/ompgsql/ompgsql.c2
-rw-r--r--plugins/omprog/omprog.c2
-rw-r--r--plugins/omrelp/omrelp.c2
-rw-r--r--plugins/omsnmp/omsnmp.c2
-rw-r--r--plugins/omstdout/omstdout.c2
-rw-r--r--plugins/omtemplate/omtemplate.c2
-rw-r--r--runtime/conf.h4
-rw-r--r--runtime/rsyslog.h13
-rw-r--r--runtime/stream.c162
-rw-r--r--runtime/stream.h5
-rw-r--r--tools/omfile.c142
-rw-r--r--tools/omfwd.c1
-rw-r--r--tools/omshell.c2
-rw-r--r--tools/omusrmsg.c2
-rw-r--r--tools/syslogd.c11
-rw-r--r--tools/syslogd.h10
20 files changed, 147 insertions, 226 deletions
diff --git a/dirty.h b/dirty.h
index bab15485..7ae57d09 100644
--- a/dirty.h
+++ b/dirty.h
@@ -35,10 +35,6 @@ int parseLegacySyslogMsg(msg_t *pMsg, int flags);
rsRetVal diagGetMainMsgQSize(int *piSize); /* for imdiag */
char* getFIOPName(unsigned iFIOP);
-/* TODO: the following 2 need to go in conf obj interface... */
-rsRetVal cflineParseTemplateName(uchar** pp, omodStringRequest_t *pOMSR, int iEntry, int iTplOpts, uchar *dfltTplName);
-rsRetVal cflineParseFileName(uchar* p, uchar *pFileName, omodStringRequest_t *pOMSR, int iEntry, int iTplOpts, uchar *pszTpl);
-
/* Intervals at which we flush out "message repeated" messages,
* in seconds after previous message is logged. After each flush,
* we move to the next interval until we reach the largest.
diff --git a/plugins/omgssapi/omgssapi.c b/plugins/omgssapi/omgssapi.c
index 361f657f..7b5a46e1 100644
--- a/plugins/omgssapi/omgssapi.c
+++ b/plugins/omgssapi/omgssapi.c
@@ -44,6 +44,7 @@
#include <pthread.h>
#include <gssapi/gssapi.h>
#include "dirty.h"
+#include "conf.h"
#include "syslogd-types.h"
#include "srUtils.h"
#include "net.h"
diff --git a/plugins/ommail/ommail.c b/plugins/ommail/ommail.c
index 5faadce3..3a7669c9 100644
--- a/plugins/ommail/ommail.c
+++ b/plugins/ommail/ommail.c
@@ -44,7 +44,7 @@
#include <netdb.h>
#include <time.h>
#include <sys/socket.h>
-#include "dirty.h"
+#include "conf.h"
#include "syslogd-types.h"
#include "srUtils.h"
#include "cfsysline.h"
diff --git a/plugins/ommysql/ommysql.c b/plugins/ommysql/ommysql.c
index ecf738a9..d6870a7b 100644
--- a/plugins/ommysql/ommysql.c
+++ b/plugins/ommysql/ommysql.c
@@ -36,7 +36,7 @@
#include <errno.h>
#include <time.h>
#include <mysql.h>
-#include "dirty.h"
+#include "conf.h"
#include "syslogd-types.h"
#include "srUtils.h"
#include "template.h"
diff --git a/plugins/ompgsql/ompgsql.c b/plugins/ompgsql/ompgsql.c
index 6daac1c7..eb774835 100644
--- a/plugins/ompgsql/ompgsql.c
+++ b/plugins/ompgsql/ompgsql.c
@@ -40,7 +40,7 @@
#include <errno.h>
#include <time.h>
#include <libpq-fe.h>
-#include "dirty.h"
+#include "conf.h"
#include "syslogd-types.h"
#include "srUtils.h"
#include "template.h"
diff --git a/plugins/omprog/omprog.c b/plugins/omprog/omprog.c
index 2a078a6d..01fa7cea 100644
--- a/plugins/omprog/omprog.c
+++ b/plugins/omprog/omprog.c
@@ -36,7 +36,7 @@
#include <errno.h>
#include <unistd.h>
#include <wait.h>
-#include "dirty.h"
+#include "conf.h"
#include "syslogd-types.h"
#include "srUtils.h"
#include "template.h"
diff --git a/plugins/omrelp/omrelp.c b/plugins/omrelp/omrelp.c
index 8d74c82f..d5ef8b4f 100644
--- a/plugins/omrelp/omrelp.c
+++ b/plugins/omrelp/omrelp.c
@@ -36,7 +36,7 @@
#include <errno.h>
#include <ctype.h>
#include <librelp.h>
-#include "dirty.h"
+#include "conf.h"
#include "syslogd-types.h"
#include "srUtils.h"
#include "cfsysline.h"
diff --git a/plugins/omsnmp/omsnmp.c b/plugins/omsnmp/omsnmp.c
index 72fa8d64..4db60e62 100644
--- a/plugins/omsnmp/omsnmp.c
+++ b/plugins/omsnmp/omsnmp.c
@@ -36,7 +36,7 @@
#include <netdb.h>
#include <ctype.h>
#include <assert.h>
-#include "dirty.h"
+#include "conf.h"
#include "syslogd-types.h"
#include "cfsysline.h"
#include "module-template.h"
diff --git a/plugins/omstdout/omstdout.c b/plugins/omstdout/omstdout.c
index 181895a4..b9125f19 100644
--- a/plugins/omstdout/omstdout.c
+++ b/plugins/omstdout/omstdout.c
@@ -35,7 +35,7 @@
#include <signal.h>
#include <errno.h>
#include <unistd.h>
-#include "dirty.h"
+#include "conf.h"
#include "syslogd-types.h"
#include "srUtils.h"
#include "template.h"
diff --git a/plugins/omtemplate/omtemplate.c b/plugins/omtemplate/omtemplate.c
index e35968ad..5577f8c6 100644
--- a/plugins/omtemplate/omtemplate.c
+++ b/plugins/omtemplate/omtemplate.c
@@ -36,7 +36,7 @@
#include <signal.h>
#include <errno.h>
#include <time.h>
-#include "dirty.h"
+#include "conf.h"
#include "syslogd-types.h"
#include "srUtils.h"
#include "template.h"
diff --git a/runtime/conf.h b/runtime/conf.h
index f29de1ba..25b887be 100644
--- a/runtime/conf.h
+++ b/runtime/conf.h
@@ -51,5 +51,9 @@ PROTOTYPEObj(conf);
extern EHostnameCmpMode eDfltHostnameCmpMode;
extern cstr_t *pDfltHostnameCmp;
extern cstr_t *pDfltProgNameCmp;
+/* TODO: the following 2 need to go in conf obj interface... */
+rsRetVal cflineParseTemplateName(uchar** pp, omodStringRequest_t *pOMSR, int iEntry, int iTplOpts, uchar *dfltTplName);
+rsRetVal cflineParseFileName(uchar* p, uchar *pFileName, omodStringRequest_t *pOMSR, int iEntry, int iTplOpts, uchar *pszTpl);
+
#endif /* #ifndef INCLUDED_CONF_H */
diff --git a/runtime/rsyslog.h b/runtime/rsyslog.h
index 92942c70..28f7bce9 100644
--- a/runtime/rsyslog.h
+++ b/runtime/rsyslog.h
@@ -99,6 +99,7 @@ typedef struct strmLstnPortList_s strmLstnPortList_t; // TODO: rename?
typedef long long int64;
typedef long long unsigned uint64;
typedef int64 number_t; /* type to use for numbers - TODO: maybe an autoconf option? */
+typedef short bool;
#ifdef __hpux
typedef unsigned int u_int32_t; /* TODO: is this correct? */
@@ -124,6 +125,18 @@ typedef enum {
FIOP_EREREGEX = 5 /* matches a ERE regular expression? */
} fiop_t;
+/* file types (omfile & stream) */
+typedef enum {
+ eTypeFILE,
+ eTypeTTY,
+ eTypeCONSOLE,
+ eTypePIPE
+} filetype_t;
+
+
+#ifndef _PATH_CONSOLE
+#define _PATH_CONSOLE "/dev/console"
+#endif
/* The error codes below are orginally "borrowed" from
* liblogging. As such, we reserve values up to -2999
diff --git a/runtime/stream.c b/runtime/stream.c
index 5355a1a5..c8672aa2 100644
--- a/runtime/stream.c
+++ b/runtime/stream.c
@@ -166,35 +166,14 @@ finalize_it:
* strm instance object.
*/
-/* open a strm file
- * It is OK to call this function when the stream is already open. In that
- * case, it returns immediately with RS_RET_OK
+/* do the physical open() call on a file.
*/
-static rsRetVal strmOpenFile(strm_t *pThis)
+static rsRetVal
+doPhysOpen(strm_t *pThis)
{
- DEFiRet;
int iFlags;
-
- ASSERT(pThis != NULL);
-
- if(pThis->fd != -1)
- ABORT_FINALIZE(RS_RET_OK);
-
- if(pThis->pszFName == NULL)
- ABORT_FINALIZE(RS_RET_FILE_PREFIX_MISSING);
-
- if(pThis->sType == STREAMTYPE_FILE_CIRCULAR) {
- CHKiRet(genFileName(&pThis->pszCurrFName, pThis->pszDir, pThis->lenDir,
- pThis->pszFName, pThis->lenFName, pThis->iCurrFNum, pThis->iFileNumDigits));
- } else {
- if(pThis->pszDir == NULL) {
- if((pThis->pszCurrFName = (uchar*) strdup((char*) pThis->pszFName)) == NULL)
- ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
- } else {
- CHKiRet(genFileName(&pThis->pszCurrFName, pThis->pszDir, pThis->lenDir,
- pThis->pszFName, pThis->lenFName, -1, 0));
- }
- }
+ DEFiRet;
+ ISOBJ_TYPE_assert(pThis, strm);
/* compute which flags we need to provide to open */
switch(pThis->tOperationsMode) {
@@ -222,8 +201,51 @@ static rsRetVal strmOpenFile(strm_t *pThis)
ABORT_FINALIZE(RS_RET_FILE_NOT_FOUND);
else
ABORT_FINALIZE(RS_RET_IO_ERROR);
+ } else {
+ if(!ustrcmp(pThis->pszCurrFName, UCHAR_CONSTANT(_PATH_CONSOLE)) || isatty(pThis->fd)) {
+ DBGPRINTF("file %d is a tty-type file\n", pThis->fd);
+ pThis->bIsTTY = 1;
+ } else {
+ pThis->bIsTTY = 0;
+ }
}
+finalize_it:
+ RETiRet;
+}
+
+
+/* open a strm file
+ * It is OK to call this function when the stream is already open. In that
+ * case, it returns immediately with RS_RET_OK
+ */
+static rsRetVal strmOpenFile(strm_t *pThis)
+{
+ DEFiRet;
+
+ ASSERT(pThis != NULL);
+
+ if(pThis->fd != -1)
+ ABORT_FINALIZE(RS_RET_OK);
+
+ if(pThis->pszFName == NULL)
+ ABORT_FINALIZE(RS_RET_FILE_PREFIX_MISSING);
+
+ if(pThis->sType == STREAMTYPE_FILE_CIRCULAR) {
+ CHKiRet(genFileName(&pThis->pszCurrFName, pThis->pszDir, pThis->lenDir,
+ pThis->pszFName, pThis->lenFName, pThis->iCurrFNum, pThis->iFileNumDigits));
+ } else {
+ if(pThis->pszDir == NULL) {
+ if((pThis->pszCurrFName = (uchar*) strdup((char*) pThis->pszFName)) == NULL)
+ ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
+ } else {
+ CHKiRet(genFileName(&pThis->pszCurrFName, pThis->pszDir, pThis->lenDir,
+ pThis->pszFName, pThis->lenFName, -1, 0));
+ }
+ }
+
+ CHKiRet(doPhysOpen(pThis));
+
pThis->iCurrOffs = 0;
if(pThis->tOperationsMode == STREAMMODE_WRITE_APPEND) {
/* we need to obtain the current offset */
@@ -232,8 +254,8 @@ static rsRetVal strmOpenFile(strm_t *pThis)
pThis->iCurrOffs = offset;
}
- dbgoprint((obj_t*) pThis, "opened file '%s' for %s (0x%x) as %d\n", pThis->pszCurrFName,
- (pThis->tOperationsMode == STREAMMODE_READ) ? "READ" : "WRITE", iFlags, pThis->fd);
+ dbgoprint((obj_t*) pThis, "opened file '%s' for %s as %d\n", pThis->pszCurrFName,
+ (pThis->tOperationsMode == STREAMMODE_READ) ? "READ" : "WRITE", pThis->fd);
finalize_it:
RETiRet;
@@ -255,7 +277,7 @@ static rsRetVal strmCloseFile(strm_t *pThis)
if(pThis->tOperationsMode != STREAMMODE_READ)
strmFlush(pThis);
- close(pThis->fd); // TODO: error check
+ close(pThis->fd);
pThis->fd = -1;
if(pThis->fdDir != -1) {
@@ -265,7 +287,13 @@ static rsRetVal strmCloseFile(strm_t *pThis)
}
if(pThis->bDeleteOnClose) {
- unlink((char*) pThis->pszCurrFName); // TODO: check returncode
+ if(unlink((char*) pThis->pszCurrFName) == -1) {
+ char errStr[1024];
+ int err = errno;
+ rs_strerror_r(err, errStr, sizeof(errStr));
+ DBGPRINTF("error %d unlinking '%s' - ignored: %s\n",
+ errno, pThis->pszCurrFName, errStr);
+ }
}
pThis->iCurrOffs = 0; /* we are back at begin of file */
@@ -544,13 +572,12 @@ static rsRetVal strmConstructFinalize(strm_t *pThis)
}
/* if we are aset to sync, we must obtain a file handle to the directory for fsync() purposes */
- if(pThis->bSync) {
- pThis->fdDir = open((char*)pThis->pszDir, O_RDONLY);
+ if(pThis->bSync && !pThis->bIsTTY) {
+ pThis->fdDir = open((char*)pThis->pszDir, O_RDONLY | O_CLOEXEC | O_NOCTTY);
if(pThis->fdDir == -1) {
char errStr[1024];
int err = errno;
rs_strerror_r(err, errStr, sizeof(errStr));
- // TODO: log an error message? think so...
DBGPRINTF("error %d opening directory file for fsync() use - fsync for directory disabled: %s\n",
errno, errStr);
}
@@ -606,6 +633,29 @@ finalize_it:
}
+/* try to recover a tty after a write error. This may have happend
+ * due to vhangup(), and, if so, we can simply re-open it.
+ */
+#ifdef linux
+# define ERR_TTYHUP EIO
+#else
+# define ERR_TTYHUP EBADF
+#endif
+static rsRetVal
+tryTTYRecover(strm_t *pThis, int err)
+{
+ DEFiRet;
+ ISOBJ_TYPE_assert(pThis, strm);
+ if(err == ERR_TTYHUP) {
+ close(pThis->fd);
+ CHKiRet(doPhysOpen(pThis));
+ }
+
+finalize_it:
+ RETiRet;
+}
+#undef ER_TTYHUP
+
/* issue write() api calls until either the buffer is completely
* written or an error occured (it may happen that multiple writes
@@ -614,29 +664,36 @@ finalize_it:
* rgerhards, 2009-06-08
*/
static rsRetVal
-doWriteCall(int fd, uchar *pBuf, size_t *pLenBuf)
+doWriteCall(strm_t *pThis, uchar *pBuf, size_t *pLenBuf)
{
ssize_t lenBuf;
ssize_t iTotalWritten;
ssize_t iWritten;
char *pWriteBuf;
DEFiRet;
+ ISOBJ_TYPE_assert(pThis, strm);
lenBuf = *pLenBuf;
pWriteBuf = (char*) pBuf;
iTotalWritten = 0;
do {
- iWritten = write(fd, pWriteBuf, lenBuf);
+ iWritten = write(pThis->fd, pWriteBuf, lenBuf);
if(iWritten < 0) {
char errStr[1024];
int err = errno;
rs_strerror_r(err, errStr, sizeof(errStr));
- DBGPRINTF("log file (%d) write error %d: %s\n", fd, err, errStr);
+ DBGPRINTF("log file (%d) write error %d: %s\n", pThis->fd, err, errStr);
if(err == EINTR) {
/*NO ERROR, just continue */;
} else {
- ABORT_FINALIZE(RS_RET_IO_ERROR);
- // TODO: cover more error cases!
+ if(pThis->bIsTTY) {
+ CHKiRet(tryTTYRecover(pThis, err));
+ } else {
+ ABORT_FINALIZE(RS_RET_IO_ERROR);
+ /* Would it make sense to cover more error cases? So far, I
+ * do not see good reason to do so.
+ */
+ }
}
}
/* advance buffer to next write position */
@@ -653,7 +710,10 @@ finalize_it:
/* sync the file to disk, so that any unwritten data is persisted. This
* also syncs the directory and thus makes sure that the file survives
- * fatal failure. -- rgerhards, 2009-06-08
+ * fatal failure. Note that we do NOT return an error status if the
+ * sync fails. Doing so would probably cause more trouble than it
+ * is worth (read: data loss may occur where we otherwise might not
+ * have it). -- rgerhards, 2009-06-08
*/
static rsRetVal
syncFile(strm_t *pThis)
@@ -661,6 +721,9 @@ syncFile(strm_t *pThis)
int ret;
DEFiRet;
+ if(pThis->bIsTTY)
+ FINALIZE; /* TTYs can not be synced */
+
DBGPRINTF("syncing file %d\n", pThis->fd);
ret = fdatasync(pThis->fd);
if(ret != 0) {
@@ -670,19 +733,20 @@ syncFile(strm_t *pThis)
DBGPRINTF("sync failed for file %d with error (%d): %s - ignoring\n",
pThis->fd, err, errStr);
}
- // TODO: check error!
if(pThis->fdDir != -1) {
ret = fsync(pThis->fdDir);
-dbgprintf("sync on dir (fd %d) requested, return code %d\n", pThis->fdDir, ret);
}
+finalize_it:
RETiRet;
}
/* physically write to the output file. the provided data is ready for
* writing (e.g. zipped if we are requested to do that).
+ * Note that if the write() API fails, we do not reset any pointers, but return
+ * an error code. That means we may redo work in the next iteration.
* rgerhards, 2009-06-04
*/
static rsRetVal
@@ -690,24 +754,15 @@ strmPhysWrite(strm_t *pThis, uchar *pBuf, size_t lenBuf)
{
size_t iWritten;
DEFiRet;
-
- ASSERT(pThis != NULL);
+ ISOBJ_TYPE_assert(pThis, strm);
if(pThis->fd == -1)
CHKiRet(strmOpenFile(pThis));
iWritten = lenBuf;
- CHKiRet(doWriteCall(pThis->fd, pBuf, &iWritten));
+ CHKiRet(doWriteCall(pThis, pBuf, &iWritten));
dbgoprint((obj_t*) pThis, "file %d write wrote %d bytes\n", pThis->fd, (int) iWritten);
- /* Now indicate buffer empty again. We do this in any case, because there
- * is no way we could react more intelligently to an error during write.
- * This MUST be done BEFORE strCheckNextOutputFile(), otherwise we have an
- * endless loop. We reset the buffer pointer also in finalize_it - this is
- * necessary if we run into problems. Not resetting it would again cause an
- * endless loop. So it is better to loose some data (which also justifies
- * duplicating that code, too...) -- rgerhards, 2008-01-10
- */
pThis->iBufPtr = 0;
pThis->iCurrOffs += iWritten;
/* update user counter, if provided */
@@ -725,8 +780,6 @@ strmPhysWrite(strm_t *pThis, uchar *pBuf, size_t lenBuf)
}
finalize_it:
- pThis->iBufPtr = 0; /* see comment above */
-
RETiRet;
}
@@ -995,7 +1048,6 @@ strmSetFName(strm_t *pThis, uchar *pszName, size_t iLenName)
ASSERT(pThis != NULL);
ASSERT(pszName != NULL);
-dbgprintf("XXX: strm setFname: '%s'\n", pszName);
if(iLenName < 1)
ABORT_FINALIZE(RS_RET_FILE_PREFIX_MISSING);
diff --git a/runtime/stream.h b/runtime/stream.h
index a06e089f..021c4792 100644
--- a/runtime/stream.h
+++ b/runtime/stream.h
@@ -99,7 +99,7 @@ typedef struct strm_s {
int64 iMaxFileSize;/* maximum size a file may grow to */
int iMaxFiles; /* maximum number of files if a circular mode is in use */
int iFileNumDigits;/* min number of digits to use in file number (only in circular mode) */
- int bDeleteOnClose; /* set to 1 to auto-delete on close -- be careful with that setting! */
+ bool bDeleteOnClose; /* set to 1 to auto-delete on close -- be careful with that setting! */
int64 iCurrOffs;/* current offset */
int64 *pUsrWCntr; /* NULL or a user-provided counter that receives the nbr of bytes written since the last CntrSet() */
/* dynamic properties, valid only during file open, not to be persistet */
@@ -115,12 +115,13 @@ typedef struct strm_s {
size_t iBufPtrMax; /* current max Ptr in Buffer (if partial read!) */
size_t iBufPtr; /* pointer into current buffer */
int iUngetC; /* char set via UngetChar() call or -1 if none set */
- int bInRecord; /* if 1, indicates that we are currently writing a not-yet complete record */
+ bool bInRecord; /* if 1, indicates that we are currently writing a not-yet complete record */
int iZipLevel; /* zip level (0..9). If 0, zip is completely disabled */
Bytef *pZipBuf;
/* support for omfile size-limiting commands, special counters, NOT persisted! */
off_t iSizeLimit; /* file size limit, 0 = no limit */
uchar *pszSizeLimitCmd; /* command to carry out when size limit is reached */
+ bool bIsTTY; /* is this a tty file? */
} strm_t;
/* interfaces */
diff --git a/tools/omfile.c b/tools/omfile.c
index cf020f7b..6377268d 100644
--- a/tools/omfile.c
+++ b/tools/omfile.c
@@ -55,7 +55,7 @@
# include <fcntl.h>
#endif
-#include "syslogd.h"
+#include "conf.h"
#include "syslogd-types.h"
#include "srUtils.h"
#include "template.h"
@@ -64,7 +64,6 @@
#include "cfsysline.h"
#include "module-template.h"
#include "errmsg.h"
-#include "unicode-helper.h"
#include "stream.h"
#include "zlibw.h"
#include "unicode-helper.h"
@@ -110,12 +109,6 @@ static uchar *pszTplName = NULL; /* name of the default template to use */
typedef struct _instanceData {
uchar f_fname[MAXFNAME];/* file or template name (display only) */
strm_t *pStrm; /* our output stream */
- enum {
- eTypeFILE,
- eTypeTTY,
- eTypeCONSOLE,
- eTypePIPE
- } fileType;
char bDynamicName; /* 0 - static name, 1 - dynamic name (with properties) */
int fCreateMode; /* file creation mode for open() */
int fDirCreateMode; /* creation mode for mkdir() */
@@ -218,14 +211,6 @@ static rsRetVal cflineParseOutchannel(instanceData *pData, uchar* p, omodStringR
struct outchannel *pOch;
char szBuf[128]; /* should be more than sufficient */
- /* this must always be a file, because we can not set a size limit
- * on a pipe...
- * rgerhards 2005-06-21: later, this will be a separate type, but let's
- * emulate things for the time being. When everything runs, we can
- * extend it...
- */
- pData->fileType = eTypeFILE;
-
++p; /* skip '$' */
i = 0;
/* get outchannel name */
@@ -358,8 +343,6 @@ prepareFile(instanceData *pData, uchar *newFileName)
int fd;
DEFiRet;
- // TODO: handle TTY/PIPE case! (in stream.c!) 2009-06-04
-
if(access((char*)newFileName, F_OK) != 0) {
/* file does not exist, create it (and eventually parent directories */
fd = -1;
@@ -425,18 +408,6 @@ prepareFile(instanceData *pData, uchar *newFileName)
CHKiRet(strm.ConstructFinalize(pData->pStrm));
finalize_it:
- /* this was "fd != 0", which I think was a bug. I guess 0 was intended to mean
- * non-open file descriptor. Anyhow, I leave this comment for the time being to that if
- * problems surface, one at least knows what happened. -- rgerhards, 2009-03-19
- */
-#if 0 // TODO: this must be done by stream class!
- if(fd != -1 && isatty(fd)) {
- DBGPRINTF("file %d is a tty file\n", fd);
- pData->fileType = eTypeTTY;
- untty();
- }
-#endif
-
RETiRet;
}
@@ -546,107 +517,6 @@ finalize_it:
}
-#if 0
-// TODO: mirgrate code below to stream class (update its write handler, which is not great!)
-/* physically write the file
- */
-static rsRetVal
-doPhysWrite(instanceData *pData, int fd, char *pszBuf, size_t lenBuf)
-{
- off_t actualFileSize;
- int iLenWritten;
- DEFiRet;
- ASSERT(pData != NULL);
-
-dbgprintf("doPhysWrite, fd %d, iBuf %d\n", fd, (int) lenBuf);
-again:
- /* check if we have a file size limit and, if so,
- * obey to it.
- */
- if(pData->iSizeLimit != 0) {
- actualFileSize = lseek(fd, 0, SEEK_END);
- if(actualFileSize >= pData->iSizeLimit) {
- char errMsg[256];
- /* for now, we simply disable a file once it is
- * beyond the maximum size. This is better than having
- * us aborted by the OS... rgerhards 2005-06-21
- */
- (void) close(fd);
- /* try to resolve the situation */
- // TODO: *doesn't work, will need to use new fd !
- if(resolveFileSizeLimit(pData) != 0) {
- /* didn't work out, so disable... */
- snprintf(errMsg, sizeof(errMsg),
- "no longer writing to file %s; grown beyond configured file size of %lld bytes, actual size %lld - configured command did not resolve situation",
- pData->f_fname, (long long) pData->iSizeLimit, (long long) actualFileSize);
- errno = 0;
- errmsg.LogError(0, RS_RET_DISABLE_ACTION, "%s", errMsg);
- ABORT_FINALIZE(RS_RET_DISABLE_ACTION);
- } else {
- snprintf(errMsg, sizeof(errMsg),
- "file %s had grown beyond configured file size of %lld bytes, actual size was %lld - configured command resolved situation",
- pData->f_fname, (long long) pData->iSizeLimit, (long long) actualFileSize);
- errno = 0;
- errmsg.LogError(0, NO_ERRCODE, "%s", errMsg);
- }
- }
- }
-
- iLenWritten = write(fd, pszBuf, lenBuf);
- if(iLenWritten < 0) {
- int e = errno;
- char errStr[1024];
- rs_strerror_r(errno, errStr, sizeof(errStr));
- DBGPRINTF("log file (%d) write error %d: %s\n", fd, e, errStr);
-
- /* If a named pipe is full, we suspend this action for a while */
- if(pData->fileType == eTypePIPE && e == EAGAIN)
- ABORT_FINALIZE(RS_RET_SUSPENDED);
-
- close(pData->fd);
- pData->fd = -1; /* tell that fd is no longer open! */
- if(pData->bDynamicName && pData->iCurrElt != -1) {
- /* in this case, we need to invalidate the name in the cache, too
- * otherwise, an invalid fd may show up if we had a file name change.
- * rgerhards, 2009-03-19
- */
- pData->dynCache[pData->iCurrElt]->fd = -1;
- }
- /* Check for EBADF on TTY's due to vhangup()
- * Linux uses EIO instead (mrn 12 May 96)
- */
- if((pData->fileType == eTypeTTY || pData->fileType == eTypeCONSOLE)
-#ifdef linux
- && e == EIO
-#else
- && e == EBADF
-#endif
- ) {
- pData->fd = open((char*) pData->f_fname, O_WRONLY|O_APPEND|O_NOCTTY|O_CLOEXEC);
- if (pData->fd < 0) {
- iRet = RS_RET_SUSPENDED;
- errmsg.LogError(0, NO_ERRCODE, "%s", pData->f_fname);
- } else {
- untty();
- goto again;
- }
- } else {
- iRet = RS_RET_SUSPENDED;
- errno = e;
- errmsg.LogError(0, NO_ERRCODE, "%s", pData->f_fname);
- }
- } else if (pData->bSyncFile) {
- fsync(fd);
- }
-
- pData->poBuf->iBuf = 0;
-
-finalize_it:
- RETiRet;
-}
-#endif
-
-
/* do the actual write process. This function is to be called once we are ready for writing.
* It will do buffered writes and persist data only when the buffer is full. Note that we must
* be careful to detect when the file handle changed.
@@ -662,7 +532,7 @@ doWrite(instanceData *pData, uchar *pszBuf, int lenBuf)
dbgprintf("doWrite, pData->pStrm %p, lenBuf %d\n", pData->pStrm, lenBuf);
if(pData->pStrm != NULL){
CHKiRet(strm.Write(pData->pStrm, pszBuf, lenBuf));
- FINALIZE; // TODO: clean up later
+ FINALIZE;
}
finalize_it:
@@ -780,12 +650,6 @@ CODESTARTparseSelectorAct
case '|':
case '/':
CODE_STD_STRING_REQUESTparseSelectorAct(1)
- if(*p == '|') {
- pData->fileType = eTypePIPE;
- ++p;
- } else {
- pData->fileType = eTypeFILE;
- }
CHKiRet(cflineParseFileName(p, (uchar*) pData->f_fname, *ppOMSR, 0, OMSR_NO_RQD_TPL_OPTS,
(pszTplName == NULL) ? (uchar*)"RSYSLOG_FileFormat" : pszTplName));
pData->bDynamicName = 0;
@@ -808,8 +672,6 @@ CODESTARTparseSelectorAct
pData->iIOBufSize = iIOBufSize;
if(pData->bDynamicName == 0) {
- if(ustrcmp(p, UCHAR_CONSTANT(_PATH_CONSOLE)) == 0)
- pData->fileType = eTypeCONSOLE;
/* try open and emit error message if not possible. At this stage, we ignore the
* return value of prepareFile, this is taken care of in later steps.
*/
diff --git a/tools/omfwd.c b/tools/omfwd.c
index c8fedfc9..2966a5e4 100644
--- a/tools/omfwd.c
+++ b/tools/omfwd.c
@@ -48,6 +48,7 @@
#endif
#include <pthread.h>
#include "syslogd.h"
+#include "conf.h"
#include "syslogd-types.h"
#include "srUtils.h"
#include "net.h"
diff --git a/tools/omshell.c b/tools/omshell.c
index 7b815869..f8a68527 100644
--- a/tools/omshell.c
+++ b/tools/omshell.c
@@ -38,7 +38,7 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
-#include "syslogd.h"
+#include "conf.h"
#include "syslogd-types.h"
#include "srUtils.h"
#include "omshell.h"
diff --git a/tools/omusrmsg.c b/tools/omusrmsg.c
index 830bbc87..499a11dd 100644
--- a/tools/omusrmsg.c
+++ b/tools/omusrmsg.c
@@ -66,7 +66,7 @@
#include "srUtils.h"
#include "stringbuf.h"
#include "syslogd-types.h"
-#include "syslogd.h"
+#include "conf.h"
#include "omusrmsg.h"
#include "module-template.h"
#include "errmsg.h"
diff --git a/tools/syslogd.c b/tools/syslogd.c
index 96f3cb34..05c61059 100644
--- a/tools/syslogd.c
+++ b/tools/syslogd.c
@@ -138,6 +138,7 @@
#include "unicode-helper.h"
#include "ruleset.h"
#include "rule.h"
+#include "net.h"
#include "vm.h"
/* definitions for objects we access */
@@ -221,7 +222,7 @@ static rsRetVal GlobalClassExit(void);
#endif
#ifndef _PATH_TTY
-#define _PATH_TTY "/dev/tty"
+# define _PATH_TTY "/dev/tty"
#endif
static uchar *ConfFile = (uchar*) _PATH_LOGCONF; /* read-only after startup */
@@ -504,7 +505,7 @@ static char **crunch_list(char *list)
void untty(void)
#ifdef HAVE_SETSID
{
- if ( !Debug ) {
+ if(!Debug) {
setsid();
}
return;
@@ -513,18 +514,18 @@ void untty(void)
{
int i;
- if ( !Debug ) {
+ if(!Debug) {
i = open(_PATH_TTY, O_RDWR|O_CLOEXEC);
if (i >= 0) {
# if !defined(__hpux)
- (void) ioctl(i, (int) TIOCNOTTY, (char *)0);
+ (void) ioctl(i, (int) TIOCNOTTY, NULL);
# else
/* TODO: we need to implement something for HP UX! -- rgerhards, 2008-03-04 */
/* actually, HP UX should have setsid, so the code directly above should
* trigger. So the actual question is why it doesn't do that...
*/
# endif
- (void) close(i);
+ close(i);
}
}
}
diff --git a/tools/syslogd.h b/tools/syslogd.h
index 9bcfb2d2..3dfdbe2b 100644
--- a/tools/syslogd.h
+++ b/tools/syslogd.h
@@ -28,17 +28,7 @@
#include "action.h"
#include "linkedlist.h"
#include "expr.h"
-#include "net.h" /* TODO: remove when you remove isAllowedSender from here! */
-
-#ifndef _PATH_CONSOLE
-#define _PATH_CONSOLE "/dev/console"
-#endif
-
-void untty(void);
-rsRetVal selectorConstruct(ruleset_t **ppThis);
-rsRetVal selectorDestruct(void *pVal);
-rsRetVal selectorAddList(rule_t *f);
/* the following prototypes should go away once we have an input
* module interface -- rgerhards, 2007-12-12
*/