queryargs="$*"
initstring="`cat $srcdir/init-$initfile.text`"
+initstring="$initstring
+options adns_qid_predictable_ok
+"
xinitflagsf=$srcdir/$program-xinitflags.text
if test -e $xinitflagsf
then
read <&4 queryargs
initstring="`cat $srcdir/init-$initfile.text`"
+ initstring="$initstring
+options adns_qid_predictable_ok
+"
xinitflagsf=$srcdir/$program-xinitflags.text
if test -e $xinitflagsf
then
* control the relative order of addresses in answers. This option
* overrides the corresponding init flags (covered by adns_if_afmask).
*
+ * adns_qid_predictable_ok
+ * Do not print an error message to stderr if we cannot use getentropy()
+ * to generate random query-ids. In this case,
+ *
* adns_ignoreunkcfg
* Ignore unknown options and configuration directives, rather than
* logging them. To be effective, appear in the configuration
} sortlist[MAXSORTLIST];
char **searchlist;
unsigned config_report_unknown:1;
+ unsigned nextid_report_fallback:1;
unsigned short rand48xsubi[3];
};
#include "internal.h"
+/* common, error handling */
+
+static void good_failure(adns_state ads, const char *fmt, ...)
+ PRINTFFORMAT(2,3);
+
+static void good_failure(adns_state ads, const char *fmt, ...) {
+ va_list al;
+
+ if (!ads->nextid_report_fallback) return;
+ ads->nextid_report_fallback= 0;
+
+ va_start(al,fmt);
+ adns__vdiag(ads,
+ " warning (suppress with 'options adns_qid_predictable_ok')",
+ adns_if_noerrprint, -1,0, fmt, al);
+ va_end(al);
+}
+
#ifdef HAVE_GETENTROPY
/* use getentropy */
if (!ads->nextid.full) {
r= getentropy(ads->nextid.buf, sizeof(ads->nextid.buf));
if (r) {
- // XXXX log a warning
+ good_failure(ads, "getentropy() failed: %s", strerror(errno));
return -1;
}
ads->nextid.full= NEXTID_RANDOM_BUF_COUNT;
static void good_init(struct nextid_state *state) { }
static int32_t good_nextid(adns_state ads) {
- // XXXX log a warning
+ good_failure(ads, "getentropy() not available on this operating system");
return -1;
}
ads->config_report_unknown=0;
continue;
}
+ if (WORD_IS("adns_qid_predictable_ok")) {
+ ads->nextid_report_fallback= 0;
+ continue;
+ }
if (/* adns's query strategy is not configurable */
WORD_STARTS("timeout:") ||
WORD_STARTS("attempts:") ||
timerclear(&ads->tcptimeout);
ads->searchlist= 0;
ads->config_report_unknown=1;
+ ads->nextid_report_fallback=1;
pid= getpid();
ads->rand48xsubi[0]= pid;