62
62
symbolic[MAX_LEN_SYM_HOST_NAME-2] = '\0';
64
64
for(i=0; i<strlen(symbolic); i++)
65
if(isupper(symbolic[i])) tolower(symbolic[i]);
65
if(isupper(symbolic[i])) symbolic[i] = tolower(symbolic[i]);
67
67
setResolvedName(el, symbolic, type);
153
153
/* First check whether the address we search for is cached... */
154
154
if((data_data.dptr != NULL) &&
155
155
(data_data.dsize == (sizeof(StoredAddress))) &&
156
(myGlobals.actTime - ((StoredAddress*)data_data.dptr)->recordCreationTime < CONST_DNSCACHE_LIFETIME) ) {
156
(myGlobals.actTime - ((StoredAddress*)data_data.dptr)->recordCreationTime < CONST_DNSCACHE_LIFETIME)) {
157
157
StoredAddress *retrievedAddress;
159
159
retrievedAddress = (StoredAddress*)data_data.dptr;
389
389
* Treat as NOT FOUND, but use reportedFreaky to put out one message per run.
390
390
* Known to happen under Linux, other OSes uncertain...
392
if (reportedFreaky == FALSE) {
393
reportedFreaky = TRUE;
394
traceEvent(CONST_TRACE_NOISY, "gethost... call returned NULL/NETDB_SUCCESS - "
395
"this is odd, but apparently normal");
392
if((reportedFreaky == FALSE) && (hp != NULL)) {
393
reportedFreaky = TRUE;
394
traceEvent(CONST_TRACE_NOISY, "gethost... call returned NULL/NETDB_SUCCESS - "
395
"this is odd, but apparently normal");
397
397
myGlobals.numDNSErrorHostNotFound++;
520
520
if((!forceResolution)
521
521
&& myGlobals.runningPref.trackOnlyLocalHosts
522
&& (!_pseudoLocalAddress(&elem)))
522
&& (!_pseudoLocalAddress(&elem, NULL, NULL)))
526
526
The address queue is far too long. This is usefult for
527
527
avoiding problems due to DOS applications
529
if(myGlobals.addressQueuedCurrent > MAX_NUM_QUEUED_ADDRESSES) {
529
if(myGlobals.addressQueuedCurrent > (MAX_NUM_QUEUED_ADDRESSES*myGlobals.numDevices)) {
530
530
static char shownMsg = 0;
554
554
key_data.dsize = 16;
558
traceEvent(CONST_TRACE_WARNING, "Invalid address family (%d) found!",
558
563
safe_snprintf(__FILE__, __LINE__, dataBuf, sizeof(dataBuf), "%s", addrtostr(&elem));
559
564
data_data.dptr = dataBuf;
562
567
rc = gdbm_store(myGlobals.addressQueueFile, key_data, data_data, GDBM_INSERT);
570
accessMutex(&myGlobals.queueAddressMutex, "dequeueAddress");
565
571
myGlobals.addressQueuedCurrent++, myGlobals.addressQueuedCount++;
566
572
if (myGlobals.addressQueuedCurrent > myGlobals.addressQueuedMax)
567
573
myGlobals.addressQueuedMax = myGlobals.addressQueuedCurrent;
574
releaseMutex(&myGlobals.queueAddressMutex);
570
577
traceEvent(CONST_TRACE_INFO, "DNS_DEBUG: Queued address '%s' [addr queue=%d/max=%d]",
574
581
/* rc = 1 is duplicate key, which is fine. Other codes are problems... */
576
traceEvent(CONST_TRACE_ERROR, "Queue of address '%s' failed, code %d [addr queue=%d/max=%d]",
577
dataBuf, rc, myGlobals.addressQueuedCurrent, myGlobals.addressQueuedMax);
583
traceEvent(CONST_TRACE_ERROR, "Queue of address '%s' failed (%s) [addr queue=%d/max=%d]",
585
#if defined(WIN32) && defined(__GNUC__)
586
"no additional information available",
588
gdbm_strerror(gdbm_errno),
590
myGlobals.addressQueuedCurrent,
591
myGlobals.addressQueuedMax);
578
592
traceEvent(CONST_TRACE_INFO, "ntop processing continues, address will not be resolved");
594
accessMutex(&myGlobals.queueAddressMutex, "dequeueAddress");
580
595
myGlobals.addressQueuedDup++;
596
releaseMutex(&myGlobals.queueAddressMutex);
582
598
traceEvent(CONST_TRACE_INFO, "DNS_DEBUG: Duplicate queue of address '%s' ignored",
597
613
/* ************************************ */
616
Remove from queue an address that was waiting to be
619
void purgeQueuedV4HostAddress(u_int32_t addr) {
621
struct in_addr addrv4;
623
addrv4.s_addr = addr;
626
traceEvent(CONST_TRACE_INFO, "purgeQueuedV4HostAddress(%s)",
627
_intoa(addrv4, buf, sizeof(buf)));
630
key_data.dptr = (void*)&addr;
632
if(gdbm_delete(myGlobals.addressQueueFile, key_data)) {
633
accessMutex(&myGlobals.queueAddressMutex, "purgeQueuedV4HostAddress");
634
if(myGlobals.addressQueuedCurrent > 0) myGlobals.addressQueuedCurrent--;
635
releaseMutex(&myGlobals.queueAddressMutex);
639
/* ************************************ */
599
641
void* dequeueAddress(void *_i) {
600
int dqaIndex = (int)_i;
642
int dqaIndex = (int)((long)_i);
603
645
datum key_data, data_data;
605
traceEvent(CONST_TRACE_INFO, "THREADMGMT[t%lu]: DNSAR(%d): Address resolution thread running [p%d]",
606
pthread_self(), dqaIndex+1, getpid());
647
traceEvent(CONST_TRACE_INFO,
648
"THREADMGMT[t%lu]: DNSAR(%d): Address resolution thread running",
649
pthread_self(), dqaIndex+1);
608
651
while(myGlobals.ntopRunState <= FLAG_NTOPSTATE_RUN) {
610
653
traceEvent(CONST_TRACE_INFO, "DEBUG: Waiting for address to resolve...");
650
693
traceEvent(CONST_TRACE_INFO, "DNS_DEBUG: Resolved address %s", addrtostr(&addr));
653
myGlobals.addressQueuedCurrent--;
696
accessMutex(&myGlobals.queueAddressMutex, "dequeueAddress");
697
if(myGlobals.addressQueuedCurrent > 0) myGlobals.addressQueuedCurrent--;
698
releaseMutex(&myGlobals.queueAddressMutex);
654
700
gdbm_delete(myGlobals.addressQueueFile, data_data);
655
701
key_data = data_data;
656
702
data_data = gdbm_nextkey(myGlobals.addressQueueFile, key_data);
1271
1317
msg[j++] = '\'';
1272
1318
else if(id < 128) {
1273
snprintf(tmpStr2, sizeof(tmpStr2), "%c", id);
1319
safe_snprintf(__FILE__, __LINE__, tmpStr2, sizeof(tmpStr2), "%c", id);
1274
1320
msg[j++] = tmpStr2[0];
1365
1411
/* ************************************ */
1413
//#define MDNS_DEBUG
1367
1415
static void handleMdnsName(HostTraffic *srcHost, u_short sport, u_char *mdns_name) {
1368
1416
char *mdnsStrtokState, *name = NULL, *appl = NULL, *proto = NULL, *domain = NULL;
1369
1417
char *tmpStr = strdup((char*)mdns_name);
1415
1463
/* Digital Audio Access Protocol (daap.sourceforge.net) */
1416
1464
updateHostUsers(name, BITFLAG_DAAP_USER, srcHost);
1466
} else if(name && appl && (!strcmp(appl, "local"))) {
1467
setHostName(srcHost, name);
1835
/* **************************************** */
1837
char* host2networkName(HostTraffic *el, char *buf, u_short buf_len) {
1838
struct in_addr addr = el->hostIpAddress.Ip4Address;
1841
addr.s_addr = addr.s_addr & (0xFFFFFFFF << (32-el->network_mask));
1843
safe_snprintf(__FILE__, __LINE__, buf, buf_len, "%s/%d",
1844
_intoa(addr, buf1, sizeof(buf1)),