#include #include #include #include #include #include #include #include "harness.h" static FILE *Toutputfile; void Tshutdown(void) { } static void R_recordtime(void) { int r; struct timeval tv, tvrel; 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; if (tv.tv_usec < 0) { tvrel.tv_usec += 1000000; tvrel.tv_sec--; } Tvbf("\n +%ld.%06ld",(long)tvrel.tv_sec,(long)tvrel.tv_usec); currenttime= tv; } void Tensurerecordfile(void) { const char *fdstr; int fd, r; if (Toutputfile) return; Toutputfile= stdout; fdstr= getenv("ADNS_TEST_OUT_FD"); if (fdstr) { fd= atoi(fdstr); Toutputfile= fdopen(fd,"a"); if (!Toutputfile) Tfailed("fdopen ADNS_TEST_OUT_FD"); } r= gettimeofday(¤ttime,0); if (r) Tfailed("gettimeofday syscallbegin"); if (fprintf(Toutputfile," start %ld.%06ld\n", (long)currenttime.tv_sec,(long)currenttime.tv_usec) == EOF) Toutputerr(); } void Q_vb(void) { if (!adns__vbuf_append(&vb,"",1)) Tnomem(); Tensurerecordfile(); if (fprintf(Toutputfile," %s\n",vb.buf) == EOF) Toutputerr(); if (fflush(Toutputfile)) Toutputerr(); } static void R_vb(void) { Q_vb(); } int Hselect( int max , fd_set *rfds , fd_set *wfds , fd_set *efds , struct timeval *to ) { int r, e; Qselect( max , rfds , wfds , efds , to ); r= select( max , rfds , wfds , efds , to ); e= errno; vb.used= 0; Tvba("select="); if (r==-1) { Tvberrno(e); goto x_error; } Tvbf("%d",r); Tvba(" rfds="); Tvbfdset(max,rfds); Tvba(" wfds="); Tvbfdset(max,wfds); Tvba(" efds="); Tvbfdset(max,efds); x_error: R_recordtime(); R_vb(); errno= e; return r; } #ifdef HAVE_POLL int Hpoll( struct pollfd *fds , int nfds , int timeout ) { int r, e; Qpoll( fds , nfds , timeout ); r= poll( fds , nfds , timeout ); e= errno; vb.used= 0; Tvba("poll="); if (r==-1) { Tvberrno(e); goto x_error; } Tvbf("%d",r); Tvba(" fds="); Tvbpollfds(fds,nfds); x_error: R_recordtime(); R_vb(); errno= e; return r; } #endif int Hsocket( int domain , int type , int protocol ) { int r, e; Tmust("socket","domain",domain==AF_INET || domain==AF_INET6); Tmust("socket","type",type==SOCK_STREAM || type==SOCK_DGRAM); Qsocket( domain , type ); r= socket( domain , type , protocol ); e= errno; vb.used= 0; Tvba("socket="); if (r==-1) { Tvberrno(e); goto x_error; } Tvbf("%d",r); x_error: R_recordtime(); R_vb(); errno= e; return r; } int Hfcntl( int fd , int cmd , ... ) { int r, e; va_list al; long arg; Tmust("fcntl","cmd",cmd==F_SETFL || cmd==F_GETFL); if (cmd == F_SETFL) { va_start(al,cmd); arg= va_arg(al,long); va_end(al); } else { arg= 0; } Qfcntl( fd , cmd , arg ); r= fcntl( fd , cmd , arg ); e= errno; vb.used= 0; Tvba("fcntl="); if (r==-1) { Tvberrno(e); goto x_error; } if (cmd == F_GETFL) { Tvbf(r & O_NONBLOCK ? "O_NONBLOCK|..." : "~O_NONBLOCK&..."); } else { if (cmd == F_SETFL) { Tmust("fcntl","return",!r); } else { Tmust("cmd","F_GETFL/F_SETFL",0); } Tvba("OK"); } x_error: R_recordtime(); R_vb(); errno= e; return r; } int Hconnect( int fd , const struct sockaddr *addr , int addrlen ) { int r, e; Qconnect( fd , addr , addrlen ); r= connect( fd , addr , addrlen ); e= errno; vb.used= 0; Tvba("connect="); if (r) { Tvberrno(e); goto x_error; } Tvba("OK"); x_error: R_recordtime(); R_vb(); 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 ); r= close( fd ); e= errno; vb.used= 0; Tvba("close="); if (r) { Tvberrno(e); goto x_error; } Tvba("OK"); x_error: R_recordtime(); R_vb(); errno= e; return r; } int Hsendto( int fd , const void *msg , int msglen , unsigned int flags , const struct sockaddr *addr , int addrlen ) { int r, e; Tmust("sendto","flags",flags==0); Qsendto( fd , msg , msglen , addr , addrlen ); r= sendto( fd , msg , msglen , flags , addr , addrlen ); e= errno; vb.used= 0; Tvba("sendto="); if (r==-1) { Tvberrno(e); goto x_error; } Tvbf("%d",r); x_error: R_recordtime(); R_vb(); errno= e; return r; } int Hrecvfrom( int fd , void *buf , int buflen , unsigned int flags , struct sockaddr *addr , int *addrlen ) { int r, e; Tmust("recvfrom","flags",flags==0); Tmust("recvfrom","*addrlen",*addrlen>=sizeof(struct sockaddr_in)); Qrecvfrom( fd , buflen , *addrlen ); r= recvfrom( fd , buf , buflen , flags , addr , addrlen ); e= errno; vb.used= 0; Tvba("recvfrom="); if (r==-1) { Tvberrno(e); goto x_error; } Tmust("recvfrom","return",r<=buflen); Tvba("OK"); Tvba(" addr="); Tvbaddr(addr,*addrlen); Tvbbytes(buf,r); x_error: R_recordtime(); R_vb(); errno= e; return r; } int Hread( int fd , void *buf , size_t buflen ) { int r, e; Qread( fd , buflen ); r= read( fd , buf , buflen ); e= errno; vb.used= 0; Tvba("read="); if (r==-1) { Tvberrno(e); goto x_error; } Tmust("read","return",r<=buflen); Tvba("OK"); Tvbbytes(buf,r); x_error: R_recordtime(); R_vb(); errno= e; return r; } int Hwrite( int fd , const void *buf , size_t len ) { int r, e; Qwrite( fd , buf , len ); r= write( fd , buf , len ); e= errno; vb.used= 0; Tvba("write="); if (r==-1) { Tvberrno(e); goto x_error; } Tvbf("%d",r); x_error: R_recordtime(); R_vb(); errno= e; return r; }