From: ian Date: Sat, 7 Jan 2006 20:16:37 +0000 (+0000) Subject: hbytes compiles X-Git-Tag: debian/1.1.1~95 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-tcl.git;a=commitdiff_plain;h=da1c2c3cbb87a600f19e250f93ef9fa4f89844fc;ds=sidebyside hbytes compiles --- diff --git a/adns/.cvsignore b/adns/.cvsignore index 6796ef3..fc2ec4f 100644 --- a/adns/.cvsignore +++ b/adns/.cvsignore @@ -1,2 +1,2 @@ -tables.[ch] +*+tcmdif.[ch] *.d diff --git a/base/.cvsignore b/base/.cvsignore index e7a6c22..fc2ec4f 100644 --- a/base/.cvsignore +++ b/base/.cvsignore @@ -1,2 +1,2 @@ -adns+tcmdif.[ch] +*+tcmdif.[ch] *.d diff --git a/base/chiark-tcl-base.h b/base/chiark-tcl-base.h new file mode 100644 index 0000000..d8f000a --- /dev/null +++ b/base/chiark-tcl-base.h @@ -0,0 +1,5 @@ +#include +#include + +#include "chiark-tcl.h" +#include "base+tcmdif.h" diff --git a/base/tcmdifgen b/base/tcmdifgen index d5e6622..4b67596 100755 --- a/base/tcmdifgen +++ b/base/tcmdifgen @@ -56,7 +56,7 @@ # Arranges for generated .h files to #include the specified # file. C-INCLUDE-SPECIFIER should include the <..> or "..". # -# Table TABLENAME C-ENTRY-TYPE +# Table [*]TABLENAME C-ENTRY-TYPE # Starts a table of commands or subcommands. The generated .h # will contain a definition of C-ENTRY-TYPE containing # const char *name; @@ -89,6 +89,10 @@ # arguments, processes the command, and sets any result, as # applicable. # +# `*' should be used if the table name is not useful for error +# messages. It suppresses `TABLENAME ' from the front of the +# autogenerated argument parsing error strings. +# # ExtraEntry C-ENTRY-TYPE # Introduces a section of additional C code which will be inserted # into the definition of C-ENTRY-TYPE by `Table'. The C @@ -178,11 +182,12 @@ sub parse ($$) { unshift @i, $this_indent; } - if (@i==0 && m/^Table\s+(\w+)\s+(\w+)$/) { + if (@i==0 && m/^Table\s+(\*?)(\w+)\s+(\w+)$/) { zilch(); - $c_table= $1; - $table_x{$c_table}{C}= $2; - $entrytype_x{$2}= '' unless exists $entrytype_x{$2}; + $c_table= $2; + $table_x{$c_table}{T}= $1; + $table_x{$c_table}{C}= $3; + $entrytype_x{$3}= '' unless exists $entrytype_x{$3}; } elsif (@i==0 && m/^Untabled$/) { zilch(); $c_table= ''; @@ -291,7 +296,8 @@ foreach $c_table (sort keys %tables) { $any_eerr= 0; $any_eargc= 0; $pa_hint= ''; - $pa_hint .= "$c_table " if length $c_table; + $pa_hint .= "$c_table " if length $c_table && + !length $table_x{$c_table}{T}; $pa_hint.= $c_entry; foreach $arg (@{ $r_entry->{A} }) { $n= $arg->{N}; diff --git a/crypto/crypto.h b/crypto/crypto.h new file mode 100644 index 0000000..82efb61 --- /dev/null +++ b/crypto/crypto.h @@ -0,0 +1,77 @@ +/* from crypto.c */ + +void memxor(Byte *dest, const Byte *src, int l); + +typedef struct { + const char *name; + int pad, use_algname; +} PadOp; + +extern Tcl_ObjType blockcipherkey_type; + +/* from algtables.c */ + +typedef struct { + const char *name; + int int_offset; +} BlockCipherPropInfo, HashAlgPropInfo; + +typedef struct { + const char *name; + int hashsize, blocksize, statesize; + void (*init)(void *state); + void (*update)(void *state, const void *data, int len); + void (*final)(void *state, void *digest); + void (*oneshot)(void *digest, const void *data, int len); +} HashAlgInfo; + +extern const HashAlgInfo hashalginfos[]; + +typedef struct { + void (*make_schedule)(void *schedule, const void *key, int keylen); + void (*crypt)(const void *schedule, const void *in, void *out); + /* in and out may be the same, but if they aren't they may not overlap */ + /* in and out for crypt will have been through block_byteswap */ +} BlockCipherPerDirectionInfo; + +typedef struct { + const char *name; + int blocksize, schedule_size, key_min, key_max; + BlockCipherPerDirectionInfo encrypt, decrypt; +} BlockCipherAlgInfo; + +extern const BlockCipherAlgInfo blockcipheralginfos[]; + +/* from bcmode.c */ + +typedef struct { + const char *name; + int iv_blocks, buf_blocks, mac_blocks; + + /* Each function is allowed to use up to buf_blocks * blocksize + * bytes of space in buf. data is blocks * blocksize bytes + * long. data should be modified in place by encrypt and decrypt; + * modes may not change the size of data. iv is always provided and + * is always of length iv_blocks * blocksize; encrypt and + * decrypt may modify the iv value (in which case the Tcl caller + * will get the modified IV) but this is not recommended. mac + * should leave the mac, which must be mac_blocks * blocksize + * bytes, in buf. (Therefore mac_blocks must be at least + * buf_blocks.) + */ + const char *(*encrypt)(Byte *data, int nblocks, + const Byte *iv, Byte *buf, + const BlockCipherAlgInfo *alg, int encr, + const void *sch); + const char *(*decrypt)(Byte *data, int nblocks, + const Byte *iv, Byte *buf, + const BlockCipherAlgInfo *alg, int encr, + const void *sch); + const char *(*mac)(const Byte *data, int nblocks, + const Byte *iv, Byte *buf, + const BlockCipherAlgInfo *alg, + const void *sch); +} BlockCipherModeInfo; + +extern const BlockCipherModeInfo blockciphermodeinfos[]; + diff --git a/crypto/hook.c b/crypto/hook.c new file mode 100644 index 0000000..3e1f87e --- /dev/null +++ b/crypto/hook.c @@ -0,0 +1 @@ + Tcl_RegisterObjType(&blockcipherkey_type); diff --git a/dgram/dgram.h b/dgram/dgram.h new file mode 100644 index 0000000..d95185c --- /dev/null +++ b/dgram/dgram.h @@ -0,0 +1,22 @@ +/* from sockaddr.c */ + +typedef struct { + Byte *begin, *end; +} SockAddr_Value; + +extern Tcl_ObjType sockaddr_type; + +void sockaddr_clear(SockAddr_Value*); +void sockaddr_create(SockAddr_Value*, const struct sockaddr *addr, int len); +int sockaddr_len(const SockAddr_Value*); +const struct sockaddr *sockaddr_addr(const SockAddr_Value*); +void sockaddr_free(const SockAddr_Value*); + +/* from dgram.c */ + +extern const IdDataSpec dgram_socks; + +/* from misc.c */ + +int setnonblock(int fd, int isnonblock); + diff --git a/dgram/hook.c b/dgram/hook.c new file mode 100644 index 0000000..72b3f70 --- /dev/null +++ b/dgram/hook.c @@ -0,0 +1 @@ + Tcl_RegisterObjType(&sockaddr_type); diff --git a/hbytes/.cvsignore b/hbytes/.cvsignore new file mode 100644 index 0000000..fc2ec4f --- /dev/null +++ b/hbytes/.cvsignore @@ -0,0 +1,2 @@ +*+tcmdif.[ch] +*.d diff --git a/hbytes/Makefile b/hbytes/Makefile index a1955b7..8551e29 100644 --- a/hbytes/Makefile +++ b/hbytes/Makefile @@ -1,6 +1,6 @@ BASE_DIR = ../base EXTBASE = hbytes -CFILES = addrmap chop hbytes hook parse ulongs +CFILES = chop hbytes hook parse ulongs include ../base/extension.make diff --git a/hbytes/chiark_tcl_hbytes.h b/hbytes/chiark_tcl_hbytes.h new file mode 100644 index 0000000..8786a6a --- /dev/null +++ b/hbytes/chiark_tcl_hbytes.h @@ -0,0 +1,25 @@ +/* + */ + +#ifndef CHIARK_TCL_HBYTES_H +#define CHIARK_TCL_HBYTES_H + +#include "hbytes.h" + +typedef struct { + Byte *start; /* byl bytes */ + Tcl_Obj *data; /* may be 0 to mean empty */ +} AddrMap_Entry; + +struct AddrMap_Value { + int byl, used, space; + AddrMap_Entry *entries; + /* Entries are sorted by start. Each entry gives value (or lack of + * it) for all A st START <= A < NEXT-START. Last entry has value + * (or lack of it) for all A >= START. First entry is always + * present and always has start all-bits-0. */ +}; /* internalRep.otherValuePtr */ + +#include "hbytes+tcmdif.h" + +#endif /*CHIARK_TCL_HBYTES_H*/ diff --git a/hbytes/hbglue.c b/hbytes/hbglue.c deleted file mode 100644 index 1ac833d..0000000 --- a/hbytes/hbglue.c +++ /dev/null @@ -1,23 +0,0 @@ -int cht_pat_hbv(Tcl_Interp *ip, Tcl_Obj *var, HBytes_Var *agg) { - int rc; - rc= pat_somethingv(ip,var,&agg->sth,&hbytes_type); if (rc) return rc; - agg->hb= OBJ_HBYTES(agg->sth.obj); - return TCL_OK; -} - -int cht_pat_hb(Tcl_Interp *ip, Tcl_Obj *obj, HBytes_Value *val) { - int rc; - rc= Tcl_ConvertToType(ip,obj,&hbytes_type); if (rc) return rc; - *val= *OBJ_HBYTES(obj); - return TCL_OK; -} - -Tcl_Obj *cht_ret_hb(Tcl_Interp *ip, HBytes_Value val) { - Tcl_Obj *obj; - obj= Tcl_NewObj(); - Tcl_InvalidateStringRep(obj); - *OBJ_HBYTES(obj)= val; - obj->typePtr= &hbytes_type; - return obj; -} - diff --git a/hbytes/hbytes.tct b/hbytes/hbytes.tct index abfd45a..299d4a9 100644 --- a/hbytes/hbytes.tct +++ b/hbytes/hbytes.tct @@ -9,7 +9,7 @@ Type addrmapv: AddrMap_Var @ Init addrmapv @.am=0; cht_init_somethingv(&@.sth); Fini addrmapv cht_fini_somethingv(ip, rc, &@.sth); -Table hbytestoplevel TopLevel_Command +Table *hbytestoplevel TopLevel_Command hbytes subcmd enum(HBytes/_SubCommand, "hbytes subcommand") ... obj @@ -126,24 +126,3 @@ Table hbytes HBytes_SubCommand random length int => hb -# addr-map -# subcmd enum(AddrMap/_SubCommand, "hbytes addr-map subcommand") -# ... obj - -#Table addrmap AddrMap_SubCommand -# lookup -# map constv(&cht_addrmap_type) -# addr hb -# ?def obj -# => obj -# amend-range -# map addrmapv -# start hb -# end hb -# data obj -# amend-mask -# map addrmapv -# prefix hb -# preflen obj -# data obj - diff --git a/hbytes/hook.c b/hbytes/hook.c index 4c742f3..7eeb437 100644 --- a/hbytes/hook.c +++ b/hbytes/hook.c @@ -266,12 +266,6 @@ int cht_do_hbytes_range(ClientData cd, Tcl_Interp *ip, return TCL_OK; } -int cht_do_hbytes_addr_map(ClientData cd, Tcl_Interp *ip, - const AddrMap_SubCommand *subcmd, - int objc, Tcl_Obj *const *objv) { - return subcmd->func(0,ip,objc,objv); -} - /* hbytes representing uint16_t's */ int cht_do_hbytes_h2ushort(ClientData cd, Tcl_Interp *ip, @@ -323,6 +317,5 @@ int Chiark_tcl_hbytes_Init(Tcl_Interp *ip) { return cht_initextension(ip, cht_hbytestoplevel_entries, &initd, &cht_hbytes_type, &cht_ulong_type, - &cht_addrmap_type, (Tcl_ObjType*)0); } diff --git a/hbytes/parse.c b/hbytes/parse.c index a363514..266de4b 100644 --- a/hbytes/parse.c +++ b/hbytes/parse.c @@ -3,6 +3,13 @@ #include "chiark_tcl_hbytes.h" +int cht_pat_hbv(Tcl_Interp *ip, Tcl_Obj *var, HBytes_Var *agg) { + int rc; + rc= cht_pat_somethingv(ip,var,&agg->sth,&cht_hbytes_type); + if (rc) return rc; + agg->hb= OBJ_HBYTES(agg->sth.obj); + return TCL_OK; +} int cht_pat_hb(Tcl_Interp *ip, Tcl_Obj *obj, HBytes_Value *val) { int rc; rc= Tcl_ConvertToType(ip,obj,&cht_hbytes_type); if (rc) return rc; diff --git a/maskmap/maskmap-bits.c b/maskmap/maskmap-bits.c new file mode 100644 index 0000000..88cb31c --- /dev/null +++ b/maskmap/maskmap-bits.c @@ -0,0 +1,15 @@ +int cht_do_hbytes_addr_map(ClientData cd, Tcl_Interp *ip, + const AddrMap_SubCommand *subcmd, + int objc, Tcl_Obj *const *objv) { + return subcmd->func(0,ip,objc,objv); +} + +xxxx +extern int Chiark_tcl_hbytes_Init(Tcl_Interp *ip); /*called by load(3tcl)*/ +int Chiark_tcl_hbytes_Init(Tcl_Interp *ip) { + static int initd; + + return cht_initextension(ip, cht_hbytestoplevel_entries, &initd, + &cht_addrmap_type, + (Tcl_ObjType*)0); +} diff --git a/maskmap/maskmap.tct b/maskmap/maskmap.tct new file mode 100644 index 0000000..ed1ca77 --- /dev/null +++ b/maskmap/maskmap.tct @@ -0,0 +1,22 @@ +Table maskmaptoplevel TopLevel_Command + addr-map + subcmd enum(AddrMap/_SubCommand, "addr-map subcommand") + ... obj + +Table addrmap AddrMap_SubCommand + lookup + map constv(&cht_addrmap_type) + addr hb + ?def obj + => obj + amend-range + map addrmapv + start hb + end hb + data obj + amend-mask + map addrmapv + prefix hb + preflen obj + data obj + diff --git a/tuntap/tuntap.h b/tuntap/tuntap.h new file mode 100644 index 0000000..f23eee1 --- /dev/null +++ b/tuntap/tuntap.h @@ -0,0 +1,4 @@ +/* from tuntap.c */ + +extern const IdDataSpec tuntap_socks; + diff --git a/tuntap/tuntap.tct b/tuntap/tuntap.tct new file mode 100644 index 0000000..22f01fb --- /dev/null +++ b/tuntap/tuntap.tct @@ -0,0 +1,18 @@ + +Table tuntap_socket_raw TunSocket_SubCommand + create + ?ifname string + => iddata(&tuntap_socks) + close + sock iddata(&tuntap_socks) + ifname + sock iddata(&tuntap_socks) + => string + receive + sock iddata(&tuntap_socks) + data hb + on-transmit + sock iddata(&tuntap_socks) + mtu long + ?script obj +