X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=blobdiff_plain;f=regress%2Fhplayback.c.m4;h=8e6424f3e67b8bb5267c6208058afc97f713f95f;hp=5431c26132e6416299bdc3d88dcbdecd77a0ffb0;hb=636b69b1a03bec395d304c354f4f2f8121b97150;hpb=70a778e57fbc29a2d2bc8976745a18f4edd1a03a diff --git a/regress/hplayback.c.m4 b/regress/hplayback.c.m4 index 5431c26..8e6424f 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; @@ -65,6 +89,20 @@ static void Parg(const char *argname) { if (vb2.buf[vb2.used++] != hm_squote=hm_squote) Psyntax("not = after argument name"); } +static int Pstring_maybe(const char *string) { + int l; + + l= strlen(string); + if (memcmp(vb2.buf+vb2.used,string,l)) return 0; + vb2.used+= l; + return 1; +} + +static void Pstring(const char *string, const char *emsg) { + if (Pstring_maybe(string)) return; + Psyntax(emsg); +} + static int Perrno(const char *stuff) { const struct Terrno *te; int r; @@ -77,35 +115,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) { @@ -125,6 +150,49 @@ static void Pfdset(fd_set *set, int max) { } } +#ifdef HAVE_POLL +static int Ppollfdevents(void) { + int events; + + if (Pstring_maybe("0")) return 0; + events= 0; + + if (Pstring_maybe("POLLIN")) { + events |= POLLIN; + if (!Pstring_maybe("|")) return events; + } + + if (Pstring_maybe("POLLOUT")) { + events |= POLLOUT; + if (!Pstring_maybe("|")) return events; + } + + Pstring("POLLPRI","pollfdevents PRI?"); + return events; +} + +static void Ppollfds(struct pollfd *fds, int nfds) { + int i; + char *ep; + const char *comma= ""; + + if (vb2.buf[vb2.used++] != hm_squote[hm_squote) Psyntax("pollfds start not ["); + for (i=0; ifd= strtoul(vb2.buf+vb2.used,&ep,10); + vb2.used= ep - (char*)vb2.buf; + Pstring(", events=",", events= in pollfds"); + fds->events= Ppollfdevents(); + Pstring(", revents=",", revents= in pollfds"); + fds->revents= Ppollfdevents(); + Pstring("}","} in pollfds"); + Pstring(comma,"separator in pollfds"); + comma= ", "; + } + if (vb2.buf[vb2.used++] != hm_squote]hm_squote) Psyntax("pollfds end not ]"); +} +#endif + static void Paddr(struct sockaddr *addr, int *lenr) { struct sockaddr_in *sa= (struct sockaddr_in*)addr; char *p, *ep; @@ -204,6 +272,7 @@ int H$1(hm_args_massage($3,void)) { m4_define(`hm_rv_len',`') m4_define(`hm_rv_must',`') m4_define(`hm_rv_succfail',`') + m4_define(`hm_rv_fcntl',`') $2 hm_create_hqcall_vars @@ -218,7 +287,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 +297,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; } @@ -243,12 +317,29 @@ fprintf(stderr,"syscallr %s",vb2.buf); vb2.used= ep - (char*)vb2.buf; ') m4_define(`hm_rv_fd',`hm_rv_any') + m4_define(`hm_rv_fcntl',` + r= 0; + if (cmd == F_GETFL) { + if (!memcmp(vb2.buf+hm_r_offset,"O_NONBLOCK|...",14)) { + r= O_NONBLOCK; + vb2.used= hm_r_offset+14; + } else if (!memcmp(vb2.buf+hm_r_offset,"~O_NONBLOCK&...",15)) { + vb2.used= hm_r_offset+15; + } else { + Psyntax("fcntl flags not O_NONBLOCK|... or ~O_NONBLOCK&..."); + } + } else if (cmd == F_SETFL) { + hm_rv_succfail + } else { + Psyntax("fcntl not F_GETFL or F_SETFL"); + } + ') $2 hm_create_nothing m4_define(`hm_arg_fdset_io',`Parg("$'`1"); Pfdset($'`1,$'`2);') + m4_define(`hm_arg_pollfds_io',`Parg("$'`1"); Ppollfds($'`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 +347,7 @@ fprintf(stderr,"syscallr %s",vb2.buf); m4_define(`hm_arg_bytes_out',`r= Pbytes($'`2,$'`4);') $3 + P_updatetime(); return r; } ')