Hi,

here are patches for im3195 and liblogging to pass through the IP address and hostname of the sender.

Please tell me if it needs to be improved.

Regards,
Martin Körper

--- rsyslog-v7-stable_orig/plugins/im3195/im3195.c	2013-01-10 11:51:46.249599137 +0100
+++ rsyslog-v7-stable/plugins/im3195/im3195.c	2013-01-10 12:24:14.898262311 +0100
@@ -49,6 +49,7 @@
 #include "msg.h"
 #include "errmsg.h"
 #include "unicode-helper.h"
+#include "glbl.h"
 
 MODULE_TYPE_INPUT
 MODULE_TYPE_NOKEEP
@@ -58,6 +59,7 @@ MODULE_CNFNAME("im3195")
 DEF_IMOD_STATIC_DATA
 DEFobjCurrIf(errmsg)
 DEFobjCurrIf(prop)
+DEFobjCurrIf(glbl)
 
 /* configuration settings */
 
@@ -88,11 +90,17 @@ static prop_t *pInputName = NULL;
 void OnReceive(srAPIObj __attribute__((unused)) *pMyAPI, srSLMGObj* pSLMG)
 {
 	uchar *pszRawMsg;
-	uchar *fromHost = (uchar*) "[unset]"; /* TODO: get hostname */
-	uchar *fromHostIP = (uchar*) "[unset]"; /* TODO: get hostname */
+	uchar *fromHost = NULL;
+	uchar *fromHostIP = NULL;
 
 	srSLMGGetRawMSG(pSLMG, &pszRawMsg);
-
+	srSLMGGetRemoteHost(pSLMG, &fromHostIP);
+	srSLMGGetRemoteHostName(pSLMG, &fromHost);
+	if(fromHost == NULL)
+		fromHost = (uchar*) "[unset]";
+	if(fromHostIP == NULL)
+		fromHostIP = (uchar*) "[unset]";
+	
 	parseAndSubmitMessage(fromHost, fromHostIP, pszRawMsg, strlen((char*)pszRawMsg),
 		PARSE_HOSTNAME, eFLOWCTL_FULL_DELAY, pInputName, NULL, 0, NULL);
 }
@@ -155,6 +163,13 @@ CODESTARTwillRun
 		errmsg.LogError(0, NO_ERRCODE, "error %d setting liblogging listen port - im3195 is defunct", iRet);
 		FINALIZE;
 	}
+	
+	if (!glbl.GetDisableDNS()) {
+		if((iRet = srAPISetOption(pAPI, srOPTION_USE_DNS, 1)) != SR_RET_OK) {
+		      errmsg.LogError(0, NO_ERRCODE, "error %d setting up liblogging listener - im3195 is defunct", iRet);
+		      FINALIZE;
+		}
+	}
 
 	if((iRet = srAPISetupListener(pAPI, OnReceive)) != SR_RET_OK) {
 		errmsg.LogError(0, NO_ERRCODE, "error %d setting up liblogging listener - im3195 is defunct", iRet);
@@ -181,6 +196,7 @@ CODESTARTmodExit
 	/* release objects we used */
 	objRelease(errmsg, CORE_COMPONENT);
 	objRelease(prop, CORE_COMPONENT);
+	objRelease(glbl, CORE_COMPONENT);
 ENDmodExit
 
 
@@ -202,6 +218,7 @@ CODESTARTmodInit
 CODEmodInit_QueryRegCFSLineHdlr
 	CHKiRet(objUse(errmsg, CORE_COMPONENT));
 	CHKiRet(objUse(prop, CORE_COMPONENT));
+	CHKiRet(objUse(glbl, CORE_COMPONENT));
 
 	CHKiRet(omsdRegCFSLineHdlr((uchar *)"input3195listenport", 0, eCmdHdlrInt, NULL, &listenPort, STD_LOADABLE_MODULE_ID));
 	CHKiRet(omsdRegCFSLineHdlr((uchar *)"resetconfigvariables", 1, eCmdHdlrCustomHandler, resetConfigVariables, NULL, STD_LOADABLE_MODULE_ID));
diff --git a/src/liblogging.h b/src/liblogging.h
index 2b31203..79c5845 100644
--- a/src/liblogging.h
+++ b/src/liblogging.h
@@ -276,7 +276,11 @@ enum srOPTION
 	  * Sets the BEEP listener port. Is only used if the
 	  * UDP listener is activated.
 	  */
-     srOPTION_BEEP_LISTENPORT = 8
+     srOPTION_BEEP_LISTENPORT = 8,
+     	/**
+	 * Use DNS for hostname lookup?
+	 */
+     srOPTION_USE_DNS = 9
 };
 typedef enum srOPTION SRoption;
 
