#include <tcl8.3/tcl.h>
+#include <adns.h>
+
typedef unsigned char Byte;
/* from hbytes.c */
void **a;
} IdDataTable;
+/* The stored struct must start with a single int, conventionally
+ * named `ix'. When the struct is returned for the first time ix must
+ * be -1; on subsequent occasions it must be >=0. ix will be -1 iff
+ * the struct is registered by the iddatatable machinery. */
+
extern Tcl_ObjType tabledataid_nearlytype;
int tabledataid_parse(Tcl_Interp *ip, Tcl_Obj *o, IdDataTable *tab);
+void tabledataid_disposing(void *val, IdDataTable *tab);
+ /* call this when you destroy the struct, to remove its name;
+ * _disposing is idempotent*/
+
+/* from adns.c */
+
+typedef struct {
+ const char *name;
+ adns_rrtype number;
+} AdnsTclRRTypeInfo;
+
+extern IdDataTable adnstcl_queries, adnstcl_resolvers;
/* from dgram.c */
/*
*/
-/*
- * dgram-socket create <local> => <sockid>
- * dgram-socket close <sockid>
- * dgram-socket transmit <sockid> <data> <remote>
- * dgram-socket on-receive <sockid> [<script>]
- * calls, effectively, eval <script> [list <data> <remote-addr> <socket>]
- * if script not supplied, cancel
- */
#include "tables.h"
#include "hbytes.h"
return TCL_OK;
}
+void tabledataid_disposing(void *val, IdDataTable *tab) {
+ int ix;
+
+ ix= *(int*)val;
+ if (ix==-1) return;
+ assert(tab->a[ix] == val);
+ tab->a[ix]= 0;
+ *(int*)val= -1;
+}
+
int pat_iddata(Tcl_Interp *ip, Tcl_Obj *o, void **rv, IdDataTable *tab) {
int rc, ix;
void *r;
int do_dgram_socket_close(ClientData cd, Tcl_Interp *ip, void *sock_v) {
DgramSocket *sock= sock_v;
- int sockix;
+
cancel(sock);
close(sock->fd); /* nothing useful to be done with errors */
- sockix= sock->ix;
+ tabledataid_disposing(sock,&dgram_socks);
TFREE(sock->addr_buf);
TFREE(sock->msg_buf);
TFREE(sock);
- dgram_socks.a[sockix]= 0;
return TCL_OK;
}
#include <tcl8.3/tcl.h>
+#include <adns.h>
+
typedef unsigned char Byte;
/* from hbytes.c */
void **a;
} IdDataTable;
+/* The stored struct must start with a single int, conventionally
+ * named `ix'. When the struct is returned for the first time ix must
+ * be -1; on subsequent occasions it must be >=0. ix will be -1 iff
+ * the struct is registered by the iddatatable machinery. */
+
extern Tcl_ObjType tabledataid_nearlytype;
int tabledataid_parse(Tcl_Interp *ip, Tcl_Obj *o, IdDataTable *tab);
+void tabledataid_disposing(void *val, IdDataTable *tab);
+ /* call this when you destroy the struct, to remove its name;
+ * _disposing is idempotent*/
+
+/* from adns.c */
+
+typedef struct {
+ const char *name;
+ adns_rrtype number;
+} AdnsTclRRTypeInfo;
+
+extern IdDataTable adnstcl_queries, adnstcl_resolvers;
/* from dgram.c */