X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/faa525942b2ca4964c4a020728768368cab85bd5..47b9db5941ba11277d7bd62060057202236fb921:/regress/hplayback.c diff --git a/regress/hplayback.c b/regress/hplayback.c index d229f34..ed23542 100644 --- a/regress/hplayback.c +++ b/regress/hplayback.c @@ -102,6 +102,10 @@ static void P_updatetime(void) { static void Pfdset(fd_set *set, int max) { int r, c; char *ep; + if (!set) { + Pstring("null","null fdset pointer"); + return; + } if (vb2.buf[vb2.used++] != '[') Psyntax("fd set start not ["); FD_ZERO(set); if (vb2.buf[vb2.used] == ']') { vb2.used++; return; } @@ -153,21 +157,32 @@ static void Ppollfds(struct pollfd *fds, int nfds) { } #endif static void Paddr(struct sockaddr *addr, int *lenr) { - struct sockaddr_in *sa= (struct sockaddr_in*)addr; - char *p, *ep; - long ul; - assert(*lenr >= sizeof(*sa)); - p= strchr(vb2.buf+vb2.used,':'); - if (!p) Psyntax("no port on address"); - *p++= 0; - memset(sa,0,sizeof(*sa)); - sa->sin_family= AF_INET; - if (!inet_aton(vb2.buf+vb2.used,&sa->sin_addr)) Psyntax("invalid address"); - ul= strtoul(p,&ep,10); + adns_rr_addr a; + char *p, *q, *ep; + int err; + unsigned long ul; + p= vb2.buf+vb2.used; + if (*p!='[') { + q= strchr(p,':'); + if (!q) Psyntax("missing :"); + *q++= 0; + } else { + p++; + q= strchr(p,']'); + if (!q) Psyntax("missing ]"); + *q++= 0; + if (*q!=':') Psyntax("expected : after ]"); + q++; + } + ul= strtoul(q,&ep,10); if (*ep && *ep != ' ') Psyntax("invalid port (bad syntax)"); if (ul >= 65536) Psyntax("port too large"); - sa->sin_port= htons(ul); - *lenr= sizeof(*sa); + a.len= sizeof(a.addr); + err= adns_text2addr(p, (int)ul, 0, &a.addr.sa,&a.len); + if (err) Psyntax("invalid address"); + assert(*lenr >= a.len); + memcpy(addr, &a.addr, a.len); + *lenr= a.len; vb2.used= ep - (char*)vb2.buf; } static int Pbytes(byte *buf, int maxlen) { @@ -282,9 +297,9 @@ int Hpoll( struct pollfd *fds , int nfds , int timeout ) { int Hsocket( int domain , int type , int protocol ) { int r, amtread; char *ep; - Tmust("socket","domain",domain==AF_INET); + Tmust("socket","domain",domain==AF_INET || domain==AF_INET6); Tmust("socket","type",type==SOCK_STREAM || type==SOCK_DGRAM); - Qsocket( type ); + Qsocket( domain , type ); if (!adns__vbuf_ensure(&vb2,1000)) Tnomem(); fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput(); Tensurereportfile();