X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=blobdiff_plain;f=regress%2Fhplayback.c.m4;h=3437293d9a71fa651101386e65c3b55c0ad62c33;hp=5da418ae3f8f38d5a749a75f8714fff4b946d876;hb=239d2e4dfb6fcfc26fe3f740efae8f6944b99799;hpb=98b6d5b430d4326235c108afcc8a4e4ee36559f4 diff --git a/regress/hplayback.c.m4 b/regress/hplayback.c.m4 index 5da418a..3437293 100644 --- a/regress/hplayback.c.m4 +++ b/regress/hplayback.c.m4 @@ -2,7 +2,12 @@ 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 +m4_dnl Copyright (C) 1997-2000 Ian Jackson +m4_dnl +m4_dnl It is part of adns, which is +m4_dnl Copyright (C) 1997-2000 Ian Jackson +m4_dnl Copyright (C) 1999-2000 Tony Finch 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 @@ -22,23 +27,32 @@ m4_include(hmacros.i4) #include #include -#include #include #include +#include #include #include #include +#include + +#include +#include #include "harness.h" static FILE *Tinputfile, *Treportfile; static vbuf vb2; +extern void Tshutdown(void) { + adns__vbuf_free(&vb2); +} + static void Tensurereportfile(void) { const char *fdstr; int fd; + if (Treportfile) return; Treportfile= stderr; fdstr= getenv("ADNS_TEST_REPORT_FD"); if (!fdstr) return; fd= atoi(fdstr); @@ -68,6 +82,7 @@ static void Tensureinputfile(void) { fd= atoi(fdstr); Tinputfile= fdopen(fd,"r"); if (!Tinputfile) Tfailed("fdopen ADNS_TEST_IN_FD"); } + setvbuf(Tinputfile,0,_IONBF,0); if (!adns__vbuf_ensure(&vb2,1000)) Tnomem(); fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput(); @@ -89,6 +104,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; @@ -96,8 +125,8 @@ static int Perrno(const char *stuff) { for (te= Terrnos; te->n && strcmp(te->n,stuff); te++); if (te->n) return te->v; - r= strtoul(stuff+1,&ep,10); - if (ep) Psyntax("errno value not recognised, not numeric"); + r= strtoul(stuff+2,&ep,10); + if (*ep) Psyntax("errno value not recognised, not numeric"); return r; } @@ -125,9 +154,11 @@ 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 (;;) { r= strtoul(vb2.buf+vb2.used,&ep,10); if (r>=max) Psyntax("fd set member > max"); + if (ep == (char*)vb2.buf+vb2.used) Psyntax("empty entry in fd set"); FD_SET(r,set); vb2.used= ep - (char*)vb2.buf; c= vb2.buf[vb2.used++]; @@ -136,6 +167,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; @@ -185,6 +259,7 @@ static int Pbytes(byte *buf, int maxlen) { void Q_vb(void) { int r; + const char *nl; Tensureinputfile(); if (!adns__vbuf_ensure(&vb2,vb.used+2)) Tnomem(); @@ -204,17 +279,21 @@ 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); } m4_define(`hm_syscall', ` hm_create_proto_h int H$1(hm_args_massage($3,void)) { - int r; + int r, amtread; m4_define(`hm_rv_fd',`char *ep;') m4_define(`hm_rv_any',`char *ep;') 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 @@ -231,11 +310,11 @@ int H$1(hm_args_massage($3,void)) { fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput(); Tensurereportfile(); - fprintf(Treportfile,"syscallr %s",vb2.buf); - vb2.avail= strlen(vb2.buf); - if (vb.avail<=0 || vb2.buf[--vb2.avail]!=hm_squote\nhm_squote) + fprintf(Treportfile,"%s",vb2.buf); + amtread= strlen(vb2.buf); + if (amtread<=0 || vb2.buf[--amtread]!=hm_squote\nhm_squote) Psyntax("badly formed line"); - vb2.buf[vb2.avail]= 0; + vb2.buf[amtread]= 0; if (memcmp(vb2.buf," $1=",hm_r_offset)) Psyntax("syscall reply mismatch"); if (vb2.buf[hm_r_offset] == hm_squoteEhm_squote) { @@ -259,13 +338,32 @@ int H$1(hm_args_massage($3,void)) { 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);') $3 - if (vb2.used != vb2.avail) Psyntax("junk at end of line"); + assert(vb2.used <= amtread); + if (vb2.used != amtread) Psyntax("junk at end of line"); hm_create_nothing m4_define(`hm_arg_bytes_out',`r= Pbytes($'`2,$'`4);') @@ -276,4 +374,6 @@ int H$1(hm_args_massage($3,void)) { } ') +m4_define(`hm_specsyscall', `') + m4_include(`hsyscalls.i4')