X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=base%2Fchiark-tcl.h;h=206f97e909931730cf35315485bcfb915a631a19;hb=86a68f7c8f058dcc55ee136da67c3e0c7030474d;hp=ff5220b886912f98ba0789969a1ee8f854cf1de4;hpb=fa11284b9469c1c79af7f8f129da934c1ebcf594;p=chiark-tcl.git diff --git a/base/chiark-tcl.h b/base/chiark-tcl.h index ff5220b..206f97e 100644 --- a/base/chiark-tcl.h +++ b/base/chiark-tcl.h @@ -17,6 +17,9 @@ * hbytes overwrite VAR START VALUE * hbytes trimleft VAR removes any leading 0 octets * hbytes repeat VALUE COUNT => COUNT copies of VALUE + * hbytes zeroes COUNT => COUNT zero bytes + * hbytes random COUNT => COUNT random bytes + * hbytes xor VAR VALUE $VAR (+)= VALUE * * hbytes ushort2h LONG => LONG must be <2^16, returns as hex * hbytes h2ushort HEX => |HEX| must be 2 bytes, returns as ulong @@ -62,6 +65,32 @@ * uint VARNAME/VALUE (VARNAME if ul2bitfields; * ulong VARNAME/VALUE VALUE if bitfields2ul) * + * Address ranges (addrmap.c): + * + * An address range is a slightly efficient partial 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 addrmap should have the same length. + * + * hbytes addr-map lookup MAP-VAR ADDRESS [DEFAULT] => DATA + * Error on missing default or if any prefix longer than ADDRESS. + * + * hbytes addr-map amend-range MAP-VAR START END DATA + * hbytes addr-map amend-mask MAP-VAR PREFIX PREFIX-LENGTH DATA + * Sets all of the addresses in PREFIX/PREFIX-LENGTH to the + * relevant value. + * + * Representation: + * An address map MAP is + * [list BIT-LENGTH \ + * [list START END DATA-VALUE] \ + * [list START' END' DATA-VALUE'] \ + * ... + * ] + * The list is sorted by ascending START and entries do not overlap. + * START and END are both inclusive. BIT-LENGTH is in usual Tcl + * integer notation and must be a multiple of 8. + * * Error codes * * HBYTES BLOCKCIPHER CRYPTFAIL CRYPT block cipher mode failed somehow (!) @@ -72,8 +101,15 @@ * HBYTES LENGTH OVERRUN block too long * HBYTES LENGTH RANGE input length or offset is -ve or silly * HBYTES LENGTH UNDERRUN block too short (or offset too big) + * 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 ADDRMAP NOMATCH no addr/mask matches address for lookup + * HBYTES ADDRMAP UNDERRUN addr for lookup or amend is too short + * HBYTES ADDRMAP OVERRUN addr for lookup or amend is too long + * HBYTES ADDRMAP EXCLBITS amend-mask 1-bits outside prefix len + * HBYTES ADDRMAP BADRANGE amend-range start > end + * HBYTES ADDRMAP VALUE addr-map string value is erroneous * 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 @@ -82,9 +118,10 @@ * ULONG BITCOUNT UNDERRUN bitfields add up to less than 32 * ULONG VALUE NEGATIVE attempt convert -ve integers to ulong * ULONG VALUE OVERFLOW converted value does not fit in result + * 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 @@ -99,7 +136,9 @@ #include #include -#include +#include + +#include typedef unsigned char Byte; @@ -174,10 +213,58 @@ int sockaddr_len(const SockAddr_Value*); const struct sockaddr *sockaddr_addr(const SockAddr_Value*); void sockaddr_free(const SockAddr_Value*); +/* from scriptinv.c */ + +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, 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 *const *argv); + +/* from idtable.c */ + +typedef struct { + 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, 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 Tcl_ObjType dgramsockid_type; -typedef struct DgramSocket *DgramSockID; +extern const IdDataSpec dgram_socks; +int newfdposixerr(Tcl_Interp *ip, int fd, const char *m); + +/* from tuntap.c */ + +extern const IdDataSpec tuntap_socks; /* from hook.c */ @@ -198,12 +285,30 @@ void obj_updatestr_string(Tcl_Obj *o, const char *str); /* from parse.c */ typedef struct { - HBytes_Value *hb; Tcl_Obj *obj, *var; int copied; +} Something_Var; + +void init_somethingv(Something_Var *sth); +void fini_somethingv(Tcl_Interp *ip, int rc, Something_Var *sth); +int pat_somethingv(Tcl_Interp *ip, Tcl_Obj *var, + Something_Var *sth, Tcl_ObjType *type); + +typedef struct { + HBytes_Value *hb; + Something_Var sth; } HBytes_Var; -void fini_hbv(Tcl_Interp *ip, int rc, HBytes_Var *agg); +/* from addrmap.c */ + +typedef struct AddrMap_Value AddrMap_Value; + +typedef struct { + AddrMap_Value *am; + Something_Var sth; +} AddrMap_Var; + +extern Tcl_ObjType addrmap_type; /* from chop.c */ /* only do_... functions declared in tables.h */ @@ -323,5 +428,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*/