X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=blobdiff_plain;f=regress%2Fhplayback.c;h=279934c63e05c9319bb9bef64b8fff39946b04e4;hp=92570ff90c827a8ab19ef3c0795f11bb47b8a34f;hb=58a876e5ac9539ff14acb7dc3ea3633f5bdb41d8;hpb=f9476535903f0225fba0733203580c88b30ad6a1 diff --git a/regress/hplayback.c b/regress/hplayback.c index 92570ff..279934c 100644 --- a/regress/hplayback.c +++ b/regress/hplayback.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include "harness.h" @@ -31,7 +32,7 @@ static void Pcheckinput(void) { if (ferror(Tinputfile)) Tfailed("read test log input file"); if (feof(Tinputfile)) Psyntax("eof at syscall reply"); } -static void Tensureinputfile(void) { +void Tensurerecordfile(void) { const char *fdstr; int fd; int chars; @@ -152,21 +153,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) { @@ -193,11 +205,10 @@ static int Pbytes(byte *buf, int maxlen) { } } void Q_vb(void) { - int r; const char *nl; - Tensureinputfile(); + Tensurerecordfile(); if (!adns__vbuf_ensure(&vb2,vb.used+2)) Tnomem(); - r= fread(vb2.buf,1,vb.used+2,Tinputfile); + fread(vb2.buf,1,vb.used+2,Tinputfile); if (feof(Tinputfile)) { fprintf(stderr,"adns test harness: input ends prematurely; program did:\n %.*s\n", vb.used,vb.buf); @@ -282,9 +293,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(); @@ -384,6 +395,60 @@ int Hconnect( int fd , const struct sockaddr *addr , int addrlen ) { P_updatetime(); return r; } +int Hbind( int fd , const struct sockaddr *addr , int addrlen ) { + int r, amtread; + Qbind( fd , addr , addrlen ); + if (!adns__vbuf_ensure(&vb2,1000)) Tnomem(); + fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput(); + Tensurereportfile(); + fprintf(Treportfile,"%s",vb2.buf); + amtread= strlen(vb2.buf); + if (amtread<=0 || vb2.buf[--amtread]!='\n') + Psyntax("badly formed line"); + vb2.buf[amtread]= 0; + if (memcmp(vb2.buf," bind=",6)) Psyntax("syscall reply mismatch"); + if (vb2.buf[6] == 'E') { + int e; + e= Perrno(vb2.buf+6); + P_updatetime(); + errno= e; + return -1; + } + if (memcmp(vb2.buf+6,"OK",2)) Psyntax("success/fail not E* or OK"); + vb2.used= 6+2; + r= 0; + assert(vb2.used <= amtread); + if (vb2.used != amtread) Psyntax("junk at end of line"); + P_updatetime(); + return r; +} +int Hlisten( int fd , int backlog ) { + int r, amtread; + Qlisten( fd , backlog ); + if (!adns__vbuf_ensure(&vb2,1000)) Tnomem(); + fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput(); + Tensurereportfile(); + fprintf(Treportfile,"%s",vb2.buf); + amtread= strlen(vb2.buf); + if (amtread<=0 || vb2.buf[--amtread]!='\n') + Psyntax("badly formed line"); + vb2.buf[amtread]= 0; + if (memcmp(vb2.buf," listen=",8)) Psyntax("syscall reply mismatch"); + if (vb2.buf[8] == 'E') { + int e; + e= Perrno(vb2.buf+8); + P_updatetime(); + errno= e; + return -1; + } + if (memcmp(vb2.buf+8,"OK",2)) Psyntax("success/fail not E* or OK"); + vb2.used= 8+2; + r= 0; + assert(vb2.used <= amtread); + if (vb2.used != amtread) Psyntax("junk at end of line"); + P_updatetime(); + return r; +} int Hclose( int fd ) { int r, amtread; Qclose( fd );