diff --git a/src/lstnprof-3195cooked.c b/src/lstnprof-3195cooked.c
index 8dcf4fc..d4cff4b 100644
--- a/src/lstnprof-3195cooked.c
+++ b/src/lstnprof-3195cooked.c
@@ -101,6 +101,7 @@ static srRetVal psrcOnMesgRecvDoEntry(sbProfObj *pThis, int* pbAbort, sbSessObj*
 	srRetVal iRet;
 	srSLMGObj *pSLMG;
 	char *pszRemHostIP;
+	char *pszRemHostName = NULL;
 
 	sbProfCHECKVALIDOBJECT(pThis);
 	sbSessCHECKVALIDOBJECT(pSess);
@@ -133,14 +134,29 @@ static srRetVal psrcOnMesgRecvDoEntry(sbProfObj *pThis, int* pbAbort, sbSessObj*
 		free(pszRemHostIP);
 		return iRet;
 	}
+	if((iRet = sbSockGetRemoteHostName(pSess->pSock, &pszRemHostName, pThis->pAPI->bUseDNS)) != SR_RET_OK)
+	{
+		srSLMGDestroy(pSLMG);
+		free(pszRemHostIP);
+		return iRet;
+	}
+	if((iRet = srSLMGSetRemoteHostName(pSLMG, pszRemHostName, FALSE)) != SR_RET_OK)
+	{
+		srSLMGDestroy(pSLMG);
+		free(pszRemHostIP);
+		free(pszRemHostName);
+		return iRet;
+	}
 	if((iRet = srSLMGParseMesg(pSLMG)) != SR_RET_OK)
 	{
 		srSLMGDestroy(pSLMG);
 		free(pszRemHostIP);
+		free(pszRemHostName);
 		return iRet;
 	}
 	pThis->pAPI->OnSyslogMessageRcvd(pThis->pAPI, pSLMG);
 	free(pszRemHostIP);
+	free(pszRemHostName);
 	srSLMGDestroy(pSLMG);
 
 	return SR_RET_OK;
diff --git a/src/lstnprof-3195raw.c b/src/lstnprof-3195raw.c
index 595b312..ca4cf92 100644
--- a/src/lstnprof-3195raw.c
+++ b/src/lstnprof-3195raw.c
@@ -95,6 +95,7 @@ static srRetVal psrrOnMesgRecvCallAPI(sbProfObj *pThis, int* pbAbort, sbSessObj*
 	char *pBuf;
 	char *pszMsg;
 	char *pszRemHostIP;
+	char *pszRemHostName = NULL;
 	srSLMGObj *pSLMG;
 
 	sbProfCHECKVALIDOBJECT(pThis);
@@ -159,16 +160,33 @@ static srRetVal psrrOnMesgRecvCallAPI(sbProfObj *pThis, int* pbAbort, sbSessObj*
 			free(pszMsg);
 			return iRet;
 		}
+		if((iRet = sbSockGetRemoteHostName(pSess->pSock, &pszRemHostName, pThis->pAPI->bUseDNS)) != SR_RET_OK)
+		{
+			srSLMGDestroy(pSLMG);
+			free(pszRemHostIP);
+			free(pszMsg);
+			return iRet;
+		}
+		if((iRet = srSLMGSetRemoteHostName(pSLMG, pszRemHostName, FALSE)) != SR_RET_OK)
+		{
+			srSLMGDestroy(pSLMG);
+			free(pszRemHostIP);
+			free(pszMsg);
+			free(pszRemHostName);
+			return iRet;
+		}
 		if((iRet = srSLMGParseMesg(pSLMG)) != SR_RET_OK)
 		{
 			srSLMGDestroy(pSLMG);
 			free(pszRemHostIP);
 			free(pszMsg);
+			free(pszRemHostName);
 			return iRet;
 		}
 		pThis->pAPI->OnSyslogMessageRcvd(pThis->pAPI, pSLMG);
 		free(pszMsg);
 		free(pszRemHostIP);
+		free(pszRemHostName);
 		srSLMGDestroy(pSLMG);
 	}
 	return SR_RET_OK;
diff --git a/src/sockets.c b/src/sockets.c
index 28902e4..37afe35 100644
--- a/src/sockets.c
+++ b/src/sockets.c
@@ -114,6 +114,7 @@ srRetVal sbSockConstruct(sbSockObj** pThis)
 	(*pThis)->iCurInBufPos = 0;
 	(*pThis)->iInBufLen = 0;
 	(*pThis)->pRemoteHostIP = NULL;
+	(*pThis)->pRemoteHostName = NULL;
 
 	return SR_RET_OK;
 }
