X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=dgram%2Fsockaddr.c;h=7373629bb4341297560ed7400c43318b2d067ebe;hb=382dc154ad04e75c16d062af9e4ab49a82330ba0;hp=4df9aa0376414750f1c4e30b72e83b1027e2a24d;hpb=ceb4860abfe091be1ff68795d820ea4c9afc4f4a;p=chiark-tcl.git diff --git a/dgram/sockaddr.c b/dgram/sockaddr.c index 4df9aa0..7373629 100644 --- a/dgram/sockaddr.c +++ b/dgram/sockaddr.c @@ -8,14 +8,13 @@ * ./rel/path/to/socket AF_UNIX */ -#include "hbytes.h" -#include "tables.h" +#include "dgram.h" #define SOCKADDR_LEN(sa) ((sa)->end - (sa)->begin) /* parsing */ -int pat_sockaddr(Tcl_Interp *ip, Tcl_Obj *o, SockAddr_Value *val) { +int cht_pat_sockaddr(Tcl_Interp *ip, Tcl_Obj *o, SockAddr_Value *val) { int rc; rc= Tcl_ConvertToType(ip,o,&sockaddr_type); @@ -25,7 +24,7 @@ int pat_sockaddr(Tcl_Interp *ip, Tcl_Obj *o, SockAddr_Value *val) { return TCL_OK; } -Tcl_Obj *ret_sockaddr(Tcl_Interp *ip, SockAddr_Value val) { +Tcl_Obj *cht_ret_sockaddr(Tcl_Interp *ip, SockAddr_Value val) { Tcl_Obj *o; o= Tcl_NewObj(); @@ -37,50 +36,50 @@ Tcl_Obj *ret_sockaddr(Tcl_Interp *ip, SockAddr_Value val) { /* native type methods */ -void sockaddr_clear(SockAddr_Value *v) { v->begin= v->end= 0; } +void cht_sockaddr_clear(SockAddr_Value *v) { v->begin= v->end= 0; } -void sockaddr_create(SockAddr_Value *v, const struct sockaddr *addr, int len) { +void cht_sockaddr_create(SockAddr_Value *v, const struct sockaddr *a, int al) { Byte *begin; - v->begin= begin= TALLOC(len); - memcpy(begin, addr, len); - v->end= begin + len; + v->begin= begin= TALLOC(al); + memcpy(begin, a, al); + v->end= begin + al; } -int sockaddr_len(const SockAddr_Value *v) { +int cht_sockaddr_len(const SockAddr_Value *v) { return SOCKADDR_LEN(v); } -const struct sockaddr *sockaddr_addr(const SockAddr_Value *v) { +const struct sockaddr *cht_sockaddr_addr(const SockAddr_Value *v) { return (const void*)v->begin; } -void sockaddr_free(const SockAddr_Value *v) { +void cht_sockaddr_free(const SockAddr_Value *v) { TFREE(v->begin); } /* Sockaddr Tcl type */ static void sockaddr_t_dup(Tcl_Obj *src, Tcl_Obj *dup) { - objfreeir(dup); - sockaddr_create(OBJ_SOCKADDR(dup), - sockaddr_addr(OBJ_SOCKADDR(src)), - sockaddr_len(OBJ_SOCKADDR(src))); + cht_sockaddr_create(OBJ_SOCKADDR(dup), + cht_sockaddr_addr(OBJ_SOCKADDR(src)), + cht_sockaddr_len(OBJ_SOCKADDR(src))); + dup->typePtr= &cht_hbytes_type; } static void sockaddr_t_free(Tcl_Obj *o) { - sockaddr_free(OBJ_SOCKADDR(o)); + cht_sockaddr_free(OBJ_SOCKADDR(o)); } static void sockaddr_t_ustr(Tcl_Obj *o) { const struct sockaddr *sa; char i46buf[INET6_ADDRSTRLEN], portbuf[50]; const struct sockaddr_in *sin; - int al, sl, pl; + int al; const char *string, *prepend; - sa= sockaddr_addr(OBJ_SOCKADDR(o)); - al= sockaddr_len(OBJ_SOCKADDR(o)); + sa= cht_sockaddr_addr(OBJ_SOCKADDR(o)); + al= cht_sockaddr_len(OBJ_SOCKADDR(o)); switch (sa->sa_family) { case AF_INET: @@ -102,16 +101,14 @@ static void sockaddr_t_ustr(Tcl_Obj *o) { break; default: /* ouch ! */ - obj_updatestr_array_prefix(o,(const void*)sa,al,"?"); + cht_obj_updatestr_array_prefix(o,(const void*)sa,al,"?"); return; } - pl= strlen(prepend); - sl= strlen(string); - o->length= pl+sl; - o->bytes= TALLOC(pl+sl+1); - memcpy(o->bytes, prepend, pl); - memcpy(o->bytes+pl, string, sl+1); + cht_obj_updatestr_vstringls(o, + prepend, strlen(prepend), + string, strlen(string), + (char*)0); } static int sockaddr_t_sfa(Tcl_Interp *ip, Tcl_Obj *o) { @@ -126,7 +123,7 @@ static int sockaddr_t_sfa(Tcl_Interp *ip, Tcl_Obj *o) { const char *comma, *path; str= Tcl_GetStringFromObj(o,0); assert(str); - objfreeir(o); + cht_objfreeir(o); memset(&s,0,sizeof(s)); if (str[0]=='/' || (str[0]=='.' && str[1]=='/')) { @@ -139,7 +136,7 @@ static int sockaddr_t_sfa(Tcl_Interp *ip, Tcl_Obj *o) { else { assert(str[0]=='/' && str[1]!='/'); path=str; } if (strlen(str) >= sizeof(s.sun.sun_path)) - return staticerr(ip, "AF_UNIX path too long"); + return cht_staticerr(ip, "AF_UNIX path too long", "SOCKADDR AFUNIX LENGTH"); strcpy(s.sun.sun_path, path); @@ -161,25 +158,28 @@ static int sockaddr_t_sfa(Tcl_Interp *ip, Tcl_Obj *o) { } TFREE(copy); - if (!iprv) return staticerr(ip, "bad IPv4 address syntax"); + if (!iprv) + return cht_staticerr(ip, "bad IPv4 address syntax", "SOCKADDR SYNTAX IPV4"); comma++; if (!strcmp(comma,"*")) { s.sin.sin_port= 0; } else { errno=0; port_l=strtoul(comma,&ep,10); - if (errno || *ep) return staticerr(ip, "bad IPv4 port"); - if (port_l > 65535) return staticerr(ip, "IPv4 port out of range"); + if (errno || *ep) + return cht_staticerr(ip, "bad IPv4 port", "SOCKADDR SYNTAX IPV4"); + if (port_l > 65535) + return cht_staticerr(ip, "IPv4 port out of range", "SOCKADDR SYNTAX IPV4"); s.sin.sin_port= htons(port_l); } } else { - return staticerr(ip, "bad socket address syntax"); + return cht_staticerr(ip, "bad socket address syntax", "SOCKADDR SYNTAX OTHER"); } - sockaddr_create(OBJ_SOCKADDR(o), (void*)&s, sl); + cht_sockaddr_create(OBJ_SOCKADDR(o), (void*)&s, sl); o->typePtr = &sockaddr_type; return TCL_OK;