Прикладная демонология, практические рецепты

Кеширование отрицательных ответов резолвера в nscd

В FreeBSD имеется хорошая программа, позволяющая прозрачно кешировать результаты работы штатного резолвера - "name service caching daemon" aka (8) nscd.
На мой взгляд, это более простое и легковесное решение, нежели использование named или unbound для этой цели.
К сожалению, в этой программе существует ошибка, из-за которой единожды от резолвера отрицательный ответ кешируется "навсегда" (независимо от того, что указано в конфигурационном файле.
По этому поводу в 2013 году был изготовлен патч и создан соотвествуюший PR.
Но, увы, PR так и не обработан, а жить как-то надо. Поэтому по сей день приходится носить патч за собой и накладывать его руками.
Сам патч прост и многократно проверен на ряде систем:

--- usr.sbin/nscd/query.c.orig  2013-08-22 11:59:03.921956888 +0400
+++ usr.sbin/nscd/query.c   2013-08-22 12:00:01.515957178 +0400
@@ -743,9 +743,14 @@
                &read_response->data_size);

            if (read_response->error_code == -2) {
-               read_response->error_code = 0;
-               read_response->data = NULL;
-               read_response->data_size = 0;
+               read_response->data = malloc(
+                   read_response->data_size);
+               assert(read_response != NULL);
+               read_response->error_code = cache_read(neg_c_entry,
+                   read_request->cache_key,
+                   read_request->cache_key_size,
+                   read_response->data,
+                   &read_response->data_size);
            }
        }
        configuration_unlock_entry(qstate->config_entry, CELT_NEGATIVE);

Применение тривиально:

cd /usr/src
patch < patch-nscd-negttl
cd usr.sbin/nscd
make && make install