@@ -185,6 +186,8 @@ srRetVal sbSockExit(struct sbSockObject *pThis)
 
 	if(pThis->pRemoteHostIP != NULL)
 		free(pThis->pRemoteHostIP);
+	if(pThis->pRemoteHostName != NULL)
+		free(pThis->pRemoteHostName);
 	SRFREEOBJ(pThis);	/* there is nothing we can do if free() fails... */
 
 	return(iRetVal);
@@ -297,6 +300,42 @@ srRetVal sbSockGetRemoteHostIP(sbSockObj *pThis, char **ppszHost)
 }
 
 
+srRetVal sbSockGetRemoteHostName(sbSockObj *pThis, char **ppszHostname, int bUseDNS)
+{
+	char *pBuf;
+	char *pBufRTL;
+	char *pBufIP;
+	srRetVal iRet;
+	int iLenBufRTL;
+	sbSockCHECKVALIDOBJECT(pThis);
+	assert(ppszHostname != NULL);
+	
+	if(pThis->pRemoteHostName == NULL)
+	{
+		if(bUseDNS == TRUE)
+		{
+			/* need to obtain the string */
+			iRet = sbSock_getnameinfo(&(pThis->RemoteHostAddr), &pBufRTL);
+		}
+		if(bUseDNS == FALSE || iRet != SR_RET_OK)
+		{
+			/* use RemoteHostIP as RemoteHostName */
+			if((iRet = sbSockGetRemoteHostIP(pThis, &pBufRTL)) != SR_RET_OK)
+				return iRet;
+		}
+		pThis->iRemHostNameBufLen = (int) strlen(pBufRTL) + 1;
+		pThis->pRemoteHostName = pBufRTL;		
+	}
+
+	if((pBuf = (char*) malloc(pThis->iRemHostNameBufLen * sizeof(char))) == NULL)
+		return SR_RET_OUT_OF_MEMORY;
+	memcpy(pBuf, pThis->pRemoteHostName, pThis->iRemHostNameBufLen);
+	*ppszHostname = pBuf;
+
+	return SR_RET_OK;
+}
+
+
 srRetVal sbSockGetIPusedForSending(sbSockObj* pThis, char**ppsz)
 {
 	srRetVal iRet;
diff --git a/src/sockets.h b/src/sockets.h
index 8e8c764..70a4535 100644
--- a/src/sockets.h
+++ b/src/sockets.h
@@ -89,6 +89,8 @@ struct sbSockObject
 	struct sockaddr_in RemoteHostAddr;/**< ipAddr of the remote host [sorry, IP V4 only currently... :-(] */
 	char *pRemoteHostIP;	/**< IP address of the remote host connected to this socket */
 	int iRemHostIPBufLen;	/**< strlen()+ 1 of the remote host IP address (for malloc()) */
+	char *pRemoteHostName;	/**< reverse DNS from pszRemoteHost */
+	int iRemHostNameBufLen;	/**< strlen()+ 1 of the remote hostname (for malloc()) */
 #	endif
 };
 typedef struct sbSockObject sbSockObj;
