X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=regress%2Fhplayback.c.m4;h=112475d8201ad95c5de3fa16dc16679de2e1363a;hb=8c09a4c65fb124c379c349f2ef8b84ad9e440545;hp=d7b383a0c495b3fd39e5c480f114b03c25fc394b;hpb=680003740eaac3b9fb876dc1ac4d321942b451f0;p=adns.git diff --git a/regress/hplayback.c.m4 b/regress/hplayback.c.m4 index d7b383a..112475d 100644 --- a/regress/hplayback.c.m4 +++ b/regress/hplayback.c.m4 @@ -2,16 +2,15 @@ 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 -m4_dnl Copyright (C) 1997-1999 Ian Jackson -m4_dnl -m4_dnl It is part of adns, which is -m4_dnl Copyright (C) 1997-1999 Ian Jackson -m4_dnl Copyright (C) 1999 Tony Finch +m4_dnl This file is part of adns, which is +m4_dnl Copyright (C) 1997-2000,2003,2006 Ian Jackson +m4_dnl Copyright (C) 1999-2000,2003,2006 Tony Finch +m4_dnl Copyright (C) 1991 Massachusetts Institute of Technology +m4_dnl (See the file INSTALL for full details.) 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 -m4_dnl the Free Software Foundation; either version 2, or (at your option) +m4_dnl the Free Software Foundation; either version 3, or (at your option) m4_dnl any later version. m4_dnl m4_dnl This program is distributed in the hope that it will be useful, @@ -20,26 +19,33 @@ m4_dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the m4_dnl GNU General Public License for more details. m4_dnl m4_dnl You should have received a copy of the GNU General Public License -m4_dnl along with this program; if not, write to the Free Software Foundation, -m4_dnl Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +m4_dnl along with this program; if not, write to the Free Software Foundation. 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; @@ -61,7 +67,7 @@ static void Pcheckinput(void) { if (feof(Tinputfile)) Psyntax("eof at syscall reply"); } -static void Tensureinputfile(void) { +void Tensurerecordfile(void) { const char *fdstr; int fd; int chars; @@ -74,6 +80,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(); @@ -145,9 +152,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++]; @@ -200,23 +209,35 @@ 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); - if (*ep && *ep != hm_squote hm_squote) Psyntax("invalid port (bad syntax)"); + 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; } @@ -247,11 +268,11 @@ 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); @@ -267,6 +288,9 @@ 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', ` @@ -295,7 +319,7 @@ int H$1(hm_args_massage($3,void)) { fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput(); Tensurereportfile(); - fprintf(Treportfile,"syscallr %s",vb2.buf); + fprintf(Treportfile,"%s",vb2.buf); amtread= strlen(vb2.buf); if (amtread<=0 || vb2.buf[--amtread]!=hm_squote\nhm_squote) Psyntax("badly formed line"); @@ -359,4 +383,6 @@ int H$1(hm_args_massage($3,void)) { } ') +m4_define(`hm_specsyscall', `') + m4_include(`hsyscalls.i4')