/*
* adns.c - adns binding for Tcl
- * Copyright 2006 Ian Jackson
+ * Copyright 2006-2012 Ian Jackson
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301, USA.
+ * along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#define _GNU_SOURCE
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);
RRTYPE_RAW(ns),
RRTYPE_RAW(mx),
+ RRTYPE_EXACTLY(txt),
RRTYPE_EXACTLY(soa),
RRTYPE_EXACTLY(ptr),
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) {
/*---------- 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);
-}
-
CHT_INIT(adns, {}, CHTI_COMMANDS(cht_adnstoplevel_entries))