@@ -293,6 +295,26 @@ srRetVal sbSockSetNonblocking(sbSockObj*pThis);
 srRetVal sbSockGetRemoteHostIP(sbSockObj *pThis, char **ppszHost);
 
 /**
+ * Return the reverse DNS entry for the IP address,
+ * Returns the IP address if bUseDNS == FALSE.
+ * If the the hostname cannot be determined it returns the IP address.
+ */
+srRetVal sbSockGetRemoteHostName(sbSockObj *pThis, char **ppszHostname, int bUseDNS);
+
+/** 
+ * Wrapper for getnameinfo().
+ *
+ * \param psa Poiner to a struct sockaddr for which hostname
+ *            is to obtain. Must not be NULL.
+ *
+ * \param psz Pointer to Pointer to hostname. Must not be NULL.
+ *            On return, this pointer will refer to a newly allocated
+ *            buffer containing the hostname. This buffer must be free()ed
+ *            by the caller!
+ */
+srRetVal sbSock_getnameinfo(struct sockaddr_in *psa, char **ppszHostname);
+
+/**
  * Wrapper for gethostname().
  *
  * \param psz Pointer to Pointer to hostname. Must not be NULL.
diff --git a/src/socketsUnix.c b/src/socketsUnix.c
index c414d00..521865d 100644
--- a/src/socketsUnix.c
+++ b/src/socketsUnix.c
@@ -410,6 +410,34 @@ srRetVal sbSock_gethostname(char **psz)
 }
 
 
+/** 
+ * Wrapper for getnameinfo().
+ *
+ * \param psa Poiner to a struct sockaddr for which hostname
+ *            is to obtain. Must not be NULL.
+ *
+ * \param psz Pointer to Pointer to hostname. Must not be NULL.
+ *            On return, this pointer will refer to a newly allocated
+ *            buffer containing the hostname. This buffer must be free()ed
+ *            by the caller!
+ */
+srRetVal sbSock_getnameinfo(struct sockaddr_in *psa, char **psz)
+{
+	int iRet=0;
+	assert(psz != NULL);
+
+	if((*psz = (char*) malloc(NI_MAXHOST * sizeof(char))) == NULL)
+		return SR_RET_OUT_OF_MEMORY;
+	if(getnameinfo((struct sockaddr*) psa, sizeof(struct sockaddr_in), *psz, NI_MAXHOST, NULL, 0, NI_NAMEREQD) != 0)
+	{
+		free(*psz);
+		*psz = NULL;
+		return SR_RET_ERR;
+	}
+	return SR_RET_OK;
+}
+
+
 /**
  * Wrapper for getsockname().
  *
diff --git a/src/socketsWin32.c b/src/socketsWin32.c
index c97f226..38ffaa8 100644
--- a/src/socketsWin32.c
+++ b/src/socketsWin32.c
@@ -467,6 +467,34 @@ srRetVal sbSock_gethostname(char **psz)
 }
 
 
+/** 
+ * Wrapper for getnameinfo().
+ *
+ * \param psa Poiner to a struct sockaddr for which hostname
+ *            is to obtain. Must not be NULL.
+ *
+ * \param psz Pointer to Pointer to hostname. Must not be NULL.
+ *            On return, this pointer will refer to a newly allocated
+ *            buffer containing the hostname. This buffer must be free()ed
+ *            by the caller!
+ */
+srRetVal sbSock_getnameinfo(struct sockaddr_in *psa, char **psz)
+{
+	int iRet=0;
+	assert(psz != NULL);
+
+	if((*psz = (char*) malloc(NI_MAXHOST * sizeof(char))) == NULL)
+		return SR_RET_OUT_OF_MEMORY;
+	if(getnameinfo((struct sockaddr*) psa, sizeof(struct sockaddr_in), *psz, NI_MAXHOST, NULL, 0, NI_NAMEREQD) != 0)
+	{
+		free(*psz);
+		*psz = NULL;
+		return SR_RET_ERR;
+	}
+	return SR_RET_OK;
+}
+
+
 /**
  * Wrapper for getsockname().
  *
diff --git a/src/srAPI.c b/src/srAPI.c
index 10ab219..919eb19 100644
--- a/src/srAPI.c
+++ b/src/srAPI.c
@@ -140,6 +140,7 @@ srAPIObj* srAPIInitLib(void)
 	pThis->iUDPListenPort = 0;
 	pThis->bListenUXDOMSOCK = FALSE;
 	pThis->szNameUXDOMSOCK = NULL;
+	pThis->bUseDNS = FALSE;
 #	endif
 	sbSockLayerInit(srAPI_bCallOSSocketInitializer);
 
@@ -204,6 +205,13 @@ srRetVal srAPISetOption(srAPIObj* pThis, SRoption iOpt, int iOptVal)
 			return SR_RET_INVALID_OPTVAL;
 		pThis->iBEEPListenPort = iOptVal;
 		break;
+	case srOPTION_USE_DNS:
+		if((pThis == NULL) || (pThis->OID != OIDsrAPI))
+			return SR_RET_INVALID_HANDLE;
+		if(iOptVal != TRUE && iOptVal != FALSE)
+			return SR_RET_INVALID_OPTVAL;
+		pThis->bUseDNS = iOptVal;
+		break;
 	default:
 		return SR_RET_INVALID_LIB_OPTION;
 	}
diff --git a/src/srAPI.h b/src/srAPI.h
index 8d016a5..46585b1 100644
--- a/src/srAPI.h
+++ b/src/srAPI.h
@@ -75,6 +75,7 @@ struct srAPIObject
 	int iUDPListenPort;			/**< port to use when listening on UDP */
 	int bListenUXDOMSOCK;		/**< TRUE/FALSE - listen to unix domain socket? */
 	char *szNameUXDOMSOCK;		/**< pointer to c-string with socket name */
