X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/70a778e57fbc29a2d2bc8976745a18f4edd1a03a..ee6166884ef7ff56046ca6d65fe0ad8583f61074:/regress/hplayback.c.m4 diff --git a/regress/hplayback.c.m4 b/regress/hplayback.c.m4 index 5431c26..aec0393 100644 --- a/regress/hplayback.c.m4 +++ b/regress/hplayback.c.m4 @@ -2,7 +2,7 @@ m4_dnl hplayback.c.m4 m4_dnl (part of complex test harness, not of the library) m4_dnl - playback routines -m4_dnl This file is part of adns, which is Copyright (C) 1997, 1998 Ian Jackson +m4_dnl This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson m4_dnl m4_dnl This program is free software; you can redistribute it and/or modify m4_dnl it under the terms of the GNU General Public License as published by @@ -32,17 +32,17 @@ m4_include(hmacros.i4) #include "harness.h" -static FILE *Tinputfile; +static FILE *Tinputfile, *Treportfile; static vbuf vb2; -static void Tensureinputfile(void) { +static void Tensurereportfile(void) { const char *fdstr; int fd; - Tinputfile= stdin; - fdstr= getenv("ADNS_TEST_IN_FD"); if (!fdstr) return; + Treportfile= stderr; + fdstr= getenv("ADNS_TEST_REPORT_FD"); if (!fdstr) return; fd= atoi(fdstr); - Tinputfile= fdopen(fd,"r"); if (!Tinputfile) Tfailed("fdopen ADNS_TEST_IN_FD"); + Treportfile= fdopen(fd,"a"); if (!Treportfile) Tfailed("fdopen ADNS_TEST_REPORT_FD"); } static void Psyntax(const char *where) { @@ -55,6 +55,30 @@ static void Pcheckinput(void) { if (feof(Tinputfile)) Psyntax("eof at syscall reply"); } +static void Tensureinputfile(void) { + const char *fdstr; + int fd; + int chars; + unsigned long sec, usec; + + if (Tinputfile) return; + Tinputfile= stdin; + fdstr= getenv("ADNS_TEST_IN_FD"); + if (fdstr) { + fd= atoi(fdstr); + Tinputfile= fdopen(fd,"r"); if (!Tinputfile) Tfailed("fdopen ADNS_TEST_IN_FD"); + } + + if (!adns__vbuf_ensure(&vb2,1000)) Tnomem(); + fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput(); + chars= -1; + sscanf(vb2.buf," start %lu.%lu%n",&sec,&usec,&chars); + if (chars==-1) Psyntax("start time invalid"); + currenttime.tv_sec= sec; + currenttime.tv_usec= usec; + if (vb2.buf[chars] != hm_squote\nhm_squote) Psyntax("not newline after start time"); +} + static void Parg(const char *argname) { int l; @@ -77,35 +101,22 @@ static int Perrno(const char *stuff) { return r; } -static struct timeval begin; - -static void Ptimevalabs(struct timeval *tvr) { - int store, chars; +static void P_updatetime(void) { + int chars; unsigned long sec, usec; - struct timeval rv; - - if (vb2.buf[vb2.used]==hm_squote+hm_squote) { - vb2.used++; - rv= begin; - store= 0; - } else { - rv.tv_sec= 0; - rv.tv_usec= 0; - store= 1; - } + + if (!adns__vbuf_ensure(&vb2,1000)) Tnomem(); + fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput(); chars= -1; - sscanf(vb2.buf+vb2.used,"%lu.%lu%n",&sec,&usec,&chars); - if (chars==-1) Psyntax("timeval syntax error"); - rv.tv_sec += sec; - rv.tv_usec += usec; - if (begin.tv_usec > 1000000) { - rv.tv_sec++; - rv.tv_usec -= 1000000; + sscanf(vb2.buf," +%lu.%lu%n",&sec,&usec,&chars); + if (chars==-1) Psyntax("update time invalid"); + currenttime.tv_sec+= sec; + currenttime.tv_usec+= usec; + if (currenttime.tv_usec > 1000000) { + currenttime.tv_sec++; + currenttime.tv_usec -= 1000000; } - *tvr= rv; - if (store) begin= rv; - - vb2.used += chars; + if (vb2.buf[chars] != hm_squote\nhm_squote) Psyntax("not newline after update time"); } static void Pfdset(fd_set *set, int max) { @@ -218,7 +229,9 @@ int H$1(hm_args_massage($3,void)) { m4_define(`hm_r_offset',`m4_len(` $1=')') if (!adns__vbuf_ensure(&vb2,1000)) Tnomem(); fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput(); -fprintf(stderr,"syscallr %s",vb2.buf); + + Tensurereportfile(); + fprintf(Treportfile,"syscallr %s",vb2.buf); vb2.avail= strlen(vb2.buf); if (vb.avail<=0 || vb2.buf[--vb2.avail]!=hm_squote\nhm_squote) Psyntax("badly formed line"); @@ -226,7 +239,10 @@ fprintf(stderr,"syscallr %s",vb2.buf); if (memcmp(vb2.buf," $1=",hm_r_offset)) Psyntax("syscall reply mismatch"); if (vb2.buf[hm_r_offset] == hm_squoteEhm_squote) { - errno= Perrno(vb2.buf+hm_r_offset); + int e; + e= Perrno(vb2.buf+hm_r_offset); + P_updatetime(); + errno= e; return -1; } @@ -248,7 +264,6 @@ fprintf(stderr,"syscallr %s",vb2.buf); hm_create_nothing m4_define(`hm_arg_fdset_io',`Parg("$'`1"); Pfdset($'`1,$'`2);') m4_define(`hm_arg_addr_out',`Parg("$'`1"); Paddr($'`1,$'`2);') - m4_define(`hm_arg_timeval_out_abs',`Parg("$'`1"); Ptimevalabs($'`1);') $3 if (vb2.used != vb2.avail) Psyntax("junk at end of line"); @@ -256,6 +271,7 @@ fprintf(stderr,"syscallr %s",vb2.buf); m4_define(`hm_arg_bytes_out',`r= Pbytes($'`2,$'`4);') $3 + P_updatetime(); return r; } ')