chiark / gitweb /
Reentrancy: Avoid reentrant callbacks
[adns.git] / regress / hplayback.c
index fdb3a7d307e17eecf699d30fa8ceec9e9b174e29..9b88ef480a5238857e7a01d3abb70cb99acc99dc 100644 (file)
@@ -32,7 +32,7 @@ static void Pcheckinput(void) {
   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;
@@ -153,21 +153,32 @@ 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);
+  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) {
@@ -194,11 +205,10 @@ 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);
@@ -283,9 +293,9 @@ int Hpoll(  struct pollfd *fds , int nfds , int timeout     ) {
 int Hsocket(   int domain , int type , int protocol    ) {
  int r, amtread;
  char *ep;
-       Tmust("socket","domain",domain==AF_INET); 
+  Tmust("socket","domain",domain==PF_INET || domain==PF_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();
@@ -385,6 +395,60 @@ int Hconnect(      int fd , const struct sockaddr *addr , int addrlen      ) {
  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      );