+static void init_abort(adns_state ads) {
+ if (ads->nsearchlist) {
+ free(ads->searchlist[0]);
+ free(ads->searchlist);
+ }
+ free(ads);
+}
+
+static void logfn_file(adns_state ads, void *logfndata,
+ const char *fmt, va_list al) {
+ vfprintf(logfndata,fmt,al);
+}
+
+static int init_files(adns_state *ads_r, adns_initflags flags,
+ adns_logcallbackfn *logfn, void *logfndata) {
+ adns_state ads;
+ const char *res_options, *adns_res_options;
+ int r;
+
+ r= init_begin(&ads, flags, logfn, logfndata);
+ if (r) return r;
+
+ res_options= instrum_getenv(ads,"RES_OPTIONS");
+ adns_res_options= instrum_getenv(ads,"ADNS_RES_OPTIONS");
+ ccf_options(ads,"RES_OPTIONS",-1,res_options);
+ ccf_options(ads,"ADNS_RES_OPTIONS",-1,adns_res_options);
+
+ readconfig(ads,"/etc/resolv.conf",1);
+ readconfig(ads,"/etc/resolv-adns.conf",0);
+ readconfigenv(ads,"RES_CONF");
+ readconfigenv(ads,"ADNS_RES_CONF");
+
+ readconfigenvtext(ads,"RES_CONF_TEXT");
+ readconfigenvtext(ads,"ADNS_RES_CONF_TEXT");
+
+ ccf_options(ads,"RES_OPTIONS",-1,res_options);
+ ccf_options(ads,"ADNS_RES_OPTIONS",-1,adns_res_options);
+
+ ccf_search(ads,"LOCALDOMAIN",-1,instrum_getenv(ads,"LOCALDOMAIN"));
+ ccf_search(ads,"ADNS_LOCALDOMAIN",-1,instrum_getenv(ads,"ADNS_LOCALDOMAIN"));
+
+ if (ads->configerrno && ads->configerrno != EINVAL) {
+ r= ads->configerrno;
+ init_abort(ads);
+ return r;
+ }
+
+ r= init_finish(ads);
+ if (r) return r;
+
+ adns__consistency(ads,0,cc_entex);
+ *ads_r= ads;
+ return 0;
+}
+
+int adns_init(adns_state *ads_r, adns_initflags flags, FILE *diagfile) {
+ return init_files(ads_r, flags, logfn_file, diagfile ? diagfile : stderr);
+}
+
+static int init_strcfg(adns_state *ads_r, adns_initflags flags,
+ adns_logcallbackfn *logfn, void *logfndata,
+ const char *configtext) {
+ adns_state ads;
+ int r;
+
+ r= init_begin(&ads, flags, logfn, logfndata);
+ if (r) return r;
+
+ readconfigtext(ads,configtext,"<supplied configuration text>");
+ if (ads->configerrno) {
+ r= ads->configerrno;
+ init_abort(ads);
+ return r;
+ }
+
+ r= init_finish(ads); if (r) return r;
+ adns__consistency(ads,0,cc_entex);
+ *ads_r= ads;
+ return 0;
+}
+
+int adns_init_strcfg(adns_state *ads_r, adns_initflags flags,
+ FILE *diagfile, const char *configtext) {
+ return init_strcfg(ads_r, flags,
+ diagfile ? logfn_file : 0, diagfile,
+ configtext);
+}
+
+int adns_init_logfn(adns_state *newstate_r, adns_initflags flags,
+ const char *configtext /*0=>use default config files*/,
+ adns_logcallbackfn *logfn /*0=>logfndata is a FILE* */,
+ void *logfndata /*0 with logfn==0 => discard*/) {
+ if (!logfn && logfndata)
+ logfn= logfn_file;
+ if (configtext)
+ return init_strcfg(newstate_r, flags, logfn, logfndata, configtext);
+ else
+ return init_files(newstate_r, flags, logfn, logfndata);
+}
+