summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'runtime')
-rw-r--r--runtime/dnscache.c53
-rw-r--r--runtime/dnscache.h2
-rw-r--r--runtime/msg.c10
-rw-r--r--runtime/net.c4
-rw-r--r--runtime/net.h2
-rw-r--r--runtime/netstrm.c4
-rw-r--r--runtime/netstrm.h5
-rw-r--r--runtime/nsd.h5
-rw-r--r--runtime/nsd_ptcp.c35
-rw-r--r--runtime/nsd_ptcp.h2
-rw-r--r--runtime/strms_sess.c21
-rw-r--r--runtime/strms_sess.h9
-rw-r--r--runtime/strmsrv.c15
13 files changed, 90 insertions, 77 deletions
diff --git a/runtime/dnscache.c b/runtime/dnscache.c
index c6e22833..5aa8a235 100644
--- a/runtime/dnscache.c
+++ b/runtime/dnscache.c
@@ -41,14 +41,15 @@
#include "unicode-helper.h"
#include "net.h"
#include "hashtable.h"
+#include "prop.h"
+#include "dnscache.h"
/* module data structures */
struct dnscache_entry_s {
struct sockaddr_storage addr;
uchar *pszHostFQDN;
- uchar *ip;
+ prop_t *ip;
rs_size_t lenHost;
- rs_size_t lenIP;
struct dnscache_entry_s *next;
unsigned nUsed;
};
@@ -59,14 +60,15 @@ struct dnscache_s {
unsigned nEntries;
};
typedef struct dnscache_s dnscache_t;
-#define MAX_CACHE_ENTRIES 1000
/* static data */
DEFobjStaticHelpers
DEFobjCurrIf(glbl)
DEFobjCurrIf(errmsg)
+DEFobjCurrIf(prop)
static dnscache_t dnsCache;
+static prop_t *staticErrIPValue;
/* Our hash function.
@@ -89,8 +91,6 @@ hash_from_key_fn(void *k)
static int
key_equals_fn(void *key1, void *key2)
{
-dbgprintf("DDDD: key_equals_fn: SALEN %d, result %d\n", SALEN((struct sockaddr*)key1),
-SALEN((struct sockaddr*)key1) == SALEN((struct sockaddr*) key2) && !memcmp(key1, key2, SALEN((struct sockaddr*) key1)));
return (SALEN((struct sockaddr*)key1) == SALEN((struct sockaddr*) key2)
&& !memcmp(key1, key2, SALEN((struct sockaddr*) key1)));
}
@@ -122,6 +122,11 @@ dnscacheInit(void)
CHKiRet(objGetObjInterface(&obj)); /* this provides the root pointer for all other queries */
CHKiRet(objUse(glbl, CORE_COMPONENT));
CHKiRet(objUse(errmsg, CORE_COMPONENT));
+ CHKiRet(objUse(prop, CORE_COMPONENT));
+
+ prop.Construct(&staticErrIPValue);
+ prop.SetString(staticErrIPValue, (uchar*)"???", 3);
+ prop.ConstructFinalize(staticErrIPValue);
finalize_it:
RETiRet;
}
@@ -131,10 +136,12 @@ rsRetVal
dnscacheDeinit(void)
{
DEFiRet;
+ prop.Destruct(&staticErrIPValue);
hashtable_destroy(dnsCache.ht, 1); /* 1 => free all values automatically */
pthread_rwlock_destroy(&dnsCache.rwlock);
objRelease(glbl, CORE_COMPONENT);
objRelease(errmsg, CORE_COMPONENT);
+ objRelease(prop, CORE_COMPONENT);
RETiRet;
}
@@ -176,18 +183,19 @@ mygetnameinfo(const struct sockaddr *sa, socklen_t salen,
* message should be processed (1) or discarded (0).
*/
static rsRetVal
-resolveAddr(struct sockaddr_storage *addr, uchar *pszHostFQDN, uchar *ip)
+resolveAddr(struct sockaddr_storage *addr, uchar *pszHostFQDN, prop_t **ip)
{
DEFiRet;
int error;
sigset_t omask, nmask;
struct addrinfo hints, *res;
+ char szIP[80]; /* large enough for IPv6 */
assert(addr != NULL);
assert(pszHostFQDN != NULL);
error = mygetnameinfo((struct sockaddr *)addr, SALEN((struct sockaddr *)addr),
- (char*) ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
+ (char*) szIP, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if(error) {
dbgprintf("Malformed from address %s\n", gai_strerror(error));
ABORT_FINALIZE(RS_RET_INVALID_SOURCE);
@@ -225,7 +233,7 @@ resolveAddr(struct sockaddr_storage *addr, uchar *pszHostFQDN, uchar *ip)
snprintf((char*)szErrMsg, sizeof(szErrMsg) / sizeof(uchar),
"Malicious PTR record, message dropped "
"IP = \"%s\" HOST = \"%s\"",
- ip, pszHostFQDN);
+ szIP, pszHostFQDN);
errmsg.LogError(0, RS_RET_MALICIOUS_ENTITY, "%s", szErrMsg);
pthread_sigmask(SIG_SETMASK, &omask, NULL);
ABORT_FINALIZE(RS_RET_MALICIOUS_ENTITY);
@@ -240,7 +248,7 @@ resolveAddr(struct sockaddr_storage *addr, uchar *pszHostFQDN, uchar *ip)
snprintf((char*)szErrMsg, sizeof(szErrMsg) / sizeof(uchar),
"Malicious PTR record (message accepted, but used IP "
"instead of PTR name: IP = \"%s\" HOST = \"%s\"",
- ip, pszHostFQDN);
+ szIP, pszHostFQDN);
errmsg.LogError(0, NO_ERRCODE, "%s", szErrMsg);
error = 1; /* that will trigger using IP address below. */
@@ -250,11 +258,19 @@ resolveAddr(struct sockaddr_storage *addr, uchar *pszHostFQDN, uchar *ip)
}
if(error || glbl.GetDisableDNS()) {
- dbgprintf("Host name for your address (%s) unknown\n", ip);
- strcpy((char*) pszHostFQDN, (char*)ip);
+ dbgprintf("Host name for your address (%s) unknown\n", szIP);
+ strcpy((char*) pszHostFQDN, (char*)szIP);
}
finalize_it:
+ if(iRet != RS_RET_OK) {
+ strcpy(szIP, "?error.obtaining.ip?");
+ }
+ /* we need to create the inputName property (only once during our lifetime) */
+ prop.Construct(ip);
+ prop.SetString(*ip, (uchar*)szIP, strlen(szIP));
+ prop.ConstructFinalize(*ip);
+
RETiRet;
}
@@ -265,16 +281,15 @@ addEntry(struct sockaddr_storage *addr, dnscache_entry_t **pEtry)
int r;
struct sockaddr_storage *keybuf;
uchar pszHostFQDN[NI_MAXHOST];
- uchar ip[80]; /* 80 is safe for larges IPv6 addr */
+ prop_t *ip;
dnscache_entry_t *etry;
DEFiRet;
- CHKiRet(resolveAddr(addr, pszHostFQDN, ip));
+ CHKiRet(resolveAddr(addr, pszHostFQDN, &ip));
CHKmalloc(etry = MALLOC(sizeof(dnscache_entry_t)));
etry->lenHost = ustrlen(pszHostFQDN);
- etry->lenIP = ustrlen(ip);
CHKmalloc(etry->pszHostFQDN = ustrdup(pszHostFQDN));
- CHKmalloc(etry->ip = ustrdup(ip));
+ etry->ip = ip;
memcpy(&etry->addr, addr, SALEN((struct sockaddr*) addr));
etry->nUsed = 0;
*pEtry = etry;
@@ -313,7 +328,7 @@ validateEntry(dnscache_entry_t __attribute__((unused)) *etry, struct sockaddr_st
*/
rsRetVal
dnscacheLookup(struct sockaddr_storage *addr, uchar **pszHostFQDN, rs_size_t *lenHost,
- uchar **ip, rs_size_t *lenIP)
+ prop_t **ip)
{
dnscache_entry_t *etry;
DEFiRet;
@@ -326,11 +341,10 @@ dnscacheLookup(struct sockaddr_storage *addr, uchar **pszHostFQDN, rs_size_t *le
} else {
CHKiRet(validateEntry(etry, addr));
}
-dbgprintf("XXXX: hostn '%s', ip '%s'\n", etry->pszHostFQDN, etry->ip);
*pszHostFQDN = etry->pszHostFQDN;
*lenHost = etry->lenHost;
+ prop.AddRef(etry->ip);
*ip = etry->ip;
- *lenIP = etry->lenIP;
finalize_it:
pthread_rwlock_unlock(&dnsCache.rwlock);
@@ -339,8 +353,7 @@ dbgprintf("XXXX: dnscacheLookup finished, iRet=%d\n", iRet);
DBGPRINTF("dnscacheLookup failed with iRet %d\n", iRet);
*pszHostFQDN = (uchar*)"???";
*lenHost = 3;
- *ip = (uchar*)"???";
- *lenIP = 3;
+ *ip = staticErrIPValue;
}
RETiRet;
}
diff --git a/runtime/dnscache.h b/runtime/dnscache.h
index 5b7f96d6..ed60d9c5 100644
--- a/runtime/dnscache.h
+++ b/runtime/dnscache.h
@@ -24,6 +24,6 @@
rsRetVal dnscacheInit(void);
rsRetVal dnscacheDeinit(void);
-rsRetVal dnscacheLookup(struct sockaddr_storage *addr, uchar **pszHostFQDN, rs_size_t *lenHost, uchar **ip, rs_size_t *lenIP);
+rsRetVal dnscacheLookup(struct sockaddr_storage *addr, uchar **pszHostFQDN, rs_size_t *lenHost, prop_t **ip);
#endif /* #ifndef INCLUDED_DNSCACHE_H */
diff --git a/runtime/msg.c b/runtime/msg.c
index 98600cdd..86c2e68c 100644
--- a/runtime/msg.c
+++ b/runtime/msg.c
@@ -360,21 +360,19 @@ static inline rsRetVal
resolveDNS(msg_t *pMsg) {
rsRetVal localRet;
prop_t *propFromHost = NULL;
- prop_t *propFromHostIP = NULL;
+ prop_t *ip;
uchar fromHost[NI_MAXHOST];
uchar fromHostFQDN[NI_MAXHOST];
- uchar *fromHostIP;
- rs_size_t lenIP;
DEFiRet;
MsgLock(pMsg);
CHKiRet(objUse(net, CORE_COMPONENT));
if(pMsg->msgFlags & NEEDS_DNSRESOL) {
localRet = net.cvthname(pMsg->rcvFrom.pfrominet, fromHost, fromHostFQDN,
- &fromHostIP, &lenIP);
+ &ip);
if(localRet == RS_RET_OK) {
MsgSetRcvFromStr(pMsg, fromHost, ustrlen(fromHost), &propFromHost);
- CHKiRet(MsgSetRcvFromIPStr(pMsg, fromHostIP, lenIP, &propFromHostIP));
+ CHKiRet(MsgSetRcvFromIP(pMsg, ip));
}
}
finalize_it:
@@ -386,8 +384,6 @@ finalize_it:
MsgUnlock(pMsg);
if(propFromHost != NULL)
prop.Destruct(&propFromHost);
- if(propFromHostIP != NULL)
- prop.Destruct(&propFromHostIP);
RETiRet;
}
diff --git a/runtime/net.c b/runtime/net.c
index a6670eca..28a8ef95 100644
--- a/runtime/net.c
+++ b/runtime/net.c
@@ -1125,7 +1125,7 @@ void debugListenInfo(int fd, char *type)
* pay.
* 2005-05-16 rgerhards: added IP representation. Must also be NI_MAXHOST
*/
-rsRetVal cvthname(struct sockaddr_storage *f, uchar *pszHost, uchar *pszHostFQDN, uchar **pszIP, rs_size_t *lenIP)
+rsRetVal cvthname(struct sockaddr_storage *f, uchar *pszHost, uchar *pszHostFQDN, prop_t **ip)
{
DEFiRet;
uchar *host;
@@ -1137,7 +1137,7 @@ rsRetVal cvthname(struct sockaddr_storage *f, uchar *pszHost, uchar *pszHostFQDN
assert(pszHost != NULL);
assert(pszHostFQDN != NULL);
- iRet = dnscacheLookup(f, &host, &lenHost, pszIP, lenIP);
+ iRet = dnscacheLookup(f, &host, &lenHost, ip);
strcpy((char*)pszHostFQDN, (char*)host); // TODO: optimize this! requires more changes below (dirty tricks ;))
if(iRet == RS_RET_INVALID_SOURCE) {
diff --git a/runtime/net.h b/runtime/net.h
index a38328a9..ec8ad5d8 100644
--- a/runtime/net.h
+++ b/runtime/net.h
@@ -131,7 +131,7 @@ struct permittedPeers_s {
/* interfaces */
BEGINinterface(net) /* name must also be changed in ENDinterface macro! */
- rsRetVal (*cvthname)(struct sockaddr_storage *f, uchar *pszHost, uchar *pszHostFQDN, uchar **pszIP, rs_size_t *lenIP);
+ rsRetVal (*cvthname)(struct sockaddr_storage *f, uchar *pszHost, uchar *pszHostFQDN, prop_t **ip);
/* things to go away after proper modularization */
rsRetVal (*addAllowedSenderLine)(char* pName, uchar** ppRestOfConfLine);
void (*PrintAllowedSenders)(int iListToPrint);
diff --git a/runtime/netstrm.c b/runtime/netstrm.c
index 58f38280..c046cf52 100644
--- a/runtime/netstrm.c
+++ b/runtime/netstrm.c
@@ -271,11 +271,11 @@ GetRemoteHName(netstrm_t *pThis, uchar **ppsz)
/* get remote IP - slim wrapper for NSD driver function */
static rsRetVal
-GetRemoteIP(netstrm_t *pThis, uchar **ppsz)
+GetRemoteIP(netstrm_t *pThis, prop_t **ip)
{
DEFiRet;
ISOBJ_TYPE_assert(pThis, netstrm);
- iRet = pThis->Drvr.GetRemoteIP(pThis->pDrvrData, ppsz);
+ iRet = pThis->Drvr.GetRemoteIP(pThis->pDrvrData, ip);
RETiRet;
}
diff --git a/runtime/netstrm.h b/runtime/netstrm.h
index ee8d9e59..4ef24229 100644
--- a/runtime/netstrm.h
+++ b/runtime/netstrm.h
@@ -49,7 +49,7 @@ BEGINinterface(netstrm) /* name must also be changed in ENDinterface macro! */
rsRetVal (*Send)(netstrm_t *pThis, uchar *pBuf, ssize_t *pLenBuf);
rsRetVal (*Connect)(netstrm_t *pThis, int family, unsigned char *port, unsigned char *host);
rsRetVal (*GetRemoteHName)(netstrm_t *pThis, uchar **pszName);
- rsRetVal (*GetRemoteIP)(netstrm_t *pThis, uchar **pszIP);
+ rsRetVal (*GetRemoteIP)(netstrm_t *pThis, prop_t **ip);
rsRetVal (*SetDrvrMode)(netstrm_t *pThis, int iMode);
rsRetVal (*SetDrvrAuthMode)(netstrm_t *pThis, uchar*);
rsRetVal (*SetDrvrPermPeers)(netstrm_t *pThis, permittedPeers_t*);
@@ -72,10 +72,11 @@ BEGINinterface(netstrm) /* name must also be changed in ENDinterface macro! */
/* v4 */
rsRetVal (*EnableKeepAlive)(netstrm_t *pThis);
ENDinterface(netstrm)
-#define netstrmCURR_IF_VERSION 5 /* increment whenever you change the interface structure! */
+#define netstrmCURR_IF_VERSION 6 /* increment whenever you change the interface structure! */
/* interface version 3 added GetRemAddr()
* interface version 4 added EnableKeepAlive() -- rgerhards, 2009-06-02
* interface version 5 changed return of CheckConnection from void to rsRetVal -- alorbach, 2012-09-06
+ * interface version 6 changed signature of GetRemoteIP() -- rgerhards, 2013-01-21
* */
/* prototypes */
diff --git a/runtime/nsd.h b/runtime/nsd.h
index d7d6abbd..aa3662a4 100644
--- a/runtime/nsd.h
+++ b/runtime/nsd.h
@@ -59,7 +59,7 @@ BEGINinterface(nsd) /* name must also be changed in ENDinterface macro! */
uchar *pLstnPort, uchar *pLstnIP, int iSessMax);
rsRetVal (*AcceptConnReq)(nsd_t *pThis, nsd_t **ppThis);
rsRetVal (*GetRemoteHName)(nsd_t *pThis, uchar **pszName);
- rsRetVal (*GetRemoteIP)(nsd_t *pThis, uchar **pszIP);
+ rsRetVal (*GetRemoteIP)(nsd_t *pThis, prop_t **ip);
rsRetVal (*SetMode)(nsd_t *pThis, int mode); /* sets a driver specific mode - see driver doc for details */
rsRetVal (*SetAuthMode)(nsd_t *pThis, uchar*); /* sets a driver specific mode - see driver doc for details */
rsRetVal (*SetPermPeers)(nsd_t *pThis, permittedPeers_t*); /* sets driver permitted peers for auth needs */
@@ -80,10 +80,11 @@ BEGINinterface(nsd) /* name must also be changed in ENDinterface macro! */
/* v5 */
rsRetVal (*EnableKeepAlive)(nsd_t *pThis);
ENDinterface(nsd)
-#define nsdCURR_IF_VERSION 6 /* increment whenever you change the interface structure! */
+#define nsdCURR_IF_VERSION 7 /* increment whenever you change the interface structure! */
/* interface version 4 added GetRemAddr()
* interface version 5 added EnableKeepAlive() -- rgerhards, 2009-06-02
* interface version 6 changed return of CheckConnection from void to rsRetVal -- alorbach, 2012-09-06
+ * interface version 7 changed signature ofGetRempoteIP() -- rgerhards, 2013-01-21
*/
/* interface for the select call */
diff --git a/runtime/nsd_ptcp.c b/runtime/nsd_ptcp.c
index 53b6a3a2..630c8e68 100644
--- a/runtime/nsd_ptcp.c
+++ b/runtime/nsd_ptcp.c
@@ -50,6 +50,7 @@
#include "nsdsel_ptcp.h"
#include "nsdpoll_ptcp.h"
#include "nsd_ptcp.h"
+#include "prop.h"
#include "dnscache.h"
MODULE_TYPE_LIB
@@ -62,6 +63,7 @@ DEFobjCurrIf(glbl)
DEFobjCurrIf(net)
DEFobjCurrIf(netstrms)
DEFobjCurrIf(netstrm)
+DEFobjCurrIf(prop)
/* a few deinit helpers */
@@ -87,7 +89,8 @@ ENDobjConstruct(nsd_ptcp)
BEGINobjDestruct(nsd_ptcp) /* be sure to specify the object type also in END and CODESTART macros! */
CODESTARTobjDestruct(nsd_ptcp)
sockClose(&pThis->sock);
- free(pThis->pRemHostIP);
+ if(pThis->remoteIP != NULL)
+ prop.Destruct(&pThis->remoteIP);
free(pThis->pRemHostName);
ENDobjDestruct(nsd_ptcp)
@@ -249,31 +252,22 @@ Abort(nsd_t *pNsd)
static rsRetVal
FillRemHost(nsd_ptcp_t *pThis, struct sockaddr_storage *pAddr)
{
- uchar *szIP;
uchar *szHname;
- rs_size_t lenHname, lenIP;
+ rs_size_t lenHname;
DEFiRet;
ISOBJ_TYPE_assert(pThis, nsd_ptcp);
assert(pAddr != NULL);
- CHKiRet(dnscacheLookup(pAddr, &szHname, &lenHname, &szIP, &lenIP));
+ CHKiRet(dnscacheLookup(pAddr, &szHname, &lenHname, &pThis->remoteIP));
/* We now have the names, so now let's allocate memory and store them permanently.
* (side note: we may hold on to these values for quite a while, thus we trim their
* memory consumption)
*/
- lenIP++; /* +1 for \0 byte */
lenHname++;
- if((pThis->pRemHostIP = MALLOC(lenIP)) == NULL)
+ if((pThis->pRemHostName = MALLOC(lenHname)) == NULL)
ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
- memcpy(pThis->pRemHostIP, szIP, lenIP);
-
- if((pThis->pRemHostName = MALLOC(lenHname)) == NULL) {
- free(pThis->pRemHostIP); /* prevent leak */
- pThis->pRemHostIP = NULL;
- ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
- }
memcpy(pThis->pRemHostName, szHname, lenHname);
finalize_it:
@@ -717,21 +711,16 @@ finalize_it:
}
-/* get the remote host's IP address. The returned string must be freed by the
- * caller.
- * rgerhards, 2008-04-24
+/* get the remote host's IP address. Caller must Destruct the object.
*/
static rsRetVal
-GetRemoteIP(nsd_t *pNsd, uchar **ppszIP)
+GetRemoteIP(nsd_t *pNsd, prop_t **ip)
{
DEFiRet;
nsd_ptcp_t *pThis = (nsd_ptcp_t*) pNsd;
ISOBJ_TYPE_assert(pThis, nsd_ptcp);
- assert(ppszIP != NULL);
-
- CHKmalloc(*ppszIP = (uchar*)strdup(pThis->pRemHostIP == NULL ? "" : (char*) pThis->pRemHostIP));
-
-finalize_it:
+ prop.AddRef(pThis->remoteIP);
+ *ip = pThis->remoteIP;
RETiRet;
}
@@ -777,6 +766,7 @@ CODESTARTObjClassExit(nsd_ptcp)
/* release objects we no longer need */
objRelease(net, CORE_COMPONENT);
objRelease(glbl, CORE_COMPONENT);
+ objRelease(prop, CORE_COMPONENT);
objRelease(errmsg, CORE_COMPONENT);
objRelease(netstrm, DONT_LOAD_LIB);
objRelease(netstrms, LM_NETSTRMS_FILENAME);
@@ -791,6 +781,7 @@ BEGINObjClassInit(nsd_ptcp, 1, OBJ_IS_LOADABLE_MODULE) /* class, version */
/* request objects we use */
CHKiRet(objUse(errmsg, CORE_COMPONENT));
CHKiRet(objUse(glbl, CORE_COMPONENT));
+ CHKiRet(objUse(prop, CORE_COMPONENT));
CHKiRet(objUse(net, CORE_COMPONENT));
CHKiRet(objUse(netstrms, LM_NETSTRMS_FILENAME));
CHKiRet(objUse(netstrm, DONT_LOAD_LIB));
diff --git a/runtime/nsd_ptcp.h b/runtime/nsd_ptcp.h
index a1bcd646..ed6b8565 100644
--- a/runtime/nsd_ptcp.h
+++ b/runtime/nsd_ptcp.h
@@ -30,7 +30,7 @@ typedef nsd_if_t nsd_ptcp_if_t; /* we just *implement* this interface */
/* the nsd_ptcp object */
struct nsd_ptcp_s {
BEGINobjInstance; /* Data to implement generic object - MUST be the first data element! */
- uchar *pRemHostIP; /**< IP address of remote peer (currently used in server mode, only) */
+ prop_t *remoteIP; /**< IP address of remote peer (currently used in server mode, only) */
uchar *pRemHostName; /**< host name of remote peer (currently used in server mode, only) */
struct sockaddr_storage remAddr; /**< remote addr as sockaddr - used for legacy ACL code */
int sock; /**< the socket we use for regular, single-socket, operations */
diff --git a/runtime/strms_sess.c b/runtime/strms_sess.c
index d14f0b37..2537e8d8 100644
--- a/runtime/strms_sess.c
+++ b/runtime/strms_sess.c
@@ -38,12 +38,14 @@
#include "errmsg.h"
#include "netstrm.h"
#include "msg.h"
+#include "prop.h"
#include "datetime.h"
/* static data */
DEFobjStaticHelpers
DEFobjCurrIf(glbl)
+DEFobjCurrIf(prop)
DEFobjCurrIf(errmsg)
DEFobjCurrIf(netstrm)
DEFobjCurrIf(datetime)
@@ -86,7 +88,8 @@ CODESTARTobjDestruct(strms_sess)
}
/* now destruct our own properties */
free(pThis->fromHost);
- free(pThis->fromHostIP);
+ if(pThis->fromHostIP != NULL)
+ prop.Destruct(&pThis->fromHostIP);
ENDobjDestruct(strms_sess)
@@ -111,17 +114,18 @@ SetHost(strms_sess_t *pThis, uchar *pszHost)
RETiRet;
}
-/* set the remote host's IP. Note that the caller *hands over* the string. That is,
+/* set the remote host's IP. Note that the caller *hands over* the property. That is,
* the caller no longer controls it once SetHostIP() has received it. Most importantly,
- * the caller must not free it. -- rgerhards, 2008-05-16
+ * the caller must not destruct it. -- rgerhards, 2008-05-16
*/
static rsRetVal
-SetHostIP(strms_sess_t *pThis, uchar *pszHostIP)
+SetHostIP(strms_sess_t *pThis, prop_t *ip)
{
DEFiRet;
ISOBJ_TYPE_assert(pThis, strms_sess);
- free(pThis->fromHostIP);
- pThis->fromHostIP = pszHostIP;
+ if(pThis->fromHostIP != NULL)
+ prop.Destruct(&pThis->fromHostIP);
+ pThis->fromHostIP = ip;
RETiRet;
}
@@ -188,8 +192,8 @@ Close(strms_sess_t *pThis)
netstrm.Destruct(&pThis->pStrm);
free(pThis->fromHost);
pThis->fromHost = NULL; /* not really needed, but... */
- free(pThis->fromHostIP);
- pThis->fromHostIP = NULL; /* not really needed, but... */
+ if(pThis->fromHostIP != NULL)
+ prop.Destruct(&pThis->fromHostIP);
RETiRet;
}
@@ -284,6 +288,7 @@ BEGINObjClassInit(strms_sess, 1, OBJ_IS_CORE_MODULE) /* class, version - CHANGE
CHKiRet(objUse(errmsg, CORE_COMPONENT));
CHKiRet(objUse(netstrm, LM_NETSTRMS_FILENAME));
CHKiRet(objUse(datetime, CORE_COMPONENT));
+ CHKiRet(objUse(prop, CORE_COMPONENT));
CHKiRet(objUse(glbl, CORE_COMPONENT));
iMaxLine = glbl.GetMaxLine(); /* get maximum size we currently support */
diff --git a/runtime/strms_sess.h b/runtime/strms_sess.h
index 5c0309f8..86f692a8 100644
--- a/runtime/strms_sess.h
+++ b/runtime/strms_sess.h
@@ -33,9 +33,8 @@ struct strms_sess_s {
strmsrv_t *pSrv; /* pointer back to my server (e.g. for callbacks) */
strmLstnPortList_t *pLstnInfo; /* pointer back to listener info */
netstrm_t *pStrm;
-// uchar *pMsg; /* message (fragment) received */
uchar *fromHost;
- uchar *fromHostIP;
+ prop_t *fromHostIP;
void *pUsr; /* a user-pointer */
};
@@ -54,15 +53,17 @@ BEGINinterface(strms_sess) /* name must also be changed in ENDinterface macro! *
rsRetVal (*SetUsrP)(strms_sess_t*, void*);
void* (*GetUsrP)(strms_sess_t*);
rsRetVal (*SetHost)(strms_sess_t *pThis, uchar*);
- rsRetVal (*SetHostIP)(strms_sess_t *pThis, uchar*);
+ rsRetVal (*SetHostIP)(strms_sess_t *pThis, prop_t*);
rsRetVal (*SetStrm)(strms_sess_t *pThis, netstrm_t*);
rsRetVal (*SetOnMsgReceive)(strms_sess_t *pThis, rsRetVal (*OnMsgReceive)(strms_sess_t*, uchar*, int));
ENDinterface(strms_sess)
-#define strms_sessCURR_IF_VERSION 1 /* increment whenever you change the interface structure! */
+#define strms_sessCURR_IF_VERSION 3 /* increment whenever you change the interface structure! */
/* interface changes
* to version v2, rgerhards, 2009-05-22
* - Data structures changed
* - SetLstnInfo entry point added
+ * version 3, rgerhads, 2013-01-21:
+ * - signature of SetHostIP() changed
*/
diff --git a/runtime/strmsrv.c b/runtime/strmsrv.c
index 8310e832..e8b544b8 100644
--- a/runtime/strmsrv.c
+++ b/runtime/strmsrv.c
@@ -70,6 +70,7 @@
#include "netstrm.h"
#include "nssel.h"
#include "errmsg.h"
+#include "prop.h"
#include "unicode-helper.h"
MODULE_TYPE_LIB
@@ -89,6 +90,7 @@ DEFobjCurrIf(net)
DEFobjCurrIf(netstrms)
DEFobjCurrIf(netstrm)
DEFobjCurrIf(nssel)
+DEFobjCurrIf(prop)
/* forward definitions */
static rsRetVal create_strm_socket(strmsrv_t *pThis);
@@ -418,7 +420,7 @@ SessAccept(strmsrv_t *pThis, strmLstnPortList_t *pLstnInfo, strms_sess_t **ppSes
int iSess = -1;
struct sockaddr_storage *addr;
uchar *fromHostFQDN = NULL;
- uchar *fromHostIP = NULL;
+ prop_t *ip = NULL;
ISOBJ_TYPE_assert(pThis, strmsrv);
assert(pLstnInfo != NULL);
@@ -444,7 +446,7 @@ SessAccept(strmsrv_t *pThis, strmLstnPortList_t *pLstnInfo, strms_sess_t **ppSes
/* get the host name */
CHKiRet(netstrm.GetRemoteHName(pNewStrm, &fromHostFQDN));
- CHKiRet(netstrm.GetRemoteIP(pNewStrm, &fromHostIP));
+ CHKiRet(netstrm.GetRemoteIP(pNewStrm, &ip));
CHKiRet(netstrm.GetRemAddr(pNewStrm, &addr));
/* TODO: check if we need to strip the domain name here -- rgerhards, 2008-04-24 */
@@ -467,8 +469,8 @@ SessAccept(strmsrv_t *pThis, strmLstnPortList_t *pLstnInfo, strms_sess_t **ppSes
*/
CHKiRet(strms_sess.SetHost(pSess, fromHostFQDN));
fromHostFQDN = NULL; /* we handed this string over */
- CHKiRet(strms_sess.SetHostIP(pSess, fromHostIP));
- fromHostIP = NULL; /* we handed this string over */
+ CHKiRet(strms_sess.SetHostIP(pSess, ip));
+ ip = NULL; /* we handed this string over */
CHKiRet(strms_sess.SetStrm(pSess, pNewStrm));
pNewStrm = NULL; /* prevent it from being freed in error handler, now done in strms_sess! */
CHKiRet(strms_sess.ConstructFinalize(pSess));
@@ -489,7 +491,8 @@ finalize_it:
if(pNewStrm != NULL)
netstrm.Destruct(&pNewStrm);
free(fromHostFQDN);
- free(fromHostIP);
+ if(ip != NULL)
+ prop.Destruct(&ip);
}
RETiRet;
@@ -908,6 +911,7 @@ CODESTARTObjClassExit(strmsrv)
objRelease(strms_sess, DONT_LOAD_LIB);
objRelease(conf, CORE_COMPONENT);
objRelease(glbl, CORE_COMPONENT);
+ objRelease(prop, CORE_COMPONENT);
objRelease(errmsg, CORE_COMPONENT);
objRelease(netstrms, DONT_LOAD_LIB);
objRelease(nssel, DONT_LOAD_LIB);
@@ -930,6 +934,7 @@ BEGINObjClassInit(strmsrv, 1, OBJ_IS_LOADABLE_MODULE) /* class, version - CHANGE
CHKiRet(objUse(strms_sess, DONT_LOAD_LIB));
CHKiRet(objUse(conf, CORE_COMPONENT));
CHKiRet(objUse(glbl, CORE_COMPONENT));
+ CHKiRet(objUse(prop, CORE_COMPONENT));
/* set our own handlers */
OBJSetMethodHandler(objMethod_DEBUGPRINT, strmsrvDebugPrint);