X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=regress%2Fhplayback.c.m4;h=dd98f0ec0b8bf1df4172286ebecfd07232318614;hb=fc440c64836370db9d8cb1a25f09c9df0786f865;hp=f6034cb9fd9c5cec04fb88537637a3cbd10e174f;hpb=817bb41e2d62e85c36e490c615466a276fc17d22;p=adns.git diff --git a/regress/hplayback.c.m4 b/regress/hplayback.c.m4 index f6034cb..dd98f0e 100644 --- a/regress/hplayback.c.m4 +++ b/regress/hplayback.c.m4 @@ -45,7 +45,7 @@ m4_include(hmacros.i4) static FILE *Tinputfile, *Tfuzzrawfile, *Treportfile; static vbuf vb2; -static void Tensurereportfile(void) { +static void Tensure_reportfile(void) { const char *fdstr; int fd; @@ -56,7 +56,7 @@ static void Tensurereportfile(void) { Treportfile= fdopen(fd,"a"); if (!Treportfile) Tfailed("fdopen ADNS_TEST_REPORT_FD"); } -static void Tensurefuzzrawfile(void) { +static void Tensure_fuzzrawfile(void) { static int done; if (done) return; @@ -70,7 +70,7 @@ static void Tensurefuzzrawfile(void) { if (!Tfuzzrawfile) Tfailed("fdopen ADNS_TEST_FUZZRAW_DUMP_FD"); } -static void FR_write(void *p, size_t sz) { +static void FR_write(const void *p, size_t sz) { if (!Tfuzzrawfile) return; ssize_t got = fwrite(p,1,sz,Tfuzzrawfile); if (ferror(Tfuzzrawfile)) Tfailed("write fuzzraw output file"); @@ -101,14 +101,18 @@ void T_gettimeofday_hook(void) { struct timeval delta; memset(&delta,0,sizeof(delta)); timersub(¤ttime, &previously, &delta); + previously = currenttime; FR_WRITE(delta); } -void Tensurerecordfile(void) { +void Tensuresetup(void) { int fd; int chars; unsigned long sec, usec; + Tensure_reportfile(); + Tensure_fuzzrawfile(); + if (Tinputfile) return; Tinputfile= stdin; fd = Ttestinputfd(); @@ -194,16 +198,33 @@ static void Pfdset(fd_set *set, int max) { if (vb2.buf[vb2.used++] != hm_squote[hm_squote) Psyntax("fd set start not ["); FD_ZERO(set); - if (vb2.buf[vb2.used] == hm_squote]hm_squote) { vb2.used++; return; } - for (;;) { - ul= strtoul(vb2.buf+vb2.used,&ep,10); - if (ul>=max) Psyntax("fd set member > max"); - if (ep == (char*)vb2.buf+vb2.used) Psyntax("empty entry in fd set"); - FD_SET(ul,set); - vb2.used= ep - (char*)vb2.buf; - c= vb2.buf[vb2.used++]; - if (c == hm_squote]hm_squote) break; - if (c != hm_squote,hm_squote) Psyntax("fd set separator not ,"); + if (vb2.buf[vb2.used] == hm_squote]hm_squote) { + vb2.used++; + } else { + for (;;) { + ul= strtoul(vb2.buf+vb2.used,&ep,10); + if (ul>=max) Psyntax("fd set member > max"); + if (ep == (char*)vb2.buf+vb2.used) Psyntax("empty entry in fd set"); + FD_SET(ul,set); + vb2.used= ep - (char*)vb2.buf; + c= vb2.buf[vb2.used++]; + if (c == hm_squote]hm_squote) break; + if (c != hm_squote,hm_squote) Psyntax("fd set separator not ,"); + } + } + + uint16_t accum; + int inaccum=0, fd; + for (fd=0; ; fd++) { + if (fd>=max || inaccum==16) { + FR_WRITE(accum); + inaccum= 0; + } + if (fd>=max) + break; + accum <<= 1; + accum |= !!FD_ISSET(fd,set); + inaccum++; } } @@ -236,12 +257,15 @@ static void Ppollfds(struct pollfd *fds, int nfds) { if (vb2.buf[vb2.used++] != hm_squote[hm_squote) Psyntax("pollfds start not ["); for (i=0; ifd= strtoul(vb2.buf+vb2.used,&ep,10); + int gotfd= strtoul(vb2.buf+vb2.used,&ep,10); + if (gotfd != fds->fd) Psyntax("poll fds[].fd changed"); vb2.used= ep - (char*)vb2.buf; Pstring(", events=",", events= in pollfds"); - fds->events= Ppollfdevents(); + int gotevents= Ppollfdevents(); + if (gotevents != fds->events) Psyntax("poll fds[].events changed"); Pstring(", revents=",", revents= in pollfds"); fds->revents= Ppollfdevents(); + if (gotevents) FR_WRITE(fds->revents); Pstring("}","} in pollfds"); Pstring(comma,"separator in pollfds"); comma= ", "; @@ -273,6 +297,14 @@ static void Paddr(struct sockaddr *addr, int *lenr) { if (*ep && *ep != ' ') Psyntax("invalid port (bad syntax)"); if (ul >= 65536) Psyntax("port too large"); + if (Tfuzzrawfile) { + int tl = strlen(p); + FR_WRITE(tl); + FR_write(p,tl); + uint16_t port16 = ul; + FR_WRITE(port16); + } + a.len= sizeof(a.addr); err= adns_text2addr(p, (int)ul, 0, &a.addr.sa,&a.len); if (err) Psyntax("invalid address"); @@ -312,7 +344,7 @@ static int Pbytes(byte *buf, int maxlen) { void Q_vb(void) { const char *nl; - Tensurerecordfile(); + Tensuresetup(); if (!adns__vbuf_ensure(&vb2,vb.used+2)) Tnomem(); fread(vb2.buf,1,vb.used+2,Tinputfile); if (feof(Tinputfile)) { @@ -330,7 +362,6 @@ void Q_vb(void) { vb.used,vb.buf, vb.used,vb2.buf+1); exit(1); } - Tensurereportfile(); nl= memchr(vb.buf,'\n',vb.used); fprintf(Treportfile," %.*s\n", (int)(nl ? nl - (const char*)vb.buf : vb.used), vb.buf); } @@ -357,8 +388,7 @@ int H$1(hm_args_massage($3,void)) { if (!adns__vbuf_ensure(&vb2,1000)) Tnomem(); fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput(); - Tensurereportfile(); - Tensurefuzzrawfile(); + Tensuresetup(); fprintf(Treportfile,"%s",vb2.buf); amtread= strlen(vb2.buf); if (amtread<=0 || vb2.buf[--amtread]!=hm_squote\nhm_squote) @@ -366,6 +396,11 @@ int H$1(hm_args_massage($3,void)) { vb2.buf[amtread]= 0; if (memcmp(vb2.buf," $1=",hm_r_offset)) Psyntax("syscall reply mismatch"); +#ifdef FUZZRAW_SYNC + hm_fr_syscall_ident($1) + FR_WRITE(sync_expect); +#endif + m4_define(`hm_rv_check_errno',` if (vb2.buf[hm_r_offset] == hm_squoteEhm_squote) { int e; @@ -423,7 +458,7 @@ int H$1(hm_args_massage($3,void)) { Psyntax("fcntl flags not O_NONBLOCK|... or ~O_NONBLOCK&..."); } } else if (cmd == F_SETFL) { - hm_rv_succfail + hm_rv_check_success } else { Psyntax("fcntl not F_GETFL or F_SETFL"); }