if (ferror(Tinputfile)) Tfailed("read test log input file");
if (feof(Tinputfile)) Psyntax("eof at syscall reply");
}
-static void Tensureinputfile(void) {
+void Tensurerecordfile(void) {
const char *fdstr;
int fd;
int chars;
}
#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);
+ 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;
}
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);
int Hsocket( int domain , int type , int protocol ) {
int r, amtread;
char *ep;
- Tmust("socket","domain",domain==AF_INET);
+ Tmust("socket","domain",domain==AF_INET || domain==AF_INET6);
Tmust("socket","type",type==SOCK_STREAM || type==SOCK_DGRAM);
- Qsocket( type );
+ Qsocket( domain , type );
if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
Tensurereportfile();
P_updatetime();
return r;
}
+int Hbind( int fd , const struct sockaddr *addr , int addrlen ) {
+ int r, amtread;
+ Qbind( fd , addr , addrlen );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," bind=",6)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[6] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+6);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ if (memcmp(vb2.buf+6,"OK",2)) Psyntax("success/fail not E* or OK");
+ vb2.used= 6+2;
+ r= 0;
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ P_updatetime();
+ return r;
+}
+int Hlisten( int fd , int backlog ) {
+ int r, amtread;
+ Qlisten( fd , backlog );
+ if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
+ fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
+ Tensurereportfile();
+ fprintf(Treportfile,"%s",vb2.buf);
+ amtread= strlen(vb2.buf);
+ if (amtread<=0 || vb2.buf[--amtread]!='\n')
+ Psyntax("badly formed line");
+ vb2.buf[amtread]= 0;
+ if (memcmp(vb2.buf," listen=",8)) Psyntax("syscall reply mismatch");
+ if (vb2.buf[8] == 'E') {
+ int e;
+ e= Perrno(vb2.buf+8);
+ P_updatetime();
+ errno= e;
+ return -1;
+ }
+ if (memcmp(vb2.buf+8,"OK",2)) Psyntax("success/fail not E* or OK");
+ vb2.used= 8+2;
+ r= 0;
+ assert(vb2.used <= amtread);
+ if (vb2.used != amtread) Psyntax("junk at end of line");
+ P_updatetime();
+ return r;
+}
int Hclose( int fd ) {
int r, amtread;
Qclose( fd );