#ifdef HAVE_DNSSEC
static struct blockdata *keyblock_free = NULL;
+static unsigned int blockdata_count = 0, blockdata_hwm = 0;
+
+void blockdata_report(void)
+{
+ my_syslog(LOG_INFO, _("DNSSEC memory in use %u, max %u"),
+ blockdata_count * KEYBLOCK_LEN, blockdata_hwm * KEYBLOCK_LEN);
+}
struct blockdata *blockdata_alloc(char *data, size_t len)
{
{
block = keyblock_free;
keyblock_free = block->next;
+ blockdata_count++;
}
- else
- block = whine_malloc(sizeof(struct blockdata));
-
+ else if ((block = whine_malloc(sizeof(struct blockdata))))
+ {
+ blockdata_count++;
+ if (blockdata_hwm < blockdata_count)
+ blockdata_hwm = blockdata_count;
+ }
+
if (!block)
{
/* failed to alloc, free partial chain */
if (blocks)
{
- for (tmp = blocks; tmp->next; tmp = tmp->next);
+ for (tmp = blocks; tmp->next; tmp = tmp->next)
+ blockdata_count--;
tmp->next = keyblock_free;
- keyblock_free = blocks;
+ keyblock_free = blocks;
+ blockdata_count--;
}
}
#ifdef HAVE_AUTH
my_syslog(LOG_INFO, _("queries for authoritative zones %u"), daemon->auth_answer);
#endif
+#ifdef HAVE_DNSSEC
+ blockdata_report();
+#endif
/* sum counts from different records for same server */
for (serv = daemon->servers; serv; serv = serv->next)
/* blockdata.c */
#ifdef HAVE_DNSSEC
+void blockdata_report(void);
struct blockdata *blockdata_alloc(char *data, size_t len);
size_t blockdata_walk(struct blockdata **key, unsigned char **p, size_t cnt);
void blockdata_retrieve(struct blockdata *block, size_t len, void *data);