X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl.git;a=blobdiff_plain;f=hbytes%2Fhbytes.h;h=b4fcfb8d551a3481d4e357c5111983ca28075e5e;hp=4b4f4e8210ecacf106d8a8671f5dc5a9ada13380;hb=bf917064c5edc75fdd84371f53e7cef51ff05510;hpb=d6fd8ff47e228354088d5be383a55d1d24099c36 diff --git a/hbytes/hbytes.h b/hbytes/hbytes.h index 4b4f4e8..b4fcfb8 100644 --- a/hbytes/hbytes.h +++ b/hbytes/hbytes.h @@ -65,13 +65,26 @@ * uint VARNAME/VALUE (VARNAME if ul2bitfields; * ulong VARNAME/VALUE VALUE if bitfields2ul) * + * Mask maps: + * + * A maskmap is a slightly efficient mapping from addresses to + * arbitrary data values. An address is a number of octets expressed + * as an hbytes. All the addresses covered by the same maskmap + * should have the same length (even though constructing the maskmap + * does not involve specifying that length). + * * hbytes mask-map lookup MAP-VAR ADDRESS [DEFAULT] => DATA - * error on missing default or if any prefix longer than address + * Error on missing default or if any prefix longer than ADDRESS. + * * hbytes mask-map amend MAP-VAR PREFIX PREFIX-LENGTH DATA - * a maskmap MAP is [list [list PREFIX PREFIX-LENGTH DATA]] sorted - * first by descending PREFIX-LENGTH and then by ascending PREFIX - * each PREFIX _in the map_ is truncated to the shortest number of - * pairs of hex digits which can represent it + * Sets all of the addresses in PREFIX/PREFIX-LENGTH to the + * relevant value. + * + * Representation: + * A maskmap MAP is [list [list PREFIX PREFIX-LENGTH DATA]]. + * The list is sorted by ascending PREFIX and entries do not overlap. + * Each PREFIX in the map is truncated to the shortest number of + * pairs of hex digits which can represent it. * * Error codes * @@ -104,8 +117,7 @@ * TUNTAP IFNAME LENGTH tun/tap interface name too long * TUNTAP MTU OVERRUN tun/tap mtu limited to 2^16 bytes * - * Refs: HMAC: RFC2104 - */ + * Refs: HMAC: RFC2104 */ #ifndef HBYTES_H #define HBYTES_H @@ -122,6 +134,8 @@ #include +#include + typedef unsigned char Byte; /* from hbytes.c */ @@ -200,35 +214,53 @@ void sockaddr_free(const SockAddr_Value*); typedef struct { /* semi-opaque - read only, and then only where commented */ Tcl_Interp *ip; /* valid, non-0 and useable if set */ Tcl_Obj *obj; /* non-0 iff set (but only test for 0/non-0) */ + Tcl_Obj *xargs; int llength; } ScriptToInvoke; void scriptinv_init(ScriptToInvoke *si); -int scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip, Tcl_Obj *newscript); +int scriptinv_set(ScriptToInvoke *si, Tcl_Interp *ip, + Tcl_Obj *newscript, Tcl_Obj *xargs); void scriptinv_cancel(ScriptToInvoke *si); /* then don't invoke */ /* no separate free function - just cancel */ -void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **argv); +void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj *const *argv); /* from idtable.c */ typedef struct { - const char *const prefix; - int n; - void **a; -} IdDataTable; + const char *valprefix, *assockey; + void (*destroyitem)(Tcl_Interp *ip, void *val); +} IdDataSpec; + +/* 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); +int tabledataid_parse(Tcl_Interp *ip, Tcl_Obj *o, const IdDataSpec *idds); +void tabledataid_disposing(Tcl_Interp *ip, void *val, const IdDataSpec *idds); + /* 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 const IdDataSpec adnstcl_queries, adnstcl_resolvers; /* from dgram.c */ -extern IdDataTable dgram_socks; +extern const IdDataSpec dgram_socks; int newfdposixerr(Tcl_Interp *ip, int fd, const char *m); /* from tuntap.c */ -extern IdDataTable tuntap_socks; +extern const IdDataSpec tuntap_socks; /* from hook.c */