+	int bUseDNS;			/**< TRUE/FALSE - use DNS for hostname lookup? */
 #	endif
 };
 typedef struct srAPIObject srAPIObj;
diff --git a/src/syslogmessage.c b/src/syslogmessage.c
index c0792ff..735ba1b 100644
--- a/src/syslogmessage.c
+++ b/src/syslogmessage.c
@@ -110,6 +110,8 @@ void srSLMGDestroy(srSLMGObj *pThis)
 
 	if((pThis->bOwnRemoteHostBuf == TRUE) && (pThis->pszRemoteHost != NULL))
 		free(pThis->pszRemoteHost);
+	if((pThis->bOwnRemoteHostNameBuf == TRUE) && (pThis->pszRemoteHostName != NULL))
+		free(pThis->pszRemoteHostName);
 	if((pThis->bOwnRawMsgBuf == TRUE) && (pThis->pszRawMsg != NULL))
 		free(pThis->pszRawMsg);
 #	if FEATURE_MSGAPI == 1
@@ -716,7 +718,7 @@ srRetVal srSLMGGetFacility(srSLMGObj *pThis, int *piFac)
 }
 
 
-srRetVal srSLMGGetRemoteHost(srSLMGObj *pThis, char**ppsz)
+srRetVal srSLMGGetRemoteHost(srSLMGObj *pThis, unsigned char**ppsz)
 {
 	srSLMGCHECKVALIDOBJECT_API(pThis);
 	if(ppsz== NULL)
@@ -726,7 +728,17 @@ srRetVal srSLMGGetRemoteHost(srSLMGObj *pThis, char**ppsz)
 }
 
 
