addEntry(struct sockaddr_storage *const addr, dnscache_entry_t **const pEtry) { int r; dnscache_entry_t *etry = NULL; DEFiRet; /* entry still does not exist, so add it */ struct sockaddr_storage *const keybuf = malloc(sizeof(struct sockaddr_storage)); CHKmalloc(keybuf); CHKmalloc(etry = malloc(sizeof(dnscache_entry_t))); resolveAddr(addr, etry); assert(etry != NULL); memcpy(&etry->addr, addr, SALEN((struct sockaddr*) addr)); etry->nUsed = 0; if(dnscacheEnableTTL) { etry->validUntil = time(NULL) + dnscacheDefaultTTL; } memcpy(keybuf, addr, sizeof(struct sockaddr_storage)); r = hashtable_insert(dnsCache.ht, keybuf, etry); if(r == 0) { DBGPRINTF("dnscache: inserting element failed\n"); } *pEtry = etry; finalize_it: if(iRet != RS_RET_OK) { free(keybuf); } RETiRet; }
static inline rsRetVal addEntry(struct sockaddr_storage *addr, dnscache_entry_t **pEtry) { int r; struct sockaddr_storage *keybuf; dnscache_entry_t *etry = NULL; DEFiRet; CHKmalloc(etry = MALLOC(sizeof(dnscache_entry_t))); CHKiRet(resolveAddr(addr, etry)); memcpy(&etry->addr, addr, SALEN((struct sockaddr*) addr)); etry->nUsed = 0; *pEtry = etry; CHKmalloc(keybuf = malloc(sizeof(struct sockaddr_storage))); memcpy(keybuf, addr, sizeof(struct sockaddr_storage)); pthread_rwlock_unlock(&dnsCache.rwlock); /* release read lock */ pthread_rwlock_wrlock(&dnsCache.rwlock); /* and re-aquire for writing */ r = hashtable_insert(dnsCache.ht, keybuf, *pEtry); if(r == 0) { DBGPRINTF("dnscache: inserting element failed\n"); } pthread_rwlock_unlock(&dnsCache.rwlock); pthread_rwlock_rdlock(&dnsCache.rwlock); /* we need this again */ finalize_it: if(iRet != RS_RET_OK && etry != NULL) { /* Note: sub-fields cannot be populated in this case */ free(etry); } RETiRet; }
static void printPartedAddr(const char* name, void* addr) { iprintf(" %s: ", name); part_t oPart; if (resolveAddr(&oPart, addr)) iprintf("%s%c0x%X\n", oPart.name, *oPart.name != '(' ? '+' : ' ', oPart.offset); else iprintf("--\n"); }
int stCallback(void* address, int depth /* 0-based */, void* user_data) { part_t oPart; if (depth == 19) return 0; // prevent screen overflow if (resolveAddr(&oPart, address) && *oPart.name != '(') iprintf("%d - %s+0x%X\n", depth, oPart.name, oPart.offset); else iprintf("%d - 0x%08X\n", depth, (word_t)address); return 1; }
ScIterator3Ptr createIterator(ScTemplateConstr3 const & constr) { ScTemplateItemValue const * values = constr.getValues(); ScTemplateItemValue const & value0 = values[0]; ScTemplateItemValue const & value1 = values[1]; ScTemplateItemValue const & value2 = values[2]; ScAddr const addr0 = resolveAddr(value0); ScAddr const addr1 = resolveAddr(value1); ScAddr const addr2 = resolveAddr(value2); if (addr0.isValid()) { if (addr2.isValid()) // F_A_F { return mContext.iterator3(addr0, *value1.mTypeValue.upConstType(), addr2); } else // F_A_A { return mContext.iterator3(addr0, *value1.mTypeValue.upConstType(), *value2.mTypeValue.upConstType()); } } else if (addr2.isValid()) // A_A_F { return mContext.iterator3(*value0.mTypeValue.upConstType(), *value1.mTypeValue.upConstType(), addr2); } else if (addr1.isValid()) // A_F_A { return mContext.iterator3(*value0.mTypeValue.upConstType(), addr1, *value2.mTypeValue.upConstType()); } else // unknown iterator type { error("Unknown iterator type"); } return ScIterator3Ptr(); }
addEntry(struct sockaddr_storage *const addr, dnscache_entry_t **const pEtry) { int r; struct sockaddr_storage *keybuf = NULL; dnscache_entry_t *etry = NULL; DEFiRet; pthread_rwlock_wrlock(&dnsCache.rwlock); /* first check, if the entry was added in the mean time */ etry = findEntry(addr); if(etry != NULL) { FINALIZE; } /* entry still does not exist, so add it */ CHKmalloc(etry = malloc(sizeof(dnscache_entry_t))); CHKmalloc(keybuf = malloc(sizeof(struct sockaddr_storage))); CHKiRet(resolveAddr(addr, etry)); memcpy(&etry->addr, addr, SALEN((struct sockaddr*) addr)); etry->nUsed = 0; memcpy(keybuf, addr, sizeof(struct sockaddr_storage)); r = hashtable_insert(dnsCache.ht, keybuf, etry); keybuf = NULL; if(r == 0) { DBGPRINTF("dnscache: inserting element failed\n"); } finalize_it: pthread_rwlock_unlock(&dnsCache.rwlock); if(iRet == RS_RET_OK) { *pEtry = etry; } else { free(keybuf); free(etry); /* Note: sub-fields cannot be populated in this case */ } RETiRet; }