summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--action.c10
-rw-r--r--dirty.h2
-rw-r--r--gss-misc.c22
-rw-r--r--plugins/imfile/imfile.c10
-rw-r--r--plugins/imgssapi/imgssapi.c14
-rw-r--r--plugins/immark/immark.c3
-rw-r--r--plugins/imtcp/imtcp.c2
-rw-r--r--plugins/imudp/imudp.c4
-rw-r--r--plugins/imuxsock/imuxsock.c6
-rw-r--r--plugins/omgssapi/omgssapi.c16
-rw-r--r--plugins/ommysql/ommysql.c8
-rw-r--r--plugins/ompgsql/ompgsql.c6
-rw-r--r--plugins/omrelp/omrelp.c12
-rw-r--r--runtime/cfsysline.c20
-rw-r--r--runtime/conf.c37
-rw-r--r--runtime/errmsg.c34
-rw-r--r--runtime/errmsg.h2
-rw-r--r--runtime/modules.c10
-rw-r--r--runtime/net.c57
-rw-r--r--runtime/nsd_gtls.c37
-rw-r--r--runtime/nsd_ptcp.c8
-rw-r--r--runtime/obj.c2
-rw-r--r--runtime/rsyslog.c10
-rw-r--r--runtime/rsyslog.h12
-rw-r--r--tcps_sess.c8
-rw-r--r--tcpsrv.c14
-rw-r--r--template.c14
-rw-r--r--tools/omfile.c20
-rw-r--r--tools/omfwd.c14
-rw-r--r--tools/omshell.c2
-rw-r--r--tools/syslogd.c51
32 files changed, 255 insertions, 219 deletions
diff --git a/ChangeLog b/ChangeLog
index 626036b8..115f8282 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,13 @@
---------------------------------------------------------------------------
Version 3.19.8 (rgerhards), 2008-06-??
- disabled compile warnings caused by third-party libraries
+- reduced number of compile warnings in gcc's -pedantic mode
+- bugfix: gtls module did not correctly handle EGAIN (and similar) recv()
+ states. This has been fixed by introducing a new abstraction layer inside
+ gtls.
+- added (internal) error codes to error messages; added redirector to
+ web description of error codes
+ closes bug http://bugzilla.adiscon.com/show_bug.cgi?id=20
---------------------------------------------------------------------------
Version 3.19.7 (rgerhards), 2008-06-11
- added new property replacer option "date-subseconds" that enables
diff --git a/action.c b/action.c
index f229bb9f..f7219405 100644
--- a/action.c
+++ b/action.c
@@ -219,11 +219,11 @@ actionConstructFinalize(action_t *pThis)
/* ... set some properties ... */
# define setQPROP(func, directive, data) \
CHKiRet_Hdlr(func(pThis->pQueue, data)) { \
- errmsg.LogError(NO_ERRCODE, "Invalid " #directive ", error %d. Ignored, running with default setting", iRet); \
+ errmsg.LogError(0, NO_ERRCODE, "Invalid " #directive ", error %d. Ignored, running with default setting", iRet); \
}
# define setQPROPstr(func, directive, data) \
CHKiRet_Hdlr(func(pThis->pQueue, data, (data == NULL)? 0 : strlen((char*) data))) { \
- errmsg.LogError(NO_ERRCODE, "Invalid " #directive ", error %d. Ignored, running with default setting", iRet); \
+ errmsg.LogError(0, NO_ERRCODE, "Invalid " #directive ", error %d. Ignored, running with default setting", iRet); \
}
queueSetpUsr(pThis->pQueue, pThis);
@@ -477,7 +477,7 @@ static rsRetVal setActionQueType(void __attribute__((unused)) *pVal, uchar *pszT
ActionQueType = QUEUETYPE_DIRECT;
dbgprintf("action queue type set to DIRECT (no queueing at all)\n");
} else {
- errmsg.LogError(NO_ERRCODE, "unknown actionqueue parameter: %s", (char *) pszType);
+ errmsg.LogError(0, RS_RET_INVALID_PARAMS, "unknown actionqueue parameter: %s", (char *) pszType);
iRet = RS_RET_INVALID_PARAMS;
}
d_free(pszType); /* no longer needed */
@@ -763,14 +763,14 @@ addAction(action_t **ppAction, modInfo_t *pMod, void *pModData, omodStringReques
" Could not find template '%s' - action disabled\n",
pTplName);
errno = 0;
- errmsg.LogError(NO_ERRCODE, "%s", errMsg);
+ errmsg.LogError(0, RS_RET_NOT_FOUND, "%s", errMsg);
ABORT_FINALIZE(RS_RET_NOT_FOUND);
}
/* check required template options */
if( (iTplOpts & OMSR_RQD_TPL_OPT_SQL)
&& (pAction->ppTpl[i]->optFormatForSQL == 0)) {
errno = 0;
- errmsg.LogError(NO_ERRCODE, "Action disabled. To use this action, you have to specify "
+ errmsg.LogError(0, RS_RET_RQD_TPLOPT_MISSING, "Action disabled. To use this action, you have to specify "
"the SQL or stdSQL option in your template!\n");
ABORT_FINALIZE(RS_RET_RQD_TPLOPT_MISSING);
}
diff --git a/dirty.h b/dirty.h
index 2782eea8..2cf00b40 100644
--- a/dirty.h
+++ b/dirty.h
@@ -41,7 +41,7 @@
#define MSG_DONT_PARSE_HOSTNAME 0
rsRetVal submitMsg(msg_t *pMsg);
-rsRetVal logmsgInternal(int pri, uchar *msg, int flags);
+rsRetVal logmsgInternal(int iErr, int pri, uchar *msg, int flags);
rsRetVal parseAndSubmitMessage(uchar *hname, uchar *hnameIP, uchar *msg, int len, int bParseHost, int flags, flowControl_t flowCtlType);
/* TODO: the following 2 need to go in conf obj interface... */
diff --git a/gss-misc.c b/gss-misc.c
index 4f0df748..c9220595 100644
--- a/gss-misc.c
+++ b/gss-misc.c
@@ -66,13 +66,13 @@ static void display_status_(char *m, OM_uint32 code, int type)
do {
maj_stat = gss_display_status(&min_stat, code, type, GSS_C_NO_OID, &msg_ctx, &msg);
if (maj_stat != GSS_S_COMPLETE) {
- errmsg.LogError(NO_ERRCODE, "GSS-API error in gss_display_status called from <%s>\n", m);
+ errmsg.LogError(0, NO_ERRCODE, "GSS-API error in gss_display_status called from <%s>\n", m);
break;
} else {
char buf[1024];
snprintf(buf, sizeof(buf), "GSS-API error %s: %s\n", m, (char *) msg.value);
buf[sizeof(buf)/sizeof(char) - 1] = '\0';
- errmsg.LogError(NO_ERRCODE, "%s", buf);
+ errmsg.LogError(0, NO_ERRCODE, "%s", buf);
}
if (msg.length != 0)
gss_release_buffer(&min_stat, &msg);
@@ -162,12 +162,12 @@ static int recv_token(int s, gss_buffer_t tok)
ret = read_all(s, (char *) lenbuf, 4);
if (ret < 0) {
- errmsg.LogError(NO_ERRCODE, "GSS-API error reading token length");
+ errmsg.LogError(0, NO_ERRCODE, "GSS-API error reading token length");
return -1;
} else if (!ret) {
return 0;
} else if (ret != 4) {
- errmsg.LogError(NO_ERRCODE, "GSS-API error reading token length");
+ errmsg.LogError(0, NO_ERRCODE, "GSS-API error reading token length");
return -1;
}
@@ -179,17 +179,17 @@ static int recv_token(int s, gss_buffer_t tok)
tok->value = (char *) malloc(tok->length ? tok->length : 1);
if (tok->length && tok->value == NULL) {
- errmsg.LogError(NO_ERRCODE, "Out of memory allocating token data\n");
+ errmsg.LogError(0, NO_ERRCODE, "Out of memory allocating token data\n");
return -1;
}
ret = read_all(s, (char *) tok->value, tok->length);
if (ret < 0) {
- errmsg.LogError(NO_ERRCODE, "GSS-API error reading token data");
+ errmsg.LogError(0, NO_ERRCODE, "GSS-API error reading token data");
free(tok->value);
return -1;
} else if (ret != (int) tok->length) {
- errmsg.LogError(NO_ERRCODE, "GSS-API error reading token data");
+ errmsg.LogError(0, NO_ERRCODE, "GSS-API error reading token data");
free(tok->value);
return -1;
}
@@ -214,19 +214,19 @@ static int send_token(int s, gss_buffer_t tok)
ret = write_all(s, (char *) lenbuf, 4);
if (ret < 0) {
- errmsg.LogError(NO_ERRCODE, "GSS-API error sending token length");
+ errmsg.LogError(0, NO_ERRCODE, "GSS-API error sending token length");
return -1;
} else if (ret != 4) {
- errmsg.LogError(NO_ERRCODE, "GSS-API error sending token length");
+ errmsg.LogError(0, NO_ERRCODE, "GSS-API error sending token length");
return -1;
}
ret = write_all(s, tok->value, tok->length);
if (ret < 0) {
- errmsg.LogError(NO_ERRCODE, "GSS-API error sending token data");
+ errmsg.LogError(0, NO_ERRCODE, "GSS-API error sending token data");
return -1;
} else if (ret != (int) tok->length) {
- errmsg.LogError(NO_ERRCODE, "GSS-API error sending token data");
+ errmsg.LogError(0, NO_ERRCODE, "GSS-API error sending token data");
return -1;
}
diff --git a/plugins/imfile/imfile.c b/plugins/imfile/imfile.c
index d4a332eb..dbdf6b94 100644
--- a/plugins/imfile/imfile.c
+++ b/plugins/imfile/imfile.c
@@ -318,7 +318,7 @@ ENDrunInput
BEGINwillRun
CODESTARTwillRun
if(iFilPtr == 0) {
- errmsg.LogError(NO_ERRCODE, "No files configured to be monitored");
+ errmsg.LogError(0, RS_RET_NO_RUN, "No files configured to be monitored");
ABORT_FINALIZE(RS_RET_NO_RUN);
}
@@ -447,21 +447,21 @@ static rsRetVal addMonitor(void __attribute__((unused)) *pVal, uchar *pNewVal)
pThis = &files[iFilPtr];
/* TODO: check for strdup() NULL return */
if(pszFileName == NULL) {
- errmsg.LogError(NO_ERRCODE, "imfile error: no file name given, file monitor can not be created");
+ errmsg.LogError(0, RS_RET_CONFIG_ERROR, "imfile error: no file name given, file monitor can not be created");
ABORT_FINALIZE(RS_RET_CONFIG_ERROR);
} else {
pThis->pszFileName = (uchar*) strdup((char*) pszFileName);
}
if(pszFileTag == NULL) {
- errmsg.LogError(NO_ERRCODE, "imfile error: no tag value given , file monitor can not be created");
+ errmsg.LogError(0, RS_RET_CONFIG_ERROR, "imfile error: no tag value given , file monitor can not be created");
ABORT_FINALIZE(RS_RET_CONFIG_ERROR);
} else {
pThis->pszTag = (uchar*) strdup((char*) pszFileTag);
}
if(pszStateFile == NULL) {
- errmsg.LogError(NO_ERRCODE, "imfile error: not state file name given, file monitor can not be created");
+ errmsg.LogError(0, RS_RET_CONFIG_ERROR, "imfile error: not state file name given, file monitor can not be created");
ABORT_FINALIZE(RS_RET_CONFIG_ERROR);
} else {
pThis->pszStateFile = (uchar*) strdup((char*) pszStateFile);
@@ -470,7 +470,7 @@ static rsRetVal addMonitor(void __attribute__((unused)) *pVal, uchar *pNewVal)
pThis->iSeverity = iSeverity;
pThis->iFacility = iFacility;
} else {
- errmsg.LogError(NO_ERRCODE, "Too many file monitors configured - ignoring this one");
+ errmsg.LogError(0, RS_RET_OUT_OF_DESRIPTORS, "Too many file monitors configured - ignoring this one");
ABORT_FINALIZE(RS_RET_OUT_OF_DESRIPTORS);
}
diff --git a/plugins/imgssapi/imgssapi.c b/plugins/imgssapi/imgssapi.c
index 24317b51..766cb519 100644
--- a/plugins/imgssapi/imgssapi.c
+++ b/plugins/imgssapi/imgssapi.c
@@ -258,7 +258,7 @@ doOpenLstnSocks(tcpsrv_t *pSrv)
if(pGSrv->allowedMethods) {
if(pGSrv->allowedMethods & ALLOWEDMETHOD_GSS) {
if(TCPSessGSSInit()) {
- errmsg.LogError(NO_ERRCODE, "GSS-API initialization failed\n");
+ errmsg.LogError(0, NO_ERRCODE, "GSS-API initialization failed\n");
pGSrv->allowedMethods &= ~(ALLOWEDMETHOD_GSS);
}
}
@@ -413,7 +413,7 @@ OnSessAcceptGSS(tcpsrv_t *pThis, tcps_sess_t *pSess)
ret = select(fdSess + 1, &fds, NULL, NULL, &tv);
} while (ret < 0 && errno == EINTR);
if (ret < 0) {
- errmsg.LogError(NO_ERRCODE, "TCP session %p will be closed, error ignored\n", pSess);
+ errmsg.LogError(0, RS_RET_ERR, "TCP session %p will be closed, error ignored\n", pSess);
ABORT_FINALIZE(RS_RET_ERR); // TODO: define good error codes
} else if (ret == 0) {
dbgprintf("GSS-API Reverting to plain TCP\n");
@@ -428,7 +428,7 @@ OnSessAcceptGSS(tcpsrv_t *pThis, tcps_sess_t *pSess)
if (ret == 0)
dbgprintf("GSS-API Connection closed by peer\n");
else
- errmsg.LogError(NO_ERRCODE, "TCP(GSS) session %p will be closed, error ignored\n", pSess);
+ errmsg.LogError(0, RS_RET_ERR, "TCP(GSS) session %p will be closed, error ignored\n", pSess);
ABORT_FINALIZE(RS_RET_ERR); // TODO: define good error codes
}
@@ -448,7 +448,7 @@ OnSessAcceptGSS(tcpsrv_t *pThis, tcps_sess_t *pSess)
if (ret == 0)
dbgprintf("GSS-API Connection closed by peer\n");
else
- errmsg.LogError(NO_ERRCODE, "TCP session %p will be closed, error ignored\n", pSess);
+ errmsg.LogError(0, NO_ERRCODE, "TCP session %p will be closed, error ignored\n", pSess);
ABORT_FINALIZE(RS_RET_ERR); // TODO: define good error codes
}
}
@@ -470,7 +470,7 @@ OnSessAcceptGSS(tcpsrv_t *pThis, tcps_sess_t *pSess)
sess_flags = &pGSess->gss_flags;
do {
if (gssutil.recv_token(fdSess, &recv_tok) <= 0) {
- errmsg.LogError(NO_ERRCODE, "TCP session %p will be closed, error ignored\n", pSess);
+ errmsg.LogError(0, NO_ERRCODE, "TCP session %p will be closed, error ignored\n", pSess);
ABORT_FINALIZE(RS_RET_ERR); // TODO: define good error codes
}
maj_stat = gss_accept_sec_context(&acc_sec_min_stat, context, gss_server_creds,
@@ -489,7 +489,7 @@ OnSessAcceptGSS(tcpsrv_t *pThis, tcps_sess_t *pSess)
dbgprintf("GSS-API Reverting to plain TCP\n");
dbgprintf("tcp session socket with new data: #%d\n", fdSess);
if(tcps_sess.DataRcvd(pSess, buf, ret) != RS_RET_OK) {
- errmsg.LogError(NO_ERRCODE, "Tearing down TCP Session %p - see "
+ errmsg.LogError(0, NO_ERRCODE, "Tearing down TCP Session %p - see "
"previous messages for reason(s)\n", pSess);
ABORT_FINALIZE(RS_RET_ERR); // TODO: define good error codes
}
@@ -502,7 +502,7 @@ OnSessAcceptGSS(tcpsrv_t *pThis, tcps_sess_t *pSess)
if (send_tok.length != 0) {
if(gssutil.send_token(fdSess, &send_tok) < 0) {
gss_release_buffer(&min_stat, &send_tok);
- errmsg.LogError(NO_ERRCODE, "TCP session %p will be closed, error ignored\n", pSess);
+ errmsg.LogError(0, NO_ERRCODE, "TCP session %p will be closed, error ignored\n", pSess);
if (*context != GSS_C_NO_CONTEXT)
gss_delete_sec_context(&min_stat, context, GSS_C_NO_BUFFER);
ABORT_FINALIZE(RS_RET_ERR); // TODO: define good error codes
diff --git a/plugins/immark/immark.c b/plugins/immark/immark.c
index ebdcabe9..0baff1de 100644
--- a/plugins/immark/immark.c
+++ b/plugins/immark/immark.c
@@ -40,6 +40,7 @@
#include "dirty.h"
#include "cfsysline.h"
#include "module-template.h"
+#include "errmsg.h"
MODULE_TYPE_INPUT
@@ -75,7 +76,7 @@ CODESTARTrunInput
* rgerhards, 2007-12-17
*/
CHKiRet(thrdSleep(pThrd, iMarkMessagePeriod, 0)); /* seconds, micro seconds */
- logmsgInternal(LOG_INFO, (uchar*)"-- MARK --", ADDDATE|MARK);
+ logmsgInternal(NO_ERRCODE, LOG_INFO, (uchar*)"-- MARK --", ADDDATE|MARK);
}
finalize_it:
return iRet;
diff --git a/plugins/imtcp/imtcp.c b/plugins/imtcp/imtcp.c
index 49d48633..f01a9f0f 100644
--- a/plugins/imtcp/imtcp.c
+++ b/plugins/imtcp/imtcp.c
@@ -180,7 +180,7 @@ static rsRetVal addTCPListener(void __attribute__((unused)) *pVal, uchar *pNewVa
finalize_it:
if(iRet != RS_RET_OK) {
- errmsg.LogError(NO_ERRCODE, "error %d trying to add listener", iRet);
+ errmsg.LogError(0, NO_ERRCODE, "error %d trying to add listener", iRet);
if(pOurTcpsrv != NULL)
tcpsrv.Destruct(&pOurTcpsrv);
}
diff --git a/plugins/imudp/imudp.c b/plugins/imudp/imudp.c
index 54dc6836..6d3a075f 100644
--- a/plugins/imudp/imudp.c
+++ b/plugins/imudp/imudp.c
@@ -199,7 +199,7 @@ CODESTARTrunInput
} else {
dbgprintf("%s is not an allowed sender\n", (char*)fromHostFQDN);
if(glbl.GetOption_DisallowWarning) {
- errmsg.LogError(NO_ERRCODE, "UDP message from disallowed sender %s discarded",
+ errmsg.LogError(0, NO_ERRCODE, "UDP message from disallowed sender %s discarded",
(char*)fromHost);
}
}
@@ -208,7 +208,7 @@ CODESTARTrunInput
char errStr[1024];
rs_strerror_r(errno, errStr, sizeof(errStr));
dbgprintf("INET socket error: %d = %s.\n", errno, errStr);
- errmsg.LogError(NO_ERRCODE, "recvfrom inet");
+ errmsg.LogError(errno, NO_ERRCODE, "recvfrom inet");
/* should be harmless */
sleep(1);
}
diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c
index 82fd118e..5781589f 100644
--- a/plugins/imuxsock/imuxsock.c
+++ b/plugins/imuxsock/imuxsock.c
@@ -114,7 +114,7 @@ static rsRetVal addLstnSocketName(void __attribute__((unused)) *pVal, uchar *pNe
funixn[nfunix++] = pNewVal;
}
else {
- errmsg.LogError(NO_ERRCODE, "Out of unix socket name descriptors, ignoring %s\n",
+ errmsg.LogError(0, NO_ERRCODE, "Out of unix socket name descriptors, ignoring %s\n",
pNewVal);
}
@@ -159,7 +159,7 @@ static int create_unix_socket(const char *path)
SUN_LEN(&sunx)) < 0 ||
chmod(path, 0666) < 0) {
snprintf(line, sizeof(line), "cannot create %s", path);
- errmsg.LogError(NO_ERRCODE, "%s", line);
+ errmsg.LogError(errno, NO_ERRCODE, "%s", line);
dbgprintf("cannot create %s (%d).\n", path, errno);
close(fd);
return -1;
@@ -187,7 +187,7 @@ static rsRetVal readSocket(int fd, int bParseHost, int flags)
char errStr[1024];
rs_strerror_r(errno, errStr, sizeof(errStr));
dbgprintf("UNIX socket error: %d = %s.\n", errno, errStr);
- errmsg.LogError(NO_ERRCODE, "recvfrom UNIX");
+ errmsg.LogError(errno, NO_ERRCODE, "recvfrom UNIX");
}
RETiRet;
diff --git a/plugins/omgssapi/omgssapi.c b/plugins/omgssapi/omgssapi.c
index e15c24e1..6573c46a 100644
--- a/plugins/omgssapi/omgssapi.c
+++ b/plugins/omgssapi/omgssapi.c
@@ -268,7 +268,7 @@ finalize_it:
RETiRet;
fail:
- errmsg.LogError(NO_ERRCODE, "GSS-API Context initialization failed\n");
+ errmsg.LogError(0, RS_RET_GSS_SENDINIT_ERROR, "GSS-API Context initialization failed\n");
gss_release_name(&min_stat, &target_name);
gss_release_buffer(&min_stat, &out_tok);
if (*context != GSS_C_NO_CONTEXT) {
@@ -501,12 +501,12 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
++p; /* eat */
pData->compressionLevel = iLevel;
} else {
- errmsg.LogError(NO_ERRCODE, "Invalid compression level '%c' specified in "
+ errmsg.LogError(0, NO_ERRCODE, "Invalid compression level '%c' specified in "
"forwardig action - NOT turning on compression.",
*p);
}
# else
- errmsg.LogError(NO_ERRCODE, "Compression requested, but rsyslogd is not compiled "
+ errmsg.LogError(0, NO_ERRCODE, "Compression requested, but rsyslogd is not compiled "
"with compression support - request ignored.");
# endif /* #ifdef USE_NETZIP */
} else if(*p == 'o') { /* octet-couting based TCP framing? */
@@ -514,7 +514,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
/* no further options settable */
tcp_framing = TCP_FRAMING_OCTET_COUNTING;
} else { /* invalid option! Just skip it... */
- errmsg.LogError(NO_ERRCODE, "Invalid option %c in forwarding action - ignoring.", *p);
+ errmsg.LogError(0, NO_ERRCODE, "Invalid option %c in forwarding action - ignoring.", *p);
++p; /* eat invalid option */
}
/* the option processing is done. We now do a generic skip
@@ -530,7 +530,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
/* we probably have end of string - leave it for the rest
* of the code to handle it (but warn the user)
*/
- errmsg.LogError(NO_ERRCODE, "Option block not terminated in gssapi forward action.");
+ errmsg.LogError(0, NO_ERRCODE, "Option block not terminated in gssapi forward action.");
}
/* extract the host first (we do a trick - we replace the ';' or ':' with a '\0')
* now skip to port and then template name. rgerhards 2005-07-06
@@ -548,7 +548,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
/* SKIP AND COUNT */;
pData->port = malloc(i + 1);
if(pData->port == NULL) {
- errmsg.LogError(NO_ERRCODE, "Could not get memory to store syslog forwarding port, "
+ errmsg.LogError(0, NO_ERRCODE, "Could not get memory to store syslog forwarding port, "
"using default port, results may not be what you intend\n");
/* we leave f_forw.port set to NULL, this is then handled by
* getFwdSyslogPt().
@@ -566,7 +566,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
if(bErr == 0) { /* only 1 error msg! */
bErr = 1;
errno = 0;
- errmsg.LogError(NO_ERRCODE, "invalid selector line (port), probably not doing "
+ errmsg.LogError(0, NO_ERRCODE, "invalid selector line (port), probably not doing "
"what was intended");
}
}
@@ -646,7 +646,7 @@ static rsRetVal setGSSMode(void __attribute__((unused)) *pVal, uchar *mode)
gss_mode = GSSMODE_ENC;
dbgprintf("GSS-API gssmode set to GSSMODE_ENC\n");
} else {
- errmsg.LogError(NO_ERRCODE, "unknown gssmode parameter: %s", (char *) mode);
+ errmsg.LogError(0, RS_RET_INVALID_PARAMS, "unknown gssmode parameter: %s", (char *) mode);
iRet = RS_RET_INVALID_PARAMS;
}
free(mode);
diff --git a/plugins/ommysql/ommysql.c b/plugins/ommysql/ommysql.c
index 472cb10d..e69ab40b 100644
--- a/plugins/ommysql/ommysql.c
+++ b/plugins/ommysql/ommysql.c
@@ -115,7 +115,7 @@ static void reportDBError(instanceData *pData, int bSilent)
/* output log message */
errno = 0;
if(pData->f_hmysql == NULL) {
- errmsg.LogError(NO_ERRCODE, "unknown DB error occured - could not obtain MySQL handle");
+ errmsg.LogError(0, NO_ERRCODE, "unknown DB error occured - could not obtain MySQL handle");
} else { /* we can ask mysql for the error description... */
uMySQLErrno = mysql_errno(pData->f_hmysql);
snprintf(errMsg, sizeof(errMsg)/sizeof(char), "db error (%d): %s\n", uMySQLErrno,
@@ -124,7 +124,7 @@ static void reportDBError(instanceData *pData, int bSilent)
dbgprintf("mysql, DBError(silent): %s\n", errMsg);
else {
pData->uLastMySQLErrno = uMySQLErrno;
- errmsg.LogError(NO_ERRCODE, "%s", errMsg);
+ errmsg.LogError(0, NO_ERRCODE, "%s", errMsg);
}
}
@@ -145,7 +145,7 @@ static rsRetVal initMySQL(instanceData *pData, int bSilent)
pData->f_hmysql = mysql_init(NULL);
if(pData->f_hmysql == NULL) {
- errmsg.LogError(NO_ERRCODE, "can not initialize MySQL handle");
+ errmsg.LogError(0, RS_RET_SUSPENDED, "can not initialize MySQL handle");
iRet = RS_RET_SUSPENDED;
} else { /* we could get the handle, now on with work... */
/* Connect to database */
@@ -270,7 +270,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
* Retries make no sense.
*/
if (iMySQLPropErr) {
- errmsg.LogError(NO_ERRCODE, "Trouble with MySQL connection properties. -MySQL logging disabled");
+ errmsg.LogError(0, RS_RET_INVALID_PARAMS, "Trouble with MySQL connection properties. -MySQL logging disabled");
ABORT_FINALIZE(RS_RET_INVALID_PARAMS);
} else {
pData->f_hmysql = NULL; /* initialize, but connect only on first message (important for queued mode!) */
diff --git a/plugins/ompgsql/ompgsql.c b/plugins/ompgsql/ompgsql.c
index 77fd6a07..f8685672 100644
--- a/plugins/ompgsql/ompgsql.c
+++ b/plugins/ompgsql/ompgsql.c
@@ -113,7 +113,7 @@ static void reportDBError(instanceData *pData, int bSilent)
/* output log message */
errno = 0;
if(pData->f_hpgsql == NULL) {
- errmsg.LogError(NO_ERRCODE, "unknown DB error occured - could not obtain PgSQL handle");
+ errmsg.LogError(0, NO_ERRCODE, "unknown DB error occured - could not obtain PgSQL handle");
} else { /* we can ask pgsql for the error description... */
ePgSQLStatus = PQstatus(pData->f_hpgsql);
snprintf(errMsg, sizeof(errMsg)/sizeof(char), "db error (%d): %s\n", ePgSQLStatus,
@@ -122,7 +122,7 @@ static void reportDBError(instanceData *pData, int bSilent)
dbgprintf("pgsql, DBError(silent): %s\n", errMsg);
else {
pData->eLastPgSQLStatus = ePgSQLStatus;
- errmsg.LogError(NO_ERRCODE, "%s", errMsg);
+ errmsg.LogError(0, NO_ERRCODE, "%s", errMsg);
}
}
@@ -264,7 +264,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
* Retries make no sense.
*/
if (iPgSQLPropErr) {
- errmsg.LogError(NO_ERRCODE, "Trouble with PgSQL connection properties. -PgSQL logging disabled");
+ errmsg.LogError(0, RS_RET_INVALID_PARAMS, "Trouble with PgSQL connection properties. -PgSQL logging disabled");
ABORT_FINALIZE(RS_RET_INVALID_PARAMS);
} else {
CHKiRet(initPgSQL(pData, 0));
diff --git a/plugins/omrelp/omrelp.c b/plugins/omrelp/omrelp.c
index 2977053a..41c72879 100644
--- a/plugins/omrelp/omrelp.c
+++ b/plugins/omrelp/omrelp.c
@@ -220,16 +220,16 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
++p; /* eat */
pData->compressionLevel = iLevel;
} else {
- errmsg.LogError(NO_ERRCODE, "Invalid compression level '%c' specified in "
+ errmsg.LogError(0, NO_ERRCODE, "Invalid compression level '%c' specified in "
"forwardig action - NOT turning on compression.",
*p);
}
# else
- errmsg.LogError(NO_ERRCODE, "Compression requested, but rsyslogd is not compiled "
+ errmsg.LogError(0, NO_ERRCODE, "Compression requested, but rsyslogd is not compiled "
"with compression support - request ignored.");
# endif /* #ifdef USE_NETZIP */
} else { /* invalid option! Just skip it... */
- errmsg.LogError(NO_ERRCODE, "Invalid option %c in forwarding action - ignoring.", *p);
+ errmsg.LogError(0, NO_ERRCODE, "Invalid option %c in forwarding action - ignoring.", *p);
++p; /* eat invalid option */
}
/* the option processing is done. We now do a generic skip
@@ -245,7 +245,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
/* we probably have end of string - leave it for the rest
* of the code to handle it (but warn the user)
*/
- errmsg.LogError(NO_ERRCODE, "Option block not terminated in forwarding action.");
+ errmsg.LogError(0, NO_ERRCODE, "Option block not terminated in forwarding action.");
}
/* extract the host first (we do a trick - we replace the ';' or ':' with a '\0')
* now skip to port and then template name. rgerhards 2005-07-06
@@ -263,7 +263,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
/* SKIP AND COUNT */;
pData->port = malloc(i + 1);
if(pData->port == NULL) {
- errmsg.LogError(NO_ERRCODE, "Could not get memory to store relp port, "
+ errmsg.LogError(0, NO_ERRCODE, "Could not get memory to store relp port, "
"using default port, results may not be what you intend\n");
/* we leave f_forw.port set to NULL, this is then handled by getRelpPt() */
} else {
@@ -279,7 +279,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
if(bErr == 0) { /* only 1 error msg! */
bErr = 1;
errno = 0;
- errmsg.LogError(NO_ERRCODE, "invalid selector line (port), probably not doing "
+ errmsg.LogError(0, NO_ERRCODE, "invalid selector line (port), probably not doing "
"what was intended");
}
}
diff --git a/runtime/cfsysline.c b/runtime/cfsysline.c
index ef21fb4b..18643ba5 100644
--- a/runtime/cfsysline.c
+++ b/runtime/cfsysline.c
@@ -69,7 +69,7 @@ static rsRetVal doGetChar(uchar **pp, rsRetVal (*pSetHdlr)(void*, uid_t), void *
/* if we are not at a '\0', we have our new char - no validity checks here... */
if(**pp == '\0') {
- errmsg.LogError(NO_ERRCODE, "No character available");
+ errmsg.LogError(0, RS_RET_NOT_FOUND, "No character available");
iRet = RS_RET_NOT_FOUND;
} else {
if(pSetHdlr == NULL) {
@@ -133,7 +133,7 @@ static rsRetVal parseIntVal(uchar **pp, int64 *pVal)
if(!isdigit((int) *p)) {
errno = 0;
- errmsg.LogError(NO_ERRCODE, "invalid number");
+ errmsg.LogError(0, RS_RET_INVALID_INT, "invalid number");
ABORT_FINALIZE(RS_RET_INVALID_INT);
}
@@ -272,7 +272,7 @@ static rsRetVal doFileCreateMode(uchar **pp, rsRetVal (*pSetHdlr)(void*, uid_t),
snprintf((char*) errMsg, sizeof(errMsg)/sizeof(uchar),
"value must be octal (e.g 0644).");
errno = 0;
- errmsg.LogError(NO_ERRCODE, "%s", errMsg);
+ errmsg.LogError(0, RS_RET_INVALID_VALUE, "%s", errMsg);
ABORT_FINALIZE(RS_RET_INVALID_VALUE);
}
@@ -317,7 +317,7 @@ static int doParseOnOffOption(uchar **pp)
skipWhiteSpace(pp); /* skip over any whitespace */
if(getSubString(pp, (char*) szOpt, sizeof(szOpt) / sizeof(uchar), ' ') != 0) {
- errmsg.LogError(NO_ERRCODE, "Invalid $-configline - could not extract on/off option");
+ errmsg.LogError(0, NO_ERRCODE, "Invalid $-configline - could not extract on/off option");
return -1;
}
@@ -326,7 +326,7 @@ static int doParseOnOffOption(uchar **pp)
} else if(!strcmp((char*)szOpt, "off")) {
return 0;
} else {
- errmsg.LogError(NO_ERRCODE, "Option value must be on or off, but is '%s'", (char*)pOptStart);
+ errmsg.LogError(0, NO_ERRCODE, "Option value must be on or off, but is '%s'", (char*)pOptStart);
return -1;
}
}
@@ -347,14 +347,14 @@ static rsRetVal doGetGID(uchar **pp, rsRetVal (*pSetHdlr)(void*, uid_t), void *p
assert(*pp != NULL);
if(getSubString(pp, (char*) szName, sizeof(szName) / sizeof(uchar), ' ') != 0) {
- errmsg.LogError(NO_ERRCODE, "could not extract group name");
+ errmsg.LogError(0, RS_RET_NOT_FOUND, "could not extract group name");
ABORT_FINALIZE(RS_RET_NOT_FOUND);
}
getgrnam_r((char*)szName, &gBuf, stringBuf, sizeof(stringBuf), &pgBuf);
if(pgBuf == NULL) {
- errmsg.LogError(NO_ERRCODE, "ID for group '%s' could not be found or error", (char*)szName);
+ errmsg.LogError(0, RS_RET_NOT_FOUND, "ID for group '%s' could not be found or error", (char*)szName);
iRet = RS_RET_NOT_FOUND;
} else {
if(pSetHdlr == NULL) {
@@ -389,14 +389,14 @@ static rsRetVal doGetUID(uchar **pp, rsRetVal (*pSetHdlr)(void*, uid_t), void *p
assert(*pp != NULL);
if(getSubString(pp, (char*) szName, sizeof(szName) / sizeof(uchar), ' ') != 0) {
- errmsg.LogError(NO_ERRCODE, "could not extract user name");
+ errmsg.LogError(0, RS_RET_NOT_FOUND, "could not extract user name");
ABORT_FINALIZE(RS_RET_NOT_FOUND);
}
getpwnam_r((char*)szName, &pwBuf, stringBuf, sizeof(stringBuf), &ppwBuf);
if(ppwBuf == NULL) {
- errmsg.LogError(NO_ERRCODE, "ID for user '%s' could not be found or error", (char*)szName);
+ errmsg.LogError(0, RS_RET_NOT_FOUND, "ID for user '%s' could not be found or error", (char*)szName);
iRet = RS_RET_NOT_FOUND;
} else {
if(pSetHdlr == NULL) {
@@ -911,7 +911,7 @@ rsRetVal processCfSysLineCommand(uchar *pCmdName, uchar **p)
iRet = llFind(&llCmdList, (void *) pCmdName, (void*) &pCmd);
if(iRet == RS_RET_NOT_FOUND) {
- errmsg.LogError(NO_ERRCODE, "invalid or yet-unknown config file command - have you forgotten to load a module?");
+ errmsg.LogError(0, RS_RET_NOT_FOUND, "invalid or yet-unknown config file command - have you forgotten to load a module?");
}
if(iRet != RS_RET_OK)
diff --git a/runtime/conf.c b/runtime/conf.c
index b24083d3..a0a2b080 100644
--- a/runtime/conf.c
+++ b/runtime/conf.c
@@ -120,7 +120,7 @@ static rsRetVal doIncludeDirectory(uchar *pDirName)
ASSERT(pDirName != NULL);
if((pDir = opendir((char*) pDirName)) == NULL) {
- errmsg.LogError(NO_ERRCODE, "error opening include directory");
+ errmsg.LogError(errno, RS_RET_FOPEN_FAILURE, "error opening include directory");
ABORT_FINALIZE(RS_RET_FOPEN_FAILURE);
}
@@ -195,7 +195,7 @@ doIncludeLine(uchar **pp, __attribute__((unused)) void* pVal)
ASSERT(*pp != NULL);
if(getSubString(pp, (char*) pattern, sizeof(pattern) / sizeof(char), ' ') != 0) {
- errmsg.LogError(NO_ERRCODE, "could not extract group name");
+ errmsg.LogError(0, RS_RET_NOT_FOUND, "could not extract group name");
ABORT_FINALIZE(RS_RET_NOT_FOUND);
}
@@ -242,7 +242,7 @@ doModLoad(uchar **pp, __attribute__((unused)) void* pVal)
skipWhiteSpace(pp); /* skip over any whitespace */
if(getSubString(pp, (char*) szName, sizeof(szName) / sizeof(uchar), ' ') != 0) {
- errmsg.LogError(NO_ERRCODE, "could not extract module name");
+ errmsg.LogError(0, RS_RET_NOT_FOUND, "could not extract module name");
ABORT_FINALIZE(RS_RET_NOT_FOUND);
}
skipWhiteSpace(pp); /* skip over any whitespace */
@@ -289,7 +289,7 @@ doNameLine(uchar **pp, void* pVal)
eDir = (enum eDirective) pVal; /* this time, it actually is NOT a pointer! */
if(getSubString(&p, szName, sizeof(szName) / sizeof(char), ',') != 0) {
- errmsg.LogError(NO_ERRCODE, "Invalid config line: could not extract name - line ignored");
+ errmsg.LogError(0, RS_RET_NOT_FOUND, "Invalid config line: could not extract name - line ignored");
ABORT_FINALIZE(RS_RET_NOT_FOUND);
}
if(*p == ',')
@@ -338,12 +338,11 @@ cfsysline(uchar *p)
{
DEFiRet;
uchar szCmd[64];
- uchar errMsg[128]; /* for dynamic error messages */
ASSERT(p != NULL);
errno = 0;
if(getSubString(&p, (char*) szCmd, sizeof(szCmd) / sizeof(uchar), ' ') != 0) {
- errmsg.LogError(NO_ERRCODE, "Invalid $-configline - could not extract command - line ignored\n");
+ errmsg.LogError(0, RS_RET_NOT_FOUND, "Invalid $-configline - could not extract command - line ignored\n");
ABORT_FINALIZE(RS_RET_NOT_FOUND);
}
@@ -361,10 +360,8 @@ cfsysline(uchar *p)
skipWhiteSpace(&p);
if(*p && *p != '#') { /* we have a non-whitespace, so let's complain */
- snprintf((char*) errMsg, sizeof(errMsg)/sizeof(uchar),
+ errmsg.LogError(0, NO_ERRCODE,
"error: extra characters in config line ignored: '%s'", p);
- errno = 0;
- errmsg.LogError(NO_ERRCODE, "%s", errMsg);
}
finalize_it:
@@ -448,7 +445,7 @@ processConfFile(uchar *pConfFile)
dbgprintf("config line NOT successfully processed\n");
snprintf((char*)szErrLoc, sizeof(szErrLoc) / sizeof(uchar),
"%s, line %d", pConfFile, iLnNbr);
- errmsg.LogError(NO_ERRCODE, "the last error occured in %s", (char*)szErrLoc);
+ errmsg.LogError(0, NO_ERRCODE, "the last error occured in %s", (char*)szErrLoc);
}
}
@@ -497,7 +494,7 @@ rsRetVal cflineParseTemplateName(uchar** pp, omodStringRequest_t *pOMSR, int iEn
if(*p == ';')
++p; /* eat it */
else if(*p != '\0' && *p != '#') {
- errmsg.LogError(NO_ERRCODE, "invalid character in selector line - ';template' expected");
+ errmsg.LogError(0, NO_ERRCODE, "invalid character in selector line - ';template' expected");
iRet = RS_RET_ERR;
goto finalize_it;
}
@@ -639,7 +636,7 @@ static rsRetVal cflineProcessTradPRIFilter(uchar **pline, register selector_t *f
if (pri < 0) {
snprintf((char*) xbuf, sizeof(xbuf), "unknown priority name \"%s\"", buf);
- errmsg.LogError(NO_ERRCODE, "%s", xbuf);
+ errmsg.LogError(0, RS_RET_ERR, "%s", xbuf);
return RS_RET_ERR;
}
@@ -686,7 +683,7 @@ static rsRetVal cflineProcessTradPRIFilter(uchar **pline, register selector_t *f
if (i < 0) {
snprintf((char*) xbuf, sizeof(xbuf), "unknown facility name \"%s\"", buf);
- errmsg.LogError(NO_ERRCODE, "%s", xbuf);
+ errmsg.LogError(0, RS_RET_ERR, "%s", xbuf);
return RS_RET_ERR;
}
@@ -792,7 +789,7 @@ dbgprintf("calling expression parser, pp %p ('%s')\n", *pline, *pline);
finalize_it:
if(iRet == RS_RET_SYNTAX_ERROR) {
- errmsg.LogError(NO_ERRCODE, "syntax error in expression");
+ errmsg.LogError(0, RS_RET_SYNTAX_ERROR, "syntax error in expression");
}
RETiRet;
@@ -822,14 +819,14 @@ static rsRetVal cflineProcessPropFilter(uchar **pline, register selector_t *f)
/* create parser object starting with line string without leading colon */
if((iRet = rsParsConstructFromSz(&pPars, (*pline)+1)) != RS_RET_OK) {
- errmsg.LogError(NO_ERRCODE, "Error %d constructing parser object - ignoring selector", iRet);
+ errmsg.LogError(0, iRet, "Error %d constructing parser object - ignoring selector", iRet);
return(iRet);
}
/* read property */
iRet = parsDelimCStr(pPars, &f->f_filterData.prop.pCSPropName, ',', 1, 1, 1);
if(iRet != RS_RET_OK) {
- errmsg.LogError(NO_ERRCODE, "error %d parsing filter property - ignoring selector", iRet);
+ errmsg.LogError(0, iRet, "error %d parsing filter property - ignoring selector", iRet);
rsParsDestruct(pPars);
return(iRet);
}
@@ -837,7 +834,7 @@ static rsRetVal cflineProcessPropFilter(uchar **pline, register selector_t *f)
/* read operation */
iRet = parsDelimCStr(pPars, &pCSCompOp, ',', 1, 1, 1);
if(iRet != RS_RET_OK) {
- errmsg.LogError(NO_ERRCODE, "error %d compare operation property - ignoring selector", iRet);
+ errmsg.LogError(0, iRet, "error %d compare operation property - ignoring selector", iRet);
rsParsDestruct(pPars);
return(iRet);
}
@@ -869,7 +866,7 @@ static rsRetVal cflineProcessPropFilter(uchar **pline, register selector_t *f)
} else if(!rsCStrOffsetSzStrCmp(pCSCompOp, iOffset, (unsigned char*) "regex", 5)) {
f->f_filterData.prop.operation = FIOP_REGEX;
} else {
- errmsg.LogError(NO_ERRCODE, "error: invalid compare operation '%s' - ignoring selector",
+ errmsg.LogError(0, NO_ERRCODE, "error: invalid compare operation '%s' - ignoring selector",
(char*) rsCStrGetSzStrNoNULL(pCSCompOp));
}
rsCStrDestruct(&pCSCompOp); /* no longer needed */
@@ -877,14 +874,14 @@ static rsRetVal cflineProcessPropFilter(uchar **pline, register selector_t *f)
/* read compare value */
iRet = parsQuotedCStr(pPars, &f->f_filterData.prop.pCSCompValue);
if(iRet != RS_RET_OK) {
- errmsg.LogError(NO_ERRCODE, "error %d compare value property - ignoring selector", iRet);
+ errmsg.LogError(0, iRet, "error %d compare value property - ignoring selector", iRet);
rsParsDestruct(pPars);
return(iRet);
}
/* skip to action part */
if((iRet = parsSkipWhitespace(pPars)) != RS_RET_OK) {
- errmsg.LogError(NO_ERRCODE, "error %d skipping to action part - ignoring selector", iRet);
+ errmsg.LogError(0, iRet, "error %d skipping to action part - ignoring selector", iRet);
rsParsDestruct(pPars);
return(iRet);
}
diff --git a/runtime/errmsg.c b/runtime/errmsg.c
index 1744c902..dc09fc03 100644
--- a/runtime/errmsg.c
+++ b/runtime/errmsg.c
@@ -46,11 +46,18 @@ DEFobjStaticHelpers
/* ------------------------------ methods ------------------------------ */
-/* TODO: restructure this code some time. Especially look if we need
- * to check errno and, if so, how to do that in a clean way.
+/* We now receive three parameters: one is the internal error code
+ * which will also become the error message number, the second is
+ * errno - if it is non-zero, the corresponding error message is included
+ * in the text and finally the message text itself. Note that it is not
+ * 100% clean to use the internal errcode, as it may be reached from
+ * multiple actual error causes. However, it is much better than having
+ * no error code at all (and in most cases, a single internal error code
+ * maps to a specific error event).
+ * rgerhards, 2008-06-27
*/
-static void __attribute__((format(printf, 2, 3)))
-LogError(int __attribute__((unused)) iErrCode, char *fmt, ... )
+static void __attribute__((format(printf, 3, 4)))
+LogError(int iErrno, int iErrCode, char *fmt, ... )
{
va_list ap;
char buf[1024];
@@ -74,16 +81,25 @@ LogError(int __attribute__((unused)) iErrCode, char *fmt, ... )
dbgprintf("Called LogError, msg: %s\n", buf);
- if (errno == 0) {
- snprintf(msg, sizeof(msg), "%s", buf);
+ if(iErrno != 0) {
+ rs_strerror_r(iErrno, errStr, sizeof(errStr));
+ if(iErrCode == NO_ERRCODE) {
+ snprintf(msg, sizeof(msg), "%s: %s", buf, errStr);
+ } else {
+ snprintf(msg, sizeof(msg), "%s: %s [try http://www.rsyslog.com/e/%d ]", buf, errStr, iErrCode * -1);
+ }
} else {
- rs_strerror_r(errno, errStr, sizeof(errStr));
- snprintf(msg, sizeof(msg), "%s: %s", buf, errStr);
+ if(iErrCode == NO_ERRCODE) {
+ snprintf(msg, sizeof(msg), "%s", buf);
+ } else {
+ snprintf(msg, sizeof(msg), "%s [try http://www.rsyslog.com/e/%d ]", buf, iErrCode * -1);
+ }
}
msg[sizeof(msg)/sizeof(char) - 1] = '\0'; /* just to be on the safe side... */
errno = 0;
- glblErrLogger((uchar*)msg);
+dbgprintf("LogError logging error '%s', code %d\n", msg, iErrCode);
+ glblErrLogger(iErrCode, (uchar*)msg);
ENDfunc
}
diff --git a/runtime/errmsg.h b/runtime/errmsg.h
index bde6bcff..799954fb 100644
--- a/runtime/errmsg.h
+++ b/runtime/errmsg.h
@@ -35,7 +35,7 @@ typedef struct errmsg_s {
/* interfaces */
BEGINinterface(errmsg) /* name must also be changed in ENDinterface macro! */
- void __attribute__((format(printf, 2, 3))) (*LogError)(int iErrCode, char *pszErrFmt, ... );
+ void __attribute__((format(printf, 3, 4))) (*LogError)(int iErrno, int iErrCode, char *pszErrFmt, ... );
ENDinterface(errmsg)
#define errmsgCURR_IF_VERSION 1 /* increment whenever you change the interface structure! */
diff --git a/runtime/modules.c b/runtime/modules.c
index 502e6525..ceb4768c 100644
--- a/runtime/modules.c
+++ b/runtime/modules.c
@@ -604,7 +604,7 @@ Load(uchar *pModName)
szPath[iPathLen++] = '/';
szPath[iPathLen] = '\0';
} else {
- errmsg.LogError(NO_ERRCODE, "could not load module '%s', path too long\n", pModName);
+ errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_PATHLEN, "could not load module '%s', path too long\n", pModName);
ABORT_FINALIZE(RS_RET_MODULE_LOAD_ERR_PATHLEN);
}
}
@@ -625,23 +625,23 @@ Load(uchar *pModName)
}
if(iPathLen + strlen((char*) pModName) >= sizeof(szPath)) {
- errmsg.LogError(NO_ERRCODE, "could not load module '%s', path too long\n", pModName);
+ errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_PATHLEN, "could not load module '%s', path too long\n", pModName);
ABORT_FINALIZE(RS_RET_MODULE_LOAD_ERR_PATHLEN);
}
/* complete load path constructed, so ... GO! */
dbgprintf("loading module '%s'\n", szPath);
if(!(pModHdlr = dlopen((char *) szPath, RTLD_NOW))) {
- errmsg.LogError(NO_ERRCODE, "could not load module '%s', dlopen: %s\n", szPath, dlerror());
+ errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_DLOPEN, "could not load module '%s', dlopen: %s\n", szPath, dlerror());
ABORT_FINALIZE(RS_RET_MODULE_LOAD_ERR_DLOPEN);
}
if(!(pModInit = dlsym(pModHdlr, "modInit"))) {
- errmsg.LogError(NO_ERRCODE, "could not load module '%s', dlsym: %s\n", szPath, dlerror());
+ errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_NO_INIT, "could not load module '%s', dlsym: %s\n", szPath, dlerror());
dlclose(pModHdlr);
ABORT_FINALIZE(RS_RET_MODULE_LOAD_ERR_NO_INIT);
}
if((iRet = doModInit(pModInit, (uchar*) pModName, pModHdlr)) != RS_RET_OK) {
- errmsg.LogError(NO_ERRCODE, "could not load module '%s', rsyslog error %d\n", szPath, iRet);
+ errmsg.LogError(0, RS_RET_MODULE_LOAD_ERR_INIT_FAILED, "could not load module '%s', rsyslog error %d\n", szPath, iRet);
dlclose(pModHdlr);
ABORT_FINALIZE(RS_RET_MODULE_LOAD_ERR_INIT_FAILED);
}
diff --git a/runtime/net.c b/runtime/net.c
index c3252269..f5b8f46a 100644
--- a/runtime/net.c
+++ b/runtime/net.c
@@ -305,7 +305,7 @@ PermittedPeerWildcardCompile(permittedPeers_t *pPeer)
finalize_it:
if(iRet != RS_RET_OK) {
- errmsg.LogError(NO_ERRCODE, "error compiling wildcard expression '%s'",
+ errmsg.LogError(0, iRet, "error compiling wildcard expression '%s'",
pPeer->pszID);
}
RETiRet;
@@ -531,14 +531,14 @@ static rsRetVal AddAllowedSender(struct AllowedSenders **ppRoot, struct AllowedS
/* we handle this seperatly just to provide a better
* error message.
*/
- errmsg.LogError(NO_ERRCODE, "You can not specify 0 bits of the netmask, this would "
+ errmsg.LogError(0, NO_ERRCODE, "You can not specify 0 bits of the netmask, this would "
"match ALL systems. If you really intend to do that, "
"remove all $AllowedSender directives.");
switch (iAllow->addr.NetAddr->sa_family) {
case AF_INET:
if((iSignificantBits < 1) || (iSignificantBits > 32)) {
- errmsg.LogError(NO_ERRCODE, "Invalid number of bits (%d) in IPv4 address - adjusted to 32",
+ errmsg.LogError(0, NO_ERRCODE, "Invalid number of bits (%d) in IPv4 address - adjusted to 32",
(int)iSignificantBits);
iSignificantBits = 32;
}
@@ -547,7 +547,7 @@ static rsRetVal AddAllowedSender(struct AllowedSenders **ppRoot, struct AllowedS
break;
case AF_INET6:
if((iSignificantBits < 1) || (iSignificantBits > 128)) {
- errmsg.LogError(NO_ERRCODE, "Invalid number of bits (%d) in IPv6 address - adjusted to 128",
+ errmsg.LogError(0, NO_ERRCODE, "Invalid number of bits (%d) in IPv6 address - adjusted to 128",
iSignificantBits);
iSignificantBits = 128;
}
@@ -562,7 +562,7 @@ static rsRetVal AddAllowedSender(struct AllowedSenders **ppRoot, struct AllowedS
* worst thing that happens is that one host will not be allowed to
* log.
*/
- errmsg.LogError(NO_ERRCODE, "Internal error caused AllowedSender to be ignored, AF = %d",
+ errmsg.LogError(0, NO_ERRCODE, "Internal error caused AllowedSender to be ignored, AF = %d",
iAllow->addr.NetAddr->sa_family);
ABORT_FINALIZE(RS_RET_ERR);
}
@@ -571,7 +571,7 @@ static rsRetVal AddAllowedSender(struct AllowedSenders **ppRoot, struct AllowedS
} else {
/* we need to process a hostname ACL */
if(glbl.GetDisableDNS()) {
- errmsg.LogError(NO_ERRCODE, "Ignoring hostname based ACLs because DNS is disabled.");
+ errmsg.LogError(0, NO_ERRCODE, "Ignoring hostname based ACLs because DNS is disabled.");
ABORT_FINALIZE(RS_RET_OK);
}
@@ -592,14 +592,14 @@ static rsRetVal AddAllowedSender(struct AllowedSenders **ppRoot, struct AllowedS
# endif
if (getaddrinfo (iAllow->addr.HostWildcard, NULL, &hints, &res) != 0) {
- errmsg.LogError(NO_ERRCODE, "DNS error: Can't resolve \"%s\"", iAllow->addr.HostWildcard);
+ errmsg.LogError(0, NO_ERRCODE, "DNS error: Can't resolve \"%s\"", iAllow->addr.HostWildcard);
if (ACLAddHostnameOnFail) {
- errmsg.LogError(NO_ERRCODE, "Adding hostname \"%s\" to ACL as a wildcard entry.", iAllow->addr.HostWildcard);
+ errmsg.LogError(0, NO_ERRCODE, "Adding hostname \"%s\" to ACL as a wildcard entry.", iAllow->addr.HostWildcard);
iRet = AddAllowedSenderEntry(ppRoot, ppLast, iAllow, iSignificantBits);
FINALIZE;
} else {
- errmsg.LogError(NO_ERRCODE, "Hostname \"%s\" WON\'T be added to ACL.", iAllow->addr.HostWildcard);
+ errmsg.LogError(0, NO_ERRCODE, "Hostname \"%s\" WON\'T be added to ACL.", iAllow->addr.HostWildcard);
ABORT_FINALIZE(RS_RET_NOENTRY);
}
}
@@ -756,7 +756,7 @@ rsRetVal addAllowedSenderLine(char* pName, uchar** ppRestOfConfLine)
ppLast = &pLastAllowedSenders_GSS;
#endif
} else {
- errmsg.LogError(NO_ERRCODE, "Invalid protocol '%s' in allowed sender "
+ errmsg.LogError(0, RS_RET_ERR, "Invalid protocol '%s' in allowed sender "
"list, line ignored", pName);
return RS_RET_ERR;
}
@@ -767,7 +767,7 @@ rsRetVal addAllowedSenderLine(char* pName, uchar** ppRestOfConfLine)
*/
/* create parser object starting with line string without leading colon */
if((iRet = rsParsConstructFromSz(&pPars, (uchar*) *ppRestOfConfLine) != RS_RET_OK)) {
- errmsg.LogError(NO_ERRCODE, "Error %d constructing parser object - ignoring allowed sender list", iRet);
+ errmsg.LogError(0, iRet, "Error %d constructing parser object - ignoring allowed sender list", iRet);
return(iRet);
}
@@ -776,18 +776,17 @@ rsRetVal addAllowedSenderLine(char* pName, uchar** ppRestOfConfLine)
break; /* a comment-sign stops processing of line */
/* now parse a single IP address */
if((iRet = parsAddrWithBits(pPars, &uIP, &iBits)) != RS_RET_OK) {
- errmsg.LogError(NO_ERRCODE, "Error %d parsing address in allowed sender"
+ errmsg.LogError(0, iRet, "Error %d parsing address in allowed sender"
"list - ignoring.", iRet);
rsParsDestruct(pPars);
return(iRet);
}
- if((iRet = AddAllowedSender(ppRoot, ppLast, uIP, iBits))
- != RS_RET_OK) {
- if (iRet == RS_RET_NOENTRY) {
- errmsg.LogError(NO_ERRCODE, "Error %d adding allowed sender entry "
+ if((iRet = AddAllowedSender(ppRoot, ppLast, uIP, iBits)) != RS_RET_OK) {
+ if(iRet == RS_RET_NOENTRY) {
+ errmsg.LogError(0, iRet, "Error %d adding allowed sender entry "
"- ignoring.", iRet);
} else {
- errmsg.LogError(NO_ERRCODE, "Error %d adding allowed sender entry "
+ errmsg.LogError(0, iRet, "Error %d adding allowed sender entry "
"- terminating, nothing more will be added.", iRet);
rsParsDestruct(pPars);
return(iRet);
@@ -1026,7 +1025,7 @@ gethname(struct sockaddr_storage *f, uchar *pszHostFQDN, uchar *ip)
"Malicious PTR record, message dropped "
"IP = \"%s\" HOST = \"%s\"",
ip, pszHostFQDN);
- errmsg.LogError(NO_ERRCODE, "%s", szErrMsg);
+ errmsg.LogError(0, RS_RET_MALICIOUS_ENTITY, "%s", szErrMsg);
pthread_sigmask(SIG_SETMASK, &omask, NULL);
ABORT_FINALIZE(RS_RET_MALICIOUS_ENTITY);
}
@@ -1041,7 +1040,7 @@ gethname(struct sockaddr_storage *f, uchar *pszHostFQDN, uchar *ip)
"Malicious PTR record (message accepted, but used IP "
"instead of PTR name: IP = \"%s\" HOST = \"%s\"",
ip, pszHostFQDN);
- errmsg.LogError(NO_ERRCODE, "%s", szErrMsg);
+ errmsg.LogError(0, NO_ERRCODE, "%s", szErrMsg);
error = 1; /* that will trigger using IP address below. */
}
@@ -1272,8 +1271,8 @@ int *create_udp_socket(uchar *hostname, uchar *pszPort, int bIsServer)
hints.ai_socktype = SOCK_DGRAM;
error = getaddrinfo((char*) hostname, (char*) pszPort, &hints, &res);
if(error) {
- errmsg.LogError(NO_ERRCODE, "%s", gai_strerror(error));
- errmsg.LogError(NO_ERRCODE, "UDP message reception disabled due to error logged in last message.\n");
+ errmsg.LogError(0, NO_ERRCODE, "%s", gai_strerror(error));
+ errmsg.LogError(0, NO_ERRCODE, "UDP message reception disabled due to error logged in last message.\n");
return NULL;
}
@@ -1282,7 +1281,7 @@ int *create_udp_socket(uchar *hostname, uchar *pszPort, int bIsServer)
/* EMPTY */;
socks = malloc((maxs+1) * sizeof(int));
if (socks == NULL) {
- errmsg.LogError(NO_ERRCODE, "couldn't allocate memory for UDP sockets, suspending UDP message reception");
+ errmsg.LogError(0, NO_ERRCODE, "couldn't allocate memory for UDP sockets, suspending UDP message reception");
freeaddrinfo(res);
return NULL;
}
@@ -1293,7 +1292,7 @@ int *create_udp_socket(uchar *hostname, uchar *pszPort, int bIsServer)
*s = socket(r->ai_family, r->ai_socktype, r->ai_protocol);
if (*s < 0) {
if(!(r->ai_family == PF_INET6 && errno == EAFNOSUPPORT))
- errmsg.LogError(NO_ERRCODE, "create_udp_socket(), socket");
+ errmsg.LogError(errno, NO_ERRCODE, "create_udp_socket(), socket");
/* it is debateble if PF_INET with EAFNOSUPPORT should
* also be ignored...
*/
@@ -1305,7 +1304,7 @@ int *create_udp_socket(uchar *hostname, uchar *pszPort, int bIsServer)
int ion = 1;
if (setsockopt(*s, IPPROTO_IPV6, IPV6_V6ONLY,
(char *)&ion, sizeof (ion)) < 0) {
- errmsg.LogError(NO_ERRCODE, "setsockopt");
+ errmsg.LogError(errno, NO_ERRCODE, "setsockopt");
close(*s);
*s = -1;
continue;
@@ -1322,7 +1321,7 @@ int *create_udp_socket(uchar *hostname, uchar *pszPort, int bIsServer)
*/
if (setsockopt(*s, SOL_SOCKET, SO_REUSEADDR,
(char *) &on, sizeof(on)) < 0 ) {
- errmsg.LogError(NO_ERRCODE, "setsockopt(REUSEADDR)");
+ errmsg.LogError(errno, NO_ERRCODE, "setsockopt(REUSEADDR)");
close(*s);
*s = -1;
continue;
@@ -1335,7 +1334,7 @@ int *create_udp_socket(uchar *hostname, uchar *pszPort, int bIsServer)
if (should_use_so_bsdcompat()) {
if (setsockopt(*s, SOL_SOCKET, SO_BSDCOMPAT,
(char *) &on, sizeof(on)) < 0) {
- errmsg.LogError(NO_ERRCODE, "setsockopt(BSDCOMPAT)");
+ errmsg.LogError(errno, NO_ERRCODE, "setsockopt(BSDCOMPAT)");
close(*s);
*s = -1;
continue;
@@ -1357,7 +1356,7 @@ int *create_udp_socket(uchar *hostname, uchar *pszPort, int bIsServer)
sockflags = fcntl(*s, F_SETFL, sockflags);
}
if (sockflags == -1) {
- errmsg.LogError(NO_ERRCODE, "fcntl(O_NONBLOCK)");
+ errmsg.LogError(errno, NO_ERRCODE, "fcntl(O_NONBLOCK)");
close(*s);
*s = -1;
continue;
@@ -1376,7 +1375,7 @@ int *create_udp_socket(uchar *hostname, uchar *pszPort, int bIsServer)
&& (errno != EADDRINUSE)
# endif
) {
- errmsg.LogError(NO_ERRCODE, "bind");
+ errmsg.LogError(errno, NO_ERRCODE, "bind");
close(*s);
*s = -1;
continue;
@@ -1395,7 +1394,7 @@ int *create_udp_socket(uchar *hostname, uchar *pszPort, int bIsServer)
"- this may or may not be an error indication.\n", *socks, maxs);
if(*socks == 0) {
- errmsg.LogError(NO_ERRCODE, "No UDP listen socket could successfully be initialized, "
+ errmsg.LogError(0, NO_ERRCODE, "No UDP listen socket could successfully be initialized, "
"message reception via UDP disabled.\n");
/* we do NOT need to free any sockets, because there were none... */
free(socks);
diff --git a/runtime/nsd_gtls.c b/runtime/nsd_gtls.c
index 103461e7..a80a1836 100644
--- a/runtime/nsd_gtls.c
+++ b/runtime/nsd_gtls.c
@@ -111,26 +111,26 @@ readFile(uchar *pszFile, gnutls_datum_t *pBuf)
pBuf->data = NULL;
if((fd = open((char*)pszFile, 0)) == -1) {
- errmsg.LogError(NO_ERRCODE, "can not read file '%s'", pszFile);
+ errmsg.LogError(0, RS_RET_FILE_NOT_FOUND, "can not read file '%s'", pszFile);
ABORT_FINALIZE(RS_RET_FILE_NOT_FOUND);
}
if(fstat(fd, &stat_st) == -1) {
- errmsg.LogError(NO_ERRCODE, "can not stat file '%s'", pszFile);
+ errmsg.LogError(0, RS_RET_FILE_NO_STAT, "can not stat file '%s'", pszFile);
ABORT_FINALIZE(RS_RET_FILE_NO_STAT);
}
/* 1MB limit */
if(stat_st.st_size > 1024 * 1024) {
- errmsg.LogError(NO_ERRCODE, "file '%s' too large, max 1MB", pszFile);
+ errmsg.LogError(0, RS_RET_FILE_TOO_LARGE, "file '%s' too large, max 1MB", pszFile);
ABORT_FINALIZE(RS_RET_FILE_TOO_LARGE);
}
CHKmalloc(pBuf->data = malloc(stat_st.st_size));
pBuf->size = stat_st.st_size;
if(read(fd, pBuf->data, stat_st.st_size) != stat_st.st_size) {
- errmsg.LogError(NO_ERRCODE, "error or incomplete read of file '%s'", pszFile);
+ errmsg.LogError(0, RS_RET_IO_ERROR, "error or incomplete read of file '%s'", pszFile);
ABORT_FINALIZE(RS_RET_IO_ERROR);
}
@@ -530,7 +530,7 @@ finalize_it:
if(iRet != RS_RET_OK) {
pGnuErr = gtlsStrerror(gnuRet);
errno = 0;
- errmsg.LogError(NO_ERRCODE, "error adding our certificate. GnuTLS error %d, message: '%s', "
+ errmsg.LogError(0, iRet, "error adding our certificate. GnuTLS error %d, message: '%s', "
"key: '%s', cert: '%s'\n", gnuRet, pGnuErr, keyFile, certFile);
free(pGnuErr);
}
@@ -762,7 +762,7 @@ gtlsChkPeerFingerprint(nsd_gtls_t *pThis, gnutls_x509_crt *pCert)
dbgprintf("invalid peer fingerprint, not permitted to talk to it\n");
if(pThis->bReportAuthErr == 1) {
errno = 0;
- errmsg.LogError(NO_ERRCODE, "error: peer fingerprint '%s' unknown - we are "
+ errmsg.LogError(0, RS_RET_INVALID_FINGERPRINT, "error: peer fingerprint '%s' unknown - we are "
"not permitted to talk to it", rsCStrGetSzStr(pstrFingerprint));
pThis->bReportAuthErr = 0;
}
@@ -870,7 +870,7 @@ gtlsChkPeerName(nsd_gtls_t *pThis, gnutls_x509_crt *pCert)
if(pThis->bReportAuthErr == 1) {
CHKiRet(rsCStrFinish(pStr));
errno = 0;
- errmsg.LogError(NO_ERRCODE, "error: peer name not authorized - "
+ errmsg.LogError(0, RS_RET_INVALID_FINGERPRINT, "error: peer name not authorized - "
"not permitted to talk to it. Names: %s",
rsCStrGetSzStr(pStr));
pThis->bReportAuthErr = 0;
@@ -913,7 +913,7 @@ gtlsChkPeerID(nsd_gtls_t *pThis)
if(list_size < 1) {
if(pThis->bReportAuthErr == 1) {
errno = 0;
- errmsg.LogError(NO_ERRCODE, "error: peer did not provide a certificate, "
+ errmsg.LogError(0, RS_RET_TLS_NO_CERT, "error: peer did not provide a certificate, "
"not permitted to talk to it");
pThis->bReportAuthErr = 0;
}
@@ -970,7 +970,7 @@ gtlsChkPeerCertValidity(nsd_gtls_t *pThis)
cert_list = gnutls_certificate_get_peers(pThis->sess, &cert_list_size);
if(cert_list_size < 1) {
errno = 0;
- errmsg.LogError(NO_ERRCODE, "peer did not provide a certificate, not permitted to talk to it");
+ errmsg.LogError(0, RS_RET_TLS_NO_CERT, "peer did not provide a certificate, not permitted to talk to it");
ABORT_FINALIZE(RS_RET_TLS_NO_CERT);
}
@@ -991,11 +991,10 @@ gtlsChkPeerCertValidity(nsd_gtls_t *pThis)
dbgprintf("GnuTLS returned no specific reason for GNUTLS_CERT_INVALID, certificate "
"status is %d\n", stateCert);
}
- errno = 0; /* get rid of errno based message expansion on LogError */
- errmsg.LogError(NO_ERRCODE, "not permitted to talk to peer, certificate invalid: %s",
+ errmsg.LogError(0, NO_ERRCODE, "not permitted to talk to peer, certificate invalid: %s",
pszErrCause);
gtlsGetCertInfo(pThis, &pStr);
- errmsg.LogError(NO_ERRCODE, "invalid cert info: %s", rsCStrGetSzStr(pStr));
+ errmsg.LogError(0, NO_ERRCODE, "invalid cert info: %s", rsCStrGetSzStr(pStr));
rsCStrDestruct(&pStr);
ABORT_FINALIZE(RS_RET_CERT_INVALID);
}
@@ -1015,9 +1014,9 @@ gtlsChkPeerCertValidity(nsd_gtls_t *pThis)
if(ttCert == -1)
ABORT_FINALIZE(RS_RET_TLS_CERT_ERR);
else if(ttCert > ttNow) {
- errmsg.LogError(NO_ERRCODE, "not permitted to talk to peer: certificate %d not yet active", i);
+ errmsg.LogError(0, RS_RET_CERT_NOT_YET_ACTIVE, "not permitted to talk to peer: certificate %d not yet active", i);
gtlsGetCertInfo(pThis, &pStr);
- errmsg.LogError(NO_ERRCODE, "invalid cert info: %s", rsCStrGetSzStr(pStr));
+ errmsg.LogError(0, RS_RET_CERT_NOT_YET_ACTIVE, "invalid cert info: %s", rsCStrGetSzStr(pStr));
rsCStrDestruct(&pStr);
ABORT_FINALIZE(RS_RET_CERT_NOT_YET_ACTIVE);
}
@@ -1026,9 +1025,9 @@ gtlsChkPeerCertValidity(nsd_gtls_t *pThis)
if(ttCert == -1)
ABORT_FINALIZE(RS_RET_TLS_CERT_ERR);
else if(ttCert < ttNow) {
- errmsg.LogError(NO_ERRCODE, "not permitted to talk to peer: certificate %d expired", i);
+ errmsg.LogError(0, RS_RET_CERT_EXPIRED, "not permitted to talk to peer: certificate %d expired", i);
gtlsGetCertInfo(pThis, &pStr);
- errmsg.LogError(NO_ERRCODE, "invalid cert info: %s", rsCStrGetSzStr(pStr));
+ errmsg.LogError(0, RS_RET_CERT_EXPIRED, "invalid cert info: %s", rsCStrGetSzStr(pStr));
rsCStrDestruct(&pStr);
ABORT_FINALIZE(RS_RET_CERT_EXPIRED);
}
@@ -1174,7 +1173,7 @@ SetMode(nsd_t *pNsd, int mode)
ISOBJ_TYPE_assert((pThis), nsd_gtls);
if(mode != 0 && mode != 1) {
- errmsg.LogError(NO_ERRCODE, "error: driver mode %d not supported by "
+ errmsg.LogError(0, RS_RET_INVALID_DRVR_MODE, "error: driver mode %d not supported by "
"gtls netstream driver", mode);
ABORT_FINALIZE(RS_RET_INVALID_DRVR_MODE);
}
@@ -1210,7 +1209,7 @@ SetAuthMode(nsd_t *pNsd, uchar *mode)
} else if(!strcasecmp((char*) mode, "anon")) {
pThis->authMode = GTLS_AUTH_CERTANON;
} else {
- errmsg.LogError(NO_ERRCODE, "error: authentication mode '%s' not supported by "
+ errmsg.LogError(0, RS_RET_VALUE_NOT_SUPPORTED, "error: authentication mode '%s' not supported by "
"gtls netstream driver", mode);
ABORT_FINALIZE(RS_RET_VALUE_NOT_SUPPORTED);
}
@@ -1237,7 +1236,7 @@ SetPermPeers(nsd_t *pNsd, permittedPeers_t *pPermPeers)
FINALIZE;
if(pThis->authMode != GTLS_AUTH_CERTFINGERPRINT && pThis->authMode != GTLS_AUTH_CERTNAME) {
- errmsg.LogError(NO_ERRCODE, "authentication not supported by "
+ errmsg.LogError(0, RS_RET_VALUE_NOT_IN_THIS_MODE, "authentication not supported by "
"gtls netstream driver in the configured authentication mode - ignored");
ABORT_FINALIZE(RS_RET_VALUE_NOT_IN_THIS_MODE);
}
diff --git a/runtime/nsd_ptcp.c b/runtime/nsd_ptcp.c
index 93be8081..c3899f83 100644
--- a/runtime/nsd_ptcp.c
+++ b/runtime/nsd_ptcp.c
@@ -120,7 +120,7 @@ SetMode(nsd_t __attribute__((unused)) *pNsd, int mode)
{
DEFiRet;
if(mode != 0) {
- errmsg.LogError(NO_ERRCODE, "error: driver mode %d not supported by "
+ errmsg.LogError(0, RS_RET_INVALID_DRVR_MODE, "error: driver mode %d not supported by "
"ptcp netstream driver", mode);
ABORT_FINALIZE(RS_RET_INVALID_DRVR_MODE);
}
@@ -143,7 +143,7 @@ SetAuthMode(nsd_t __attribute__((unused)) *pNsd, uchar *mode)
{
DEFiRet;
if(mode != NULL && strcasecmp((char*)mode, "anon")) {
- errmsg.LogError(NO_ERRCODE, "error: authentication mode '%s' not supported by "
+ errmsg.LogError(0, RS_RET_VALUE_NOT_SUPPORTED, "error: authentication mode '%s' not supported by "
"ptcp netstream driver", mode);
ABORT_FINALIZE(RS_RET_VALUE_NOT_SUPPORTED);
}
@@ -163,7 +163,7 @@ SetPermPeers(nsd_t __attribute__((unused)) *pNsd, permittedPeers_t __attribute__
DEFiRet;
if(pPermPeers != NULL) {
- errmsg.LogError(NO_ERRCODE, "authentication not supported by ptcp netstream driver");
+ errmsg.LogError(0, RS_RET_VALUE_NOT_IN_THIS_MODE, "authentication not supported by ptcp netstream driver");
ABORT_FINALIZE(RS_RET_VALUE_NOT_IN_THIS_MODE);
}
@@ -443,7 +443,7 @@ LstnInit(netstrms_t *pNS, void *pUsr, rsRetVal(*fAddLstn)(void*,netstrm_t*),
if(net.should_use_so_bsdcompat()) {
if (setsockopt(sock, SOL_SOCKET, SO_BSDCOMPAT,
(char *) &on, sizeof(on)) < 0) {
- errmsg.LogError(NO_ERRCODE, "TCP setsockopt(BSDCOMPAT)");
+ errmsg.LogError(errno, NO_ERRCODE, "TCP setsockopt(BSDCOMPAT)");
close(sock);
continue;
}
diff --git a/runtime/obj.c b/runtime/obj.c
index 9c7656c5..082aa691 100644
--- a/runtime/obj.c
+++ b/runtime/obj.c
@@ -1072,7 +1072,7 @@ RegisterObj(uchar *pszObjName, objInfo_t *pInfo)
finalize_it:
if(iRet != RS_RET_OK) {
- errmsg.LogError(NO_ERRCODE, "registering object '%s' failed with error code %d", pszObjName, iRet);
+ errmsg.LogError(0, NO_ERRCODE, "registering object '%s' failed with error code %d", pszObjName, iRet);
}
RETiRet;
diff --git a/runtime/rsyslog.c b/runtime/rsyslog.c
index c05119d8..54db12c2 100644
--- a/runtime/rsyslog.c
+++ b/runtime/rsyslog.c
@@ -79,11 +79,11 @@
#include "errmsg.h"
/* forward definitions */
-static rsRetVal dfltErrLogger(uchar *errMsg);
+static rsRetVal dfltErrLogger(int, uchar *errMsg);
/* globally visible static data - see comment in rsyslog.h for details */
uchar *glblModPath; /* module load path */
-rsRetVal (*glblErrLogger)(uchar*) = dfltErrLogger; /* the error logger to use by the errmsg module */
+rsRetVal (*glblErrLogger)(int, uchar*) = dfltErrLogger; /* the error logger to use by the errmsg module */
/* static data */
static int iRefCount = 0; /* our refcount - it MUST exist only once inside a process (not thread)
@@ -95,10 +95,10 @@ static int iRefCount = 0; /* our refcount - it MUST exist only once inside a pro
* default so that we can log errors during the intial phase, most importantly
* during initialization. -- rgerhards. 2008-04-17
*/
-static rsRetVal dfltErrLogger(uchar *errMsg)
+static rsRetVal dfltErrLogger(int iErr, uchar *errMsg)
{
DEFiRet;
- fprintf(stderr, "rsyslog runtime error: %s\n", errMsg);
+ fprintf(stderr, "rsyslog runtime error(%d): %s\n", iErr, errMsg);
RETiRet;
}
@@ -107,7 +107,7 @@ static rsRetVal dfltErrLogger(uchar *errMsg)
* rgerhards, 2008-04-18
*/
rsRetVal
-rsrtSetErrLogger(rsRetVal (*errLogger)(uchar*))
+rsrtSetErrLogger(rsRetVal (*errLogger)(int, uchar*))
{
DEFiRet;
assert(errLogger != NULL);
diff --git a/runtime/rsyslog.h b/runtime/rsyslog.h
index 5364a87a..7771bea5 100644
--- a/runtime/rsyslog.h
+++ b/runtime/rsyslog.h
@@ -111,10 +111,16 @@ typedef enum {
*/
enum rsRetVal_ /** return value. All methods return this if not specified otherwise */
{
+ /* the first two define are for errmsg.logError(), so that we can use the rsRetVal
+ * as an rsyslog error code. -- rgerhards, 20080-06-27
+ */
+ RS_RET_NO_ERRCODE = -1, /**< RESERVED for NO_ERRCODE errmsg.logError status name */
+ RS_RET_INCLUDE_ERRNO = 1073741824, /* 2**30 - do NOT use error codes above this! */
+ /* begin regular error codes */
RS_RET_NOT_IMPLEMENTED = -7, /**< implementation is missing (probably internal error or lazyness ;)) */
RS_RET_OUT_OF_MEMORY = -6, /**< memory allocation failed */
RS_RET_PROVIDED_BUFFER_TOO_SMALL = -50,/**< the caller provided a buffer, but the called function sees the size of this buffer is too small - operation not carried out */
- RS_RET_TRUE = -1, /**< to indicate a true state (can be used as TRUE, legacy) */
+ RS_RET_TRUE = -3, /**< to indicate a true state (can be used as TRUE, legacy) */
RS_RET_FALSE = -2, /**< to indicate a false state (can be used as FALSE, legacy) */
RS_RET_NO_IRET = -8, /**< This is a trick for the debuging system - it means no iRet is provided */
RS_RET_ERR = -3000, /**< generic failure */
@@ -340,13 +346,13 @@ void dbgprintf(char *, ...) __attribute__((format(printf, 1, 2)));
* add them. -- rgerhards, 2008-04-17
*/
extern uchar *glblModPath; /* module load path */
-extern rsRetVal (*glblErrLogger)(uchar*);
+extern rsRetVal (*glblErrLogger)(int, uchar*);
/* some runtime prototypes */
rsRetVal rsrtInit(char **ppErrObj, obj_if_t *pObjIF);
rsRetVal rsrtExit(void);
int rsrtIsInit(void);
-rsRetVal rsrtSetErrLogger(rsRetVal (*errLogger)(uchar*));
+rsRetVal rsrtSetErrLogger(rsRetVal (*errLogger)(int, uchar*));
#endif /* multi-include protection */
/* vim:set ai:
diff --git a/tcps_sess.c b/tcps_sess.c
index 6243d91f..b93bb115 100644
--- a/tcps_sess.c
+++ b/tcps_sess.c
@@ -214,7 +214,7 @@ PrepareClose(tcps_sess_t *pThis)
/* In this case, we have an invalid frame count and thus
* generate an error message and discard the frame.
*/
- errmsg.LogError(NO_ERRCODE, "Incomplete frame at end of stream in session %p - "
+ errmsg.LogError(0, NO_ERRCODE, "Incomplete frame at end of stream in session %p - "
"ignoring extra data (a message may be lost).\n", pThis->pStrm);
/* nothing more to do */
} else { /* here, we have traditional framing. Missing LF at the end
@@ -280,13 +280,13 @@ processDataRcvd(tcps_sess_t *pThis, char c)
} else { /* done with the octet count, so this must be the SP terminator */
dbgprintf("TCP Message with octet-counter, size %d.\n", pThis->iOctetsRemain);
if(c != ' ') {
- errmsg.LogError(NO_ERRCODE, "Framing Error in received TCP message: "
+ errmsg.LogError(0, NO_ERRCODE, "Framing Error in received TCP message: "
"delimiter is not SP but has ASCII value %d.\n", c);
}
if(pThis->iOctetsRemain < 1) {
/* TODO: handle the case where the octet count is 0! */
dbgprintf("Framing Error: invalid octet count\n");
- errmsg.LogError(NO_ERRCODE, "Framing Error in received TCP message: "
+ errmsg.LogError(0, NO_ERRCODE, "Framing Error in received TCP message: "
"invalid octet count %d.\n", pThis->iOctetsRemain);
} else if(pThis->iOctetsRemain > MAXLINE) {
/* while we can not do anything against it, we can at least log an indication
@@ -294,7 +294,7 @@ processDataRcvd(tcps_sess_t *pThis, char c)
*/
dbgprintf("truncating message with %d octets - MAXLINE is %d\n",
pThis->iOctetsRemain, MAXLINE);
- errmsg.LogError(NO_ERRCODE, "received oversize message: size is %d bytes, "
+ errmsg.LogError(0, NO_ERRCODE, "received oversize message: size is %d bytes, "
"MAXLINE is %d, truncating...\n", pThis->iOctetsRemain, MAXLINE);
}
pThis->inputState = eInMsg;
diff --git a/tcpsrv.c b/tcpsrv.c
index 60718296..8aeb9f5c 100644
--- a/tcpsrv.c
+++ b/tcpsrv.c
@@ -121,7 +121,7 @@ configureTCPListen(tcpsrv_t *pThis, char *cOptarg)
if( i >= 0 && i <= 65535) {
pThis->TCPLstnPort = cOptarg;
} else {
- errmsg.LogError(NO_ERRCODE, "Invalid TCP listen port %s - changed to 514.\n", cOptarg);
+ errmsg.LogError(0, NO_ERRCODE, "Invalid TCP listen port %s - changed to 514.\n", cOptarg);
}
}
@@ -286,7 +286,7 @@ create_tcp_socket(tcpsrv_t *pThis)
* session table, so we can not continue. We need to free all
* we have assigned so far, because we can not really use it...
*/
- errmsg.LogError(NO_ERRCODE, "Could not initialize TCP session table, suspending TCP message reception.");
+ errmsg.LogError(0, RS_RET_ERR, "Could not initialize TCP session table, suspending TCP message reception.");
ABORT_FINALIZE(RS_RET_ERR);
}
@@ -324,7 +324,7 @@ SessAccept(tcpsrv_t *pThis, tcps_sess_t **ppSess, netstrm_t *pStrm)
iSess = TCPSessTblFindFreeSpot(pThis);
if(iSess == -1) {
errno = 0;
- errmsg.LogError(NO_ERRCODE, "too many tcp sessions - dropping incoming request");
+ errmsg.LogError(0, RS_RET_MAX_SESS_REACHED, "too many tcp sessions - dropping incoming request");
ABORT_FINALIZE(RS_RET_MAX_SESS_REACHED);
} else {
/* we found a free spot and can construct our session object */
@@ -346,7 +346,7 @@ SessAccept(tcpsrv_t *pThis, tcps_sess_t **ppSess, netstrm_t *pStrm)
dbgprintf("%s is not an allowed sender\n", fromHostFQDN);
if(glbl.GetOption_DisallowWarning()) {
errno = 0;
- errmsg.LogError(NO_ERRCODE, "TCP message from disallowed sender %s discarded", fromHostFQDN);
+ errmsg.LogError(0, RS_RET_HOST_NOT_PERMITTED, "TCP message from disallowed sender %s discarded", fromHostFQDN);
}
ABORT_FINALIZE(RS_RET_HOST_NOT_PERMITTED);
}
@@ -470,7 +470,7 @@ Run(tcpsrv_t *pThis)
/* in this case, something went awfully wrong.
* We are instructed to terminate the session.
*/
- errmsg.LogError(NO_ERRCODE, "Tearing down TCP Session %d - see "
+ errmsg.LogError(0, NO_ERRCODE, "Tearing down TCP Session %d - see "
"previous messages for reason(s)\n", iTCPSess);
pThis->pOnErrClose(pThis->pSessions[iTCPSess]);
tcps_sess.Destruct(&pThis->pSessions[iTCPSess]);
@@ -478,8 +478,8 @@ Run(tcpsrv_t *pThis)
break;
default:
errno = 0;
- errmsg.LogError(NO_ERRCODE, "netstream session %p will be closed due to error [%d]\n",
- pThis->pSessions[iTCPSess]->pStrm, iRet);
+ errmsg.LogError(0, iRet, "netstream session %p will be closed due to error\n",
+ pThis->pSessions[iTCPSess]->pStrm);
pThis->pOnErrClose(pThis->pSessions[iTCPSess]);
tcps_sess.Destruct(&pThis->pSessions[iTCPSess]);
break;
diff --git a/template.c b/template.c
index 524789bd..b94af60e 100644
--- a/template.c
+++ b/template.c
@@ -530,7 +530,7 @@ static int do_Parameter(unsigned char **pp, struct template *pTpl)
pTpe->data.field.typeRegex = TPL_REGEX_ERE;
p += 3; /* eat indicator sequence */
} else {
- errmsg.LogError(NO_ERRCODE, "error: invalid regular expression type, rest of line %s",
+ errmsg.LogError(0, NO_ERRCODE, "error: invalid regular expression type, rest of line %s",
(char*) p);
}
}
@@ -569,7 +569,7 @@ static int do_Parameter(unsigned char **pp, struct template *pTpl)
* comma itself is already part of the next field.
*/
} else {
- errmsg.LogError(NO_ERRCODE, "error: invalid regular expression type, rest of line %s",
+ errmsg.LogError(0, NO_ERRCODE, "error: invalid regular expression type, rest of line %s",
(char*) p);
}
}
@@ -590,7 +590,7 @@ static int do_Parameter(unsigned char **pp, struct template *pTpl)
if(*p != ':') {
/* There is something more than an R , this is invalid ! */
/* Complain on extra characters */
- errmsg.LogError(NO_ERRCODE, "error: invalid character in frompos after \"R\", property: '%%%s'",
+ errmsg.LogError(0, NO_ERRCODE, "error: invalid character in frompos after \"R\", property: '%%%s'",
(char*) *pp);
} else {
pTpe->data.field.has_regex = 1;
@@ -616,7 +616,7 @@ static int do_Parameter(unsigned char **pp, struct template *pTpl)
pTpe->data.field.has_fields = 1;
if(!isdigit((int)*p)) {
/* complain and use default */
- errmsg.LogError(NO_ERRCODE, "error: invalid character in frompos after \"F,\", property: '%%%s' - using 9 (HT) as field delimiter",
+ errmsg.LogError(0, NO_ERRCODE, "error: invalid character in frompos after \"F,\", property: '%%%s' - using 9 (HT) as field delimiter",
(char*) *pp);
pTpe->data.field.field_delim = 9;
} else {
@@ -624,7 +624,7 @@ static int do_Parameter(unsigned char **pp, struct template *pTpl)
while(isdigit((int)*p))
iNum = iNum * 10 + *p++ - '0';
if(iNum < 0 || iNum > 255) {
- errmsg.LogError(NO_ERRCODE, "error: non-USASCII delimiter character value %d in template - using 9 (HT) as substitute", iNum);
+ errmsg.LogError(0, NO_ERRCODE, "error: non-USASCII delimiter character value %d in template - using 9 (HT) as substitute", iNum);
pTpe->data.field.field_delim = 9;
} else {
pTpe->data.field.field_delim = iNum;
@@ -634,7 +634,7 @@ static int do_Parameter(unsigned char **pp, struct template *pTpl)
/* invalid character after F, so we need to reject
* this.
*/
- errmsg.LogError(NO_ERRCODE, "error: invalid character in frompos after \"F\", property: '%%%s'",
+ errmsg.LogError(0, NO_ERRCODE, "error: invalid character in frompos after \"F\", property: '%%%s'",
(char*) *pp);
}
} else {
@@ -703,7 +703,7 @@ static int do_Parameter(unsigned char **pp, struct template *pTpl)
iRetLocal);
if(bFirstRegexpErrmsg) { /* prevent flood of messages, maybe even an endless loop! */
bFirstRegexpErrmsg = 0;
- errmsg.LogError(NO_ERRCODE, "regexp library could not be loaded (error %d), "
+ errmsg.LogError(0, NO_ERRCODE, "regexp library could not be loaded (error %d), "
"regexp ignored", iRetLocal);
}
pTpe->data.field.has_regex = 2;
diff --git a/tools/omfile.c b/tools/omfile.c
index 285e798d..06875fe4 100644
--- a/tools/omfile.c
+++ b/tools/omfile.c
@@ -161,14 +161,14 @@ rsRetVal setDynaFileCacheSize(void __attribute__((unused)) *pVal, int iNewVal)
snprintf((char*) errMsg, sizeof(errMsg)/sizeof(uchar),
"DynaFileCacheSize must be greater 0 (%d given), changed to 1.", iNewVal);
errno = 0;
- errmsg.LogError(NO_ERRCODE, "%s", errMsg);
+ errmsg.LogError(0, RS_RET_VAL_OUT_OF_RANGE, "%s", errMsg);
iRet = RS_RET_VAL_OUT_OF_RANGE;
iNewVal = 1;
} else if(iNewVal > 10000) {
snprintf((char*) errMsg, sizeof(errMsg)/sizeof(uchar),
"DynaFileCacheSize maximum is 10,000 (%d given), changed to 10,000.", iNewVal);
errno = 0;
- errmsg.LogError(NO_ERRCODE, "%s", errMsg);
+ errmsg.LogError(0, RS_RET_VAL_OUT_OF_RANGE, "%s", errMsg);
iRet = RS_RET_VAL_OUT_OF_RANGE;
iNewVal = 10000;
}
@@ -221,7 +221,7 @@ static rsRetVal cflineParseOutchannel(instanceData *pData, uchar* p, omodStringR
snprintf(errMsg, sizeof(errMsg)/sizeof(char),
"outchannel '%s' not found - ignoring action line",
szBuf);
- errmsg.LogError(NO_ERRCODE, "%s", errMsg);
+ errmsg.LogError(0, RS_RET_NOT_FOUND, "%s", errMsg);
ABORT_FINALIZE(RS_RET_NOT_FOUND);
}
@@ -232,7 +232,7 @@ static rsRetVal cflineParseOutchannel(instanceData *pData, uchar* p, omodStringR
snprintf(errMsg, sizeof(errMsg)/sizeof(char),
"outchannel '%s' has no file name template - ignoring action line",
szBuf);
- errmsg.LogError(NO_ERRCODE, "%s", errMsg);
+ errmsg.LogError(0, RS_RET_ERR, "%s", errMsg);
ABORT_FINALIZE(RS_RET_ERR);
}
@@ -497,7 +497,7 @@ static int prepareDynFile(instanceData *pData, uchar *newFileName, unsigned iMsg
if(iMsgOpts & INTERNAL_MSG)
dbgprintf("Could not open dynaFile, discarding message\n");
else
- errmsg.LogError(NO_ERRCODE, "Could not open dynamic file '%s' - discarding message", (char*)newFileName);
+ errmsg.LogError(0, NO_ERRCODE, "Could not open dynamic file '%s' - discarding message", (char*)newFileName);
dynaFileDelCacheEntry(pCache, iFirstFree, 1);
pData->iCurrElt = -1;
return -1;
@@ -554,14 +554,14 @@ again:
"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->f_sizeLimit, (long long) actualFileSize);
errno = 0;
- errmsg.LogError(NO_ERRCODE, "%s", errMsg);
+ 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->f_sizeLimit, (long long) actualFileSize);
errno = 0;
- errmsg.LogError(NO_ERRCODE, "%s", errMsg);
+ errmsg.LogError(0, NO_ERRCODE, "%s", errMsg);
}
}
}
@@ -595,7 +595,7 @@ again:
pData->fd = open((char*) pData->f_fname, O_WRONLY|O_APPEND|O_NOCTTY);
if (pData->fd < 0) {
iRet = RS_RET_DISABLE_ACTION;
- errmsg.LogError(NO_ERRCODE, "%s", pData->f_fname);
+ errmsg.LogError(0, NO_ERRCODE, "%s", pData->f_fname);
} else {
untty();
goto again;
@@ -603,7 +603,7 @@ again:
} else {
iRet = RS_RET_DISABLE_ACTION;
errno = e;
- errmsg.LogError(NO_ERRCODE, "%s", pData->f_fname);
+ errmsg.LogError(0, NO_ERRCODE, "%s", pData->f_fname);
}
} else if (pData->bSyncFile) {
fsync(pData->fd);
@@ -767,7 +767,7 @@ CODESTARTparseSelectorAct
if ( pData->fd < 0 ){
pData->fd = -1;
dbgprintf("Error opening log file: %s\n", pData->f_fname);
- errmsg.LogError(NO_ERRCODE, "%s", pData->f_fname);
+ errmsg.LogError(0, NO_ERRCODE, "%s", pData->f_fname);
break;
}
if (isatty(pData->fd)) {
diff --git a/tools/omfwd.c b/tools/omfwd.c
index 1783ef7d..fd326553 100644
--- a/tools/omfwd.c
+++ b/tools/omfwd.c
@@ -484,7 +484,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
if(*p == '@') { /* indicator for TCP! */
localRet = loadTCPSupport();
if(localRet != RS_RET_OK) {
- errmsg.LogError(NO_ERRCODE, "could not activate network stream modules for TCP "
+ errmsg.LogError(0, localRet, "could not activate network stream modules for TCP "
"(internal error %d) - are modules missing?", localRet);
ABORT_FINALIZE(localRet);
}
@@ -521,12 +521,12 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
++p; /* eat */
pData->compressionLevel = iLevel;
} else {
- errmsg.LogError(NO_ERRCODE, "Invalid compression level '%c' specified in "
+ errmsg.LogError(0, NO_ERRCODE, "Invalid compression level '%c' specified in "
"forwardig action - NOT turning on compression.",
*p);
}
# else
- errmsg.LogError(NO_ERRCODE, "Compression requested, but rsyslogd is not compiled "
+ errmsg.LogError(0, NO_ERRCODE, "Compression requested, but rsyslogd is not compiled "
"with compression support - request ignored.");
# endif /* #ifdef USE_NETZIP */
} else if(*p == 'o') { /* octet-couting based TCP framing? */
@@ -534,7 +534,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
/* no further options settable */
tcp_framing = TCP_FRAMING_OCTET_COUNTING;
} else { /* invalid option! Just skip it... */
- errmsg.LogError(NO_ERRCODE, "Invalid option %c in forwarding action - ignoring.", *p);
+ errmsg.LogError(0, NO_ERRCODE, "Invalid option %c in forwarding action - ignoring.", *p);
++p; /* eat invalid option */
}
/* the option processing is done. We now do a generic skip
@@ -550,7 +550,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
/* we probably have end of string - leave it for the rest
* of the code to handle it (but warn the user)
*/
- errmsg.LogError(NO_ERRCODE, "Option block not terminated in forwarding action.");
+ errmsg.LogError(0, NO_ERRCODE, "Option block not terminated in forwarding action.");
}
/* extract the host first (we do a trick - we replace the ';' or ':' with a '\0')
* now skip to port and then template name. rgerhards 2005-07-06
@@ -568,7 +568,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
/* SKIP AND COUNT */;
pData->port = malloc(i + 1);
if(pData->port == NULL) {
- errmsg.LogError(NO_ERRCODE, "Could not get memory to store syslog forwarding port, "
+ errmsg.LogError(0, NO_ERRCODE, "Could not get memory to store syslog forwarding port, "
"using default port, results may not be what you intend\n");
/* we leave f_forw.port set to NULL, this is then handled by getFwdPt(). */
} else {
@@ -584,7 +584,7 @@ CODE_STD_STRING_REQUESTparseSelectorAct(1)
if(bErr == 0) { /* only 1 error msg! */
bErr = 1;
errno = 0;
- errmsg.LogError(NO_ERRCODE, "invalid selector line (port), probably not doing "
+ errmsg.LogError(0, NO_ERRCODE, "invalid selector line (port), probably not doing "
"what was intended");
}
}
diff --git a/tools/omshell.c b/tools/omshell.c
index 2176c101..7b815869 100644
--- a/tools/omshell.c
+++ b/tools/omshell.c
@@ -92,7 +92,7 @@ CODESTARTdoAction
*/
dbgprintf("\n");
if(execProg((uchar*) pData->progName, 1, ppString[0]) == 0)
- errmsg.LogError(NO_ERRCODE, "Executing program '%s' failed", (char*)pData->progName);
+ errmsg.LogError(0, NO_ERRCODE, "Executing program '%s' failed", (char*)pData->progName);
ENDdoAction
diff --git a/tools/syslogd.c b/tools/syslogd.c
index ab4d6784..b21988ab 100644
--- a/tools/syslogd.c
+++ b/tools/syslogd.c
@@ -773,7 +773,7 @@ parseAndSubmitMessage(uchar *hname, uchar *hnameIP, uchar *msg, int len, int bPa
* rgerhards, 2006-12-07
*/
if(ret != Z_OK) {
- errmsg.LogError(NO_ERRCODE, "Uncompression of a message failed with return code %d "
+ errmsg.LogError(0, NO_ERRCODE, "Uncompression of a message failed with return code %d "
"- enable debug logging if you need further information. "
"Message ignored.", ret);
FINALIZE; /* unconditional exit, nothing left to do... */
@@ -786,7 +786,7 @@ parseAndSubmitMessage(uchar *hname, uchar *hnameIP, uchar *msg, int len, int bPa
* tell the user we can not accept it.
*/
if(len > 0 && *msg == 'z') {
- errmsg.LogError(NO_ERRCODE, "Received a compressed message, but rsyslogd does not have compression "
+ errmsg.LogError(0, NO_ERRCODE, "Received a compressed message, but rsyslogd does not have compression "
"support enabled. The message will be ignored.");
FINALIZE;
}
@@ -863,10 +863,10 @@ finalize_it:
* message handler. -- rgerhards, 2008-04-17
*/
rsRetVal
-submitErrMsg(uchar *msg)
+submitErrMsg(int iErr, uchar *msg)
{
DEFiRet;
- iRet = logmsgInternal(LOG_SYSLOG|LOG_ERR, msg, ADDDATE);
+ iRet = logmsgInternal(iErr, LOG_SYSLOG|LOG_ERR, msg, ADDDATE);
RETiRet;
}
@@ -880,10 +880,11 @@ submitErrMsg(uchar *msg)
* think on the best way to do this.
*/
rsRetVal
-logmsgInternal(int pri, uchar *msg, int flags)
+logmsgInternal(int iErr, int pri, uchar *msg, int flags)
{
- DEFiRet;
+ uchar pszTag[33];
msg_t *pMsg;
+ DEFiRet;
CHKiRet(msgConstruct(&pMsg));
MsgSetUxTradMsg(pMsg, (char*)msg);
@@ -891,7 +892,17 @@ logmsgInternal(int pri, uchar *msg, int flags)
MsgSetHOSTNAME(pMsg, (char*)glbl.GetLocalHostName());
MsgSetRcvFrom(pMsg, (char*)glbl.GetLocalHostName());
MsgSetRcvFromIP(pMsg, (uchar*)"127.0.0.1");
- MsgSetTAG(pMsg, "rsyslogd:");
+ /* check if we have an error code associated and, if so,
+ * adjust the tag. -- r5gerhards, 2008-06-27
+ */
+ if(iErr == NO_ERRCODE) {
+ MsgSetTAG(pMsg, "rsyslogd:");
+ } else {
+dbgprintf("iErr %d\n", iErr);
+ snprintf((char*)pszTag, sizeof(pszTag), "rsyslogd%d:", iErr);
+ pszTag[32] = '\0'; /* just to make sure... */
+ MsgSetTAG(pMsg, (char*)pszTag);
+ }
pMsg->iFacility = LOG_FAC(pri);
pMsg->iSeverity = LOG_PRI(pri);
pMsg->bParseHOSTNAME = 0;
@@ -1745,7 +1756,7 @@ void legacyOptsHook(void)
while(pThis != NULL) {
if(pThis->line != NULL) {
errno = 0;
- errmsg.LogError(NO_ERRCODE, "Warning: backward compatibility layer added to following "
+ errmsg.LogError(0, NO_ERRCODE, "Warning: backward compatibility layer added to following "
"directive to rsyslog.conf: %s", pThis->line);
conf.cfsysline(pThis->line);
}
@@ -1900,7 +1911,7 @@ die(int sig)
"\" x-pid=\"%d\" x-info=\"http://www.rsyslog.com\"]" " exiting on signal %d.",
(int) myPid, sig);
errno = 0;
- logmsgInternal(LOG_SYSLOG|LOG_INFO, (uchar*)buf, ADDDATE);
+ logmsgInternal(NO_ERRCODE, LOG_SYSLOG|LOG_INFO, (uchar*)buf, ADDDATE);
}
/* drain queue (if configured so) and stop main queue worker thread pool */
@@ -2262,19 +2273,19 @@ init(void)
/* some checks */
if(iMainMsgQueueNumWorkers < 1) {
- errmsg.LogError(NO_ERRCODE, "$MainMsgQueueNumWorkers must be at least 1! Set to 1.\n");
+ errmsg.LogError(0, NO_ERRCODE, "$MainMsgQueueNumWorkers must be at least 1! Set to 1.\n");
iMainMsgQueueNumWorkers = 1;
}
if(MainMsgQueType == QUEUETYPE_DISK) {
errno = 0; /* for logerror! */
if(glbl.GetWorkDir() == NULL) {
- errmsg.LogError(NO_ERRCODE, "No $WorkDirectory specified - can not run main message queue in 'disk' mode. "
+ errmsg.LogError(0, NO_ERRCODE, "No $WorkDirectory specified - can not run main message queue in 'disk' mode. "
"Using 'FixedArray' instead.\n");
MainMsgQueType = QUEUETYPE_FIXED_ARRAY;
}
if(pszMainMsgQFName == NULL) {
- errmsg.LogError(NO_ERRCODE, "No $MainMsgQueueFileName specified - can not run main message queue in "
+ errmsg.LogError(0, NO_ERRCODE, "No $MainMsgQueueFileName specified - can not run main message queue in "
"'disk' mode. Using 'FixedArray' instead.\n");
MainMsgQueType = QUEUETYPE_FIXED_ARRAY;
}
@@ -2297,11 +2308,11 @@ init(void)
/* ... set some properties ... */
# define setQPROP(func, directive, data) \
CHKiRet_Hdlr(func(pMsgQueue, data)) { \
- errmsg.LogError(NO_ERRCODE, "Invalid " #directive ", error %d. Ignored, running with default setting", iRet); \
+ errmsg.LogError(0, NO_ERRCODE, "Invalid " #directive ", error %d. Ignored, running with default setting", iRet); \
}
# define setQPROPstr(func, directive, data) \
CHKiRet_Hdlr(func(pMsgQueue, data, (data == NULL)? 0 : strlen((char*) data))) { \
- errmsg.LogError(NO_ERRCODE, "Invalid " #directive ", error %d. Ignored, running with default setting", iRet); \
+ errmsg.LogError(0, NO_ERRCODE, "Invalid " #directive ", error %d. Ignored, running with default setting", iRet); \
}
setQPROP(queueSetMaxFileSize, "$MainMsgQueueFileSize", iMainMsgQueMaxFileSize);
@@ -2353,7 +2364,7 @@ init(void)
" [origin software=\"rsyslogd\" " "swVersion=\"" VERSION \
"\" x-pid=\"%d\" x-info=\"http://www.rsyslog.com\"] restart",
(int) myPid);
- logmsgInternal(LOG_SYSLOG|LOG_INFO, (uchar*)bufStartUpMsg, ADDDATE);
+ logmsgInternal(NO_ERRCODE, LOG_SYSLOG|LOG_INFO, (uchar*)bufStartUpMsg, ADDDATE);
memset(&sigAct, 0, sizeof (sigAct));
sigemptyset(&sigAct.sa_mask);
@@ -2385,7 +2396,7 @@ selectorAddList(selector_t *f)
if(f != NULL) {
CHKiRet(llGetNumElts(&f->llActList, &iActionCnt));
if(iActionCnt == 0) {
- errmsg.LogError(NO_ERRCODE, "warning: selector line without actions will be discarded");
+ errmsg.LogError(0, NO_ERRCODE, "warning: selector line without actions will be discarded");
selectorDestruct(f);
} else {
/* successfully created an entry */
@@ -2432,7 +2443,7 @@ static rsRetVal setMainMsgQueType(void __attribute__((unused)) *pVal, uchar *psz
MainMsgQueType = QUEUETYPE_DIRECT;
dbgprintf("main message queue type set to DIRECT (no queueing at all)\n");
} else {
- errmsg.LogError(NO_ERRCODE, "unknown mainmessagequeuetype parameter: %s", (char *) pszType);
+ errmsg.LogError(0, RS_RET_INVALID_PARAMS, "unknown mainmessagequeuetype parameter: %s", (char *) pszType);
iRet = RS_RET_INVALID_PARAMS;
}
free(pszType); /* no longer needed */
@@ -3178,7 +3189,7 @@ int realMain(int argc, char **argv)
break;
case 'h':
if(iCompatibilityMode < 3) {
- errmsg.LogError(NO_ERRCODE, "WARNING: -h option is no longer supported - ignored");
+ errmsg.LogError(0, NO_ERRCODE, "WARNING: -h option is no longer supported - ignored");
} else {
usage(); /* for v3 and above, it simply is an error */
}
@@ -3273,7 +3284,7 @@ int realMain(int argc, char **argv)
/* process compatibility mode settings */
if(iCompatibilityMode < 3) {
- errmsg.LogError(NO_ERRCODE, "WARNING: rsyslogd is running in compatibility mode. Automatically "
+ errmsg.LogError(0, NO_ERRCODE, "WARNING: rsyslogd is running in compatibility mode. Automatically "
"generated config directives may interfer with your rsyslog.conf settings. "
"We suggest upgrading your config and adding -c3 as the first "
"rsyslogd option.");
@@ -3288,7 +3299,7 @@ int realMain(int argc, char **argv)
}
if(bEOptionWasGiven && iCompatibilityMode < 3) {
- errmsg.LogError(NO_ERRCODE, "WARNING: \"message repeated n times\" feature MUST be turned on in "
+ errmsg.LogError(0, NO_ERRCODE, "WARNING: \"message repeated n times\" feature MUST be turned on in "
"rsyslog.conf - CURRENTLY EVERY MESSAGE WILL BE LOGGED. Visit "
"http://www.rsyslog.com/rptdmsgreduction to learn "
"more and cast your vote if you want us to keep this feature.");