-srRetVal srSLMGGetHostname(srSLMGObj *pThis, char**ppsz)
+srRetVal srSLMGGetRemoteHostName(srSLMGObj *pThis, unsigned char**ppsz)
+{
+	srSLMGCHECKVALIDOBJECT_API(pThis);
+	if(ppsz== NULL)
+		return SR_RET_NULL_POINTER_PROVIDED;
+	*ppsz = pThis->pszRemoteHostName;
+	return SR_RET_OK;
+}
+
+
+srRetVal srSLMGGetHostname(srSLMGObj *pThis, unsigned char**ppsz)
 {
 	srSLMGCHECKVALIDOBJECT_API(pThis);
 	if(ppsz== NULL)
@@ -859,6 +871,28 @@ srRetVal srSLMGSetRemoteHostIP(srSLMGObj *pThis, char *pszRemHostIP, int bCopyRe
 }
 
 
+srRetVal srSLMGSetRemoteHostName(srSLMGObj *pThis, char *pszRemHostName, int bCopyRemHostName)
+{
+	srSLMGCHECKVALIDOBJECT_API(pThis);
+
+	if(pThis->pszRemoteHostName != NULL)
+		if(pThis->bOwnRemoteHostNameBuf == TRUE)
+			free(pThis->pszRemoteHostName);
+
+	if(bCopyRemHostName == TRUE)
+	{
+		if((pThis->pszRemoteHostName = sbNVTEUtilStrDup(pszRemHostName)) == NULL)
+			return SR_RET_OUT_OF_MEMORY;
+	}
+	else
+		pThis->pszRemoteHostName = pszRemHostName;
+
+	pThis->bOwnRemoteHostNameBuf = bCopyRemHostName;
+
+	return SR_RET_OK;
+}
+
+
 srRetVal srSLMGSetRawMsg(srSLMGObj *pThis, char *pszRawMsg, int bCopyRawMsg)
 {
 	srSLMGCHECKVALIDOBJECT_API(pThis);
diff --git a/src/syslogmessage.h b/src/syslogmessage.h
index 4ba7152..3b706b1 100644
--- a/src/syslogmessage.h
+++ b/src/syslogmessage.h
@@ -105,20 +105,22 @@ typedef enum srSLMGSource_ srSLMGSource;
  */
 struct srSLMGObject
 {
-	srObjID OID;					/**< object ID */
+	srObjID OID;				/**< object ID */
 	unsigned char *pszRawMsg;		/**< the raw message provided by the sender */
-	int bOwnRawMsgBuf;				/**< TRUE pszRawMsg owned by us & must be freed on destroy */
-	unsigned char *pszRemoteHost;	/**< remote host we received the message from (from socket layer, NOT message) */
+	int bOwnRawMsgBuf;			/**< TRUE pszRawMsg owned by us & must be freed on destroy */
+	unsigned char *pszRemoteHost;		/**< remote host we received the message from (from socket layer, NOT message) */
 	int bOwnRemoteHostBuf;			/**< TRUE pszRemoteHost owned by us & must be freed on destroy */
+	unsigned char *pszRemoteHostName;	/**< reverse DNS from pszRemoteHost */
+	int bOwnRemoteHostNameBuf;		/**< TRUE pszRemoteHost owned by us & must be freed on destroy */
 	srSLMGFormat iFormat;			/**< the format this message (most probably) is in */
 	srSLMGSource iSource;			/**< the source this syslog message was received from */
 #	if FEATURE_MSGAPI == 1
-	int iFacility;					/**< the facility of the syslog message */
-	int iSeverity;					/**< the priority of the syslog message */
+	int iFacility;				/**< the facility of the syslog message */
+	int iSeverity;				/**< the priority of the syslog message */
 	unsigned char* pszHostname;		/**< name of the remote host (from the syslog message itself) */
 	unsigned char* pszTag;			/**< pointer to the tag value of the syslog message */
 	unsigned char* pszMsg;			/**< the MSG part of the syslog message */
-	int bOwnMsg;					/**< TRUE pszMsg owned by us & must be freed on destroy */
+	int bOwnMsg;				/**< TRUE pszMsg owned by us & must be freed on destroy */
 	unsigned char* pszLanguage;		/**< language used inside the message (NULL, if unknown) */
 	
 	/* The timestamp is split through several fields, because this makes it less
@@ -193,7 +195,29 @@ srRetVal srSLMGGetFacility(srSLMGObj *pThis, int *piFac);
  *       the same machine (e.g. UNIX /dev/log), the returned
  *       pointer is NULL. The caller needs to check for this!
  */
-srRetVal srSLMGGetRemoteHost(srSLMGObj *pThis, char**ppsz);
+srRetVal srSLMGGetRemoteHost(srSLMGObj *pThis, unsigned char**ppsz);
+
+/**
+ * Provide the caller back with the remote hostname that sent
+ * us this syslog message. Please note that this is the
+ * socket layer peer. It is not necessarily the same host
+ * that is specified as originator in the syslog message
+ * itself. If the message is relayed, these two are definitely
+ * different.
+ *
+ * \note The returned string is read-only. It is valid
+ * only until the srSLMGObj is destroyed. If the caller intends
+ * to use it for a prolonged period of time, it needs to
+ * copy it!
+ *
+ * \param ppsz Pointer to Pointer to unsigned char to 
+ *             receive the return string.
+ *
+ * \note If the message originated via inter-process communiction on
+ *       the same machine (e.g. UNIX /dev/log), the returned
+ *       pointer is NULL. The caller needs to check for this!
+ */
+srRetVal srSLMGGetRemoteHostName(srSLMGObj *pThis, unsigned char**ppsz);
 
 /**
  * Provide the caller back with the message sender name
@@ -209,7 +233,7 @@ srRetVal srSLMGGetRemoteHost(srSLMGObj *pThis, char**ppsz);
  * \param ppsz Pointer to Pointer to unsigned char to 
  *             receive the return string.
  */
-srRetVal srSLMGGetHostname(srSLMGObj *pThis, char**ppsz);
+srRetVal srSLMGGetHostname(srSLMGObj *pThis, unsigned char**ppsz);
 
 /**
  * Provide the caller back with the message's tag.
@@ -284,6 +308,20 @@ srRetVal srSLMGGetRawMSG(srSLMGObj *pThis, unsigned char**ppsz);
 srRetVal srSLMGSetRemoteHostIP(srSLMGObj *pThis, char *pszRemHostIP, int bCopyRemHost);
 
 /**
+ * Set the Remote Host name (reverse DNS).
+ * Any previously set value is replaced.
+ *
+ * \param pszRemHostName String pointing to the IP address of the remote
+ * host.
+ * \param bCopyRemHostName TRUE = copy the string, will own the copy
+ *                     (and need to free it), FALSE, do not copy
+ *                     caller owns & frees string. Must keep srSLMGObj
+ *                     alive long enough so that all methods can access
+ *                     it without danger.
+ */
+srRetVal srSLMGSetRemoteHostName(srSLMGObj *pThis, char *pszRemHostName, int bCopyRemHostName);
+
+/**
  * Set the raw message text. Any previously set value is replaced.
  *
  * \param pszRawMsg String with the raw message text.
_______________________________________________
rsyslog mailing list
http://lists.adiscon.net/mailman/listinfo/rsyslog
http://www.rsyslog.com/professional-services/
What's up with rsyslog? Follow https://twitter.com/rgerhards
NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad of 
sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you DON'T LIKE 
THAT.

Reply via email to