updated).
* Add documentation comment by definition of adns_r_ptr_raw type enum.
* Add -Wno-pointer-sign if GCC has that option.
+ * Call Tensurerecordfile in Hgettimeofday (Tensurerecordfile was
+ Tensureinputfile/Tensureoutputfile).
+ * Add bind(2) and listen(2) to test harness (for epithet's benefit, but
+ harmless in adns).
+ * Add missing ENOTSOCK to hcommon.c.m4 (was already in hcommon.c!)
--
void Qsocket( int type );
void Qfcntl( int fd , int cmd , long arg );
void Qconnect( int fd , const struct sockaddr *addr , int addrlen );
+void Qbind( int fd , const struct sockaddr *addr , int addrlen );
+void Qlisten( int fd , int backlog );
void Qclose( int fd );
void Qsendto( int fd , const void *msg , int msglen , const struct sockaddr *addr , int addrlen );
void Qrecvfrom( int fd , int buflen , int addrlen );
void Toutputerr(void);
void Tnomem(void);
void Tfsyscallr(const char *fmt, ...) PRINTFFORMAT(1,2);
-void Tensureoutputfile(void);
+void Tensurerecordfile(void);
void Tmust(const char *call, const char *arg, int cond);
void Tvbf(const char *fmt, ...) PRINTFFORMAT(1,2);
void Tvbvf(const char *fmt, va_list al);
void Toutputerr(void);
void Tnomem(void);
void Tfsyscallr(const char *fmt, ...) PRINTFFORMAT(1,2);
-void Tensureoutputfile(void);
+void Tensurerecordfile(void);
void Tmust(const char *call, const char *arg, int cond);
void Tvbf(const char *fmt, ...) PRINTFFORMAT(1,2);
};
static vbuf vbw;
int Hgettimeofday(struct timeval *tv, struct timezone *tz) {
+ Tensurerecordfile();
Tmust("gettimeofday","tz",!tz);
*tv= currenttime;
return 0;
Tvba(" addr="); Tvbaddr(addr,addrlen);
Q_vb();
}
+void Qbind( int fd , const struct sockaddr *addr , int addrlen ) {
+ vb.used= 0;
+ Tvba("bind");
+ Tvbf(" fd=%d",fd);
+ Tvba(" addr="); Tvbaddr(addr,addrlen);
+ Q_vb();
+}
+void Qlisten( int fd , int backlog ) {
+ vb.used= 0;
+ Tvba("listen");
+ Tvbf(" fd=%d",fd);
+ Tvbf(" backlog=%d",backlog);
+ Q_vb();
+}
void Qclose( int fd ) {
vb.used= 0;
Tvba("close");
{ "ECONNRESET", ECONNRESET },
{ "ECONNREFUSED", ECONNREFUSED },
{ "EPIPE", EPIPE },
+ { "ENOTSOCK", ENOTSOCK },
{ 0, 0 }
};
static vbuf vbw;
int Hgettimeofday(struct timeval *tv, struct timezone *tz) {
+ Tensurerecordfile();
Tmust("gettimeofday","tz",!tz);
*tv= currenttime;
return 0;
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;
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);
if (feof(Tinputfile)) {
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 );
if (feof(Tinputfile)) Psyntax("eof at syscall reply");
}
-static void Tensureinputfile(void) {
+void Tensurerecordfile(void) {
const char *fdstr;
int fd;
int chars;
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);
if (feof(Tinputfile)) {
static void R_recordtime(void) {
int r;
struct timeval tv, tvrel;
- Tensureoutputfile();
+ Tensurerecordfile();
r= gettimeofday(&tv,0); if (r) Tfailed("gettimeofday syscallbegin");
tvrel.tv_sec= tv.tv_sec - currenttime.tv_sec;
tvrel.tv_usec= tv.tv_usec - currenttime.tv_usec;
Tvbf("\n +%ld.%06ld",(long)tvrel.tv_sec,(long)tvrel.tv_usec);
currenttime= tv;
}
-void Tensureoutputfile(void) {
+void Tensurerecordfile(void) {
const char *fdstr;
int fd, r;
if (Toutputfile) return;
}
void Q_vb(void) {
if (!adns__vbuf_append(&vb,"",1)) Tnomem();
- Tensureoutputfile();
+ Tensurerecordfile();
if (fprintf(Toutputfile," %s\n",vb.buf) == EOF) Toutputerr();
if (fflush(Toutputfile)) Toutputerr();
}
errno= e;
return r;
}
+int Hbind( int fd , const struct sockaddr *addr , int addrlen ) {
+ int r, e;
+ Qbind( fd , addr , addrlen );
+ r= bind( fd , addr , addrlen );
+ e= errno;
+ vb.used= 0;
+ Tvba("bind=");
+ if (r) { Tvberrno(e); goto x_error; }
+ Tvba("OK");
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
+int Hlisten( int fd , int backlog ) {
+ int r, e;
+ Qlisten( fd , backlog );
+ r= listen( fd , backlog );
+ e= errno;
+ vb.used= 0;
+ Tvba("listen=");
+ if (r) { Tvberrno(e); goto x_error; }
+ Tvba("OK");
+ x_error:
+ R_recordtime();
+ R_vb();
+ errno= e;
+ return r;
+}
int Hclose( int fd ) {
int r, e;
Qclose( fd );
int r;
struct timeval tv, tvrel;
- Tensureoutputfile();
+ Tensurerecordfile();
r= gettimeofday(&tv,0); if (r) Tfailed("gettimeofday syscallbegin");
tvrel.tv_sec= tv.tv_sec - currenttime.tv_sec;
tvrel.tv_usec= tv.tv_usec - currenttime.tv_usec;
currenttime= tv;
}
-void Tensureoutputfile(void) {
+void Tensurerecordfile(void) {
const char *fdstr;
int fd, r;
void Q_vb(void) {
if (!adns__vbuf_append(&vb,"",1)) Tnomem();
- Tensureoutputfile();
+ Tensurerecordfile();
if (fprintf(Toutputfile," %s\n",vb.buf) == EOF) Toutputerr();
if (fflush(Toutputfile)) Toutputerr();
}
#define fcntl Hfcntl
#undef connect
#define connect Hconnect
+#undef bind
+#define bind Hbind
+#undef listen
+#define listen Hlisten
#undef close
#define close Hclose
#undef sendto
int Hsocket( int domain , int type , int protocol );
int Hfcntl( int fd , int cmd , ... );
int Hconnect( int fd , const struct sockaddr *addr , int addrlen );
+int Hbind( int fd , const struct sockaddr *addr , int addrlen );
+int Hlisten( int fd , int backlog );
int Hclose( int fd );
int Hsendto( int fd , const void *msg , int msglen , unsigned int flags , const struct sockaddr *addr , int addrlen );
int Hrecvfrom( int fd , void *buf , int buflen , unsigned int flags , struct sockaddr *addr , int *addrlen );
hm_arg_addr_in(addr,addrlen) hm_na
')
+hm_syscall(
+ bind, `hm_rv_succfail', `
+ hm_arg_fd(fd) hm_na
+ hm_arg_addr_in(addr,addrlen) hm_na
+')
+
+hm_syscall(
+ listen, `hm_rv_succfail', `
+ hm_arg_fd(fd) hm_na
+ hm_arg_int(backlog) hm_na
+')
+
hm_syscall(
close, `hm_rv_succfail', `
hm_arg_fd(fd) hm_na