X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=base%2Fchiark-tcl.h;h=875b23911402d6e6e72edf8b50b83190764971d2;hb=a079a543a386bd6946e48a628d2f768b3057dcc0;hp=f57b037f649078b6c2661b968f338a1c48ffe893;hpb=476c966037dfec5a0a2b03511dced36c673c2307;p=chiark-tcl.git diff --git a/base/chiark-tcl.h b/base/chiark-tcl.h index f57b037..875b239 100644 --- a/base/chiark-tcl.h +++ b/base/chiark-tcl.h @@ -66,7 +66,7 @@ * ulong VARNAME/VALUE VALUE if bitfields2ul) * * hbytes mask-map lookup MAP-VAR ADDRESS [DEFAULT] => DATA - * error on missing default or if address too short + * 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 @@ -86,10 +86,13 @@ * HBYTES LENGTH MISMATCH when blocks must be exactly same length * HBYTES SYNTAX supposed hex block had wrong syntax * HBYTES VALUE OVERFLOW value to be conv'd to hex too big/long + * HBYTES MASKMAP NOMATCH no addr/mask matches address for lookup + * HBYTES MASKMAP UNDERRUN addr value for lookup is too short * HBYTES MASKMAP SYNTAX LLENGTH value for mask-map entry not llength==3 * HBYTES MASKMAP SYNTAX UNDERRUN value for mask-map entry hex too short * HBYTES MASKMAP SYNTAX OVERRUN actual mask-map entry hex too short * HBYTES MASKMAP SYNTAX ORDER actual mask-map is disordered + * HBYTES MASKMAP SYNTAX EXCLBITS mask-map has 1-bits outside prefix len * SOCKADDR AFUNIX LENGTH path for AF_UNIX socket too long * SOCKADDR SYNTAX IPV4 bad IPv4 socket address &/or port * SOCKADDR SYNTAX OTHER bad socket addr, couldn't tell what kind @@ -119,6 +122,8 @@ #include +#include + typedef unsigned char Byte; /* from hbytes.c */ @@ -197,11 +202,13 @@ 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 */ @@ -210,22 +217,38 @@ void scriptinv_invoke(ScriptToInvoke *si, int argc, Tcl_Obj **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 */ @@ -389,5 +412,6 @@ int setnonblock(int fd, int isnonblock); #define TALLOC(s) ((void*)Tcl_Alloc((s))) #define TFREE(f) (Tcl_Free((void*)(f))) +#define TREALLOC(p,l) ((void*)Tcl_Realloc((void*)(p),(l))) #endif /*HBYTES_H*/