*
* adns asynch ON-YES ON-NO ON-DONTKNOW XARGS \
* TYPE DOMAIN \
- * [QUERY-OPTIONS] => QUERY-ID
+ * [QUERY-OPTIONS...] => QUERY-ID
* calls, later,
* [concat ON-YES|ON-NO|ON-DONTKNOW XARGS RESULTS]
* adns asynch-cancel QUERY-ID
Tcl_Obj *errstring_accum;
};
+struct Query {
+ int ix; /* first! */
+ Resolver *res;
+ adns_query aqu;
+ ScriptToInvoke on_yes, on_no, on_fail;
+ Tcl_Obj *xargs;
+};
+
/* The default resolver is recorded using Tcl_SetAssocData with key
* ASSOC_DEFAULTRES to record the Resolver*. If it was explicitly
* created with `adns new-resolver' then ix will be >=0, and the
static void destroy_resolver(Tcl_Interp *ip, Resolver *res) {
void *query_v;
+ Query *query;
int logstring_len;
char *rstr;
adns_query aqu;
adns_forallqueries_begin(res->ads);
aqu= adns_forallqueries_next(res->ads, &query_v);
if (!aqu) break;
+ query= query_v;
+ assert(query->aqu == aqu);
+ query->aqu= 0; /* avoid disrupting the adns query list */
asynch_query_dispose(ip, query_v);
}
adns_finish(res->ads);
}
int cht_do_adns_destroy_resolver(ClientData cd, Tcl_Interp *ip, void *res_v) {
- cht_tabledataid_disposing(ip,res_v,&adnstcl_resolvers);
+ cht_tabledataid_disposing(ip,res_v,&cht_adnstcl_resolvers);
destroy_resolver(ip,res_v);
return TCL_OK;
}
RRTYPE_RAW(ns),
RRTYPE_RAW(mx),
+ RRTYPE_EXACTLY(txt),
RRTYPE_EXACTLY(soa),
RRTYPE_EXACTLY(ptr),
void *val_v;
int rc;
- rc= cht_pat_iddata(ip,arg,&val_v,&adnstcl_resolvers);
+ rc= cht_pat_iddata(ip,arg,&val_v,&cht_adnstcl_resolvers);
if (rc) return rc;
op->resolver= val_v;
return TCL_OK;
results[1]= cht_ret_int(ip, status);
results[2]= cht_ret_string(ip, adns_errabbrev(status));
results[3]= cht_ret_string(ip, adns_strerror(status));
+ assert(RESULTSTATUS_LLEN==4);
}
static Tcl_Obj *make_resultrdata(Tcl_Interp *ip, adns_answer *answer) {
results[4]= cht_ret_string(ip, answer->owner);
results[5]= cht_ret_string(ip, answer->cname ? answer->cname : "");
results[6]= make_resultrdata(ip, answer);
+ assert(RESULTLIST_LLEN==7);
}
/*---------- synchronous query handling ----------*/
/*---------- asynchronous query handling ----------*/
-struct Query {
- int ix; /* first! */
- Resolver *res;
- adns_query aqu;
- ScriptToInvoke on_yes, on_no, on_fail;
- Tcl_Obj *xargs;
-};
-
static void asynch_check_now(Resolver *res);
static void asynch_timerhandler(void *res_v) {
query= query_v;
query->aqu= 0;
- cht_tabledataid_disposing(interp, query, &adnstcl_queries);
+ cht_tabledataid_disposing(interp, query, &cht_adnstcl_queries);
si= (!answer->status ? &query->on_yes
: answer->status > adns_s_max_tempfail ? &query->on_no
}
static void asynch_query_dispose(Tcl_Interp *interp, Query *query) {
- cht_tabledataid_disposing(interp, query, &adnstcl_queries);
+ cht_tabledataid_disposing(interp, query, &cht_adnstcl_queries);
cht_scriptinv_cancel(&query->on_yes);
cht_scriptinv_cancel(&query->on_no);
cht_scriptinv_cancel(&query->on_fail);
asynch_query_dispose(interp, query_v);
}
-const IdDataSpec adnstcl_queries= {
+const IdDataSpec cht_adnstcl_queries= {
"adns", "adns-query-table", destroy_query_idtabcb
};
/*---------- main hooks for tcl ----------*/
-int cht_do_adnstoplevel_adns(ClientData cd, Tcl_Interp *ip,
- const Adns_SubCommand *subcmd,
- int objc, Tcl_Obj *const *objv) {
- return subcmd->func(0,ip,objc,objv);
-}
-
-extern int Chiark_tcl_adns_Init(Tcl_Interp *ip); /* called by Tcl's "load" */
-int Chiark_tcl_adns_Init(Tcl_Interp *ip) {
- return cht_initextension(ip, cht_adnstoplevel_entries, 0);
-}
+CHT_INIT(adns, {}, CHTI_COMMANDS(cht_adnstoplevel_entries))