chiark / gitweb /
regress: Improve debug stdout from fuzzraw
[adns.git] / regress / hfuzzraw.c.m4
index a1a9d0fb7645520e2ad8cefadfa2e12ba76c2ca3..00d7030f6b447e8cbbca2a0b73fd25c00b54dc3d 100644 (file)
@@ -108,11 +108,12 @@ static void P_read_dump(const unsigned char *p0, size_t count, ssize_t d) {
 }
     
 static void P_read(void *p, size_t sz, const char *what) {
+  long pos = ftell(Tinputfile);
   ssize_t got = fread(p,1,sz,Tinputfile);
   Pcheckinput();
   assert(got==sz);
   if (stdout_enable && sz) {
-    fprintf(stdout,"%s:",what);
+    fprintf(stdout,"%8lx %8s:",pos,what);
     P_read_dump(p, sz, +1);
     if (sz<=16) {
       P_read_dump((const unsigned char *)p+sz-1, sz, -1);
@@ -161,26 +162,40 @@ static int Pbytes(byte *buf, int maxlen) {
 }
 
 static void Pfdset(fd_set *set, int max, int *r_io) {
-  uint16_t got;
-  int fd, ngot=0;
+  uint16_t fdmap;
+  int fd, nfdmap=0;
+
+  if (!set)
+    return;
+
+  for (fd=max-1; fd>=0; fd--) {
+    if (nfdmap==0) {
+      P_READ(fdmap);
+      nfdmap= 16;
+    }
+    _Bool y = fdmap & 1u;
+    fdmap >>= 1;
+    nfdmap--;
 
-  for (fd=0; fd<max; fd++) {
     if (!FD_ISSET(fd,set)) continue;
+
     P_fdf(fd);
-    if (ngot==0) {
-      P_READ(got);
-      ngot= 16;
-    }
-    if (got & 1u) {
+
+    if (y) {
       (*r_io)++;
     } else {
       FD_CLR(fd,set);
     }
-    got >>= 1;
-    ngot--;
   }
 }
 
+#ifdef FUZZRAW_SYNC
+static void Psync(const char *exp, char *got, size_t sz, const char *what) {
+  P_read(got,sz,"syscall");
+  if (memcmp(exp,got,sz)) Pformat(what);
+}
+#endif
+
 #ifdef HAVE_POLL
 static void Ppollfds(struct pollfd *fds, int nfds, int *r_io) {
   int fd;
@@ -195,15 +210,15 @@ static void Ppollfds(struct pollfd *fds, int nfds, int *r_io) {
 #endif
 
 static int P_succfail(void) {
-  int r;
-  P_READ(r);
-  if (r<0 && -r<Tnerrnos) {
-    errno= Terrnos[-r].v;
+  int e;
+  P_READ(e);
+  if (e<0 && -e<Tnerrnos) {
+    errno= Terrnos[-e].v;
     return -1;
-  } else if (r>0 && r<=255) {
-    errno= r;
+  } else if (e>0 && e<=255) {
+    errno= e;
     return -1;
-  } else if (r) {
+  } else if (e) {
     Pformat("wrong errno value");
   }
   return 0;
@@ -229,6 +244,12 @@ int H$1(hm_args_massage($3,void)) {
    Q$1(hm_args_massage($3));
  }
 
+#ifdef FUZZRAW_SYNC
+  static const char sync_expect[]= "$1";
+  static char sync_got[sizeof(sync_expect)];
+  Psync(sync_expect, sync_got, sizeof(sync_got), "sync lost: exp=$1");
+#endif
+
  m4_define(`hm_rv_succfail',`
   r= P_succfail();
   if (r<0) return r;