X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/a4f094dd69deb1053384e4015f1711c1200ffa0d..7d25191454d7801a17ff77bdd10f1912323fa73e:/src/hcommon.c?ds=sidebyside diff --git a/src/hcommon.c b/src/hcommon.c index b62d275..e7e2c55 100644 --- a/src/hcommon.c +++ b/src/hcommon.c @@ -20,58 +20,197 @@ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include +#include +#include + +#include +#include +#include + #include "harness.h" #include "internal.h" -static vbuf vb; +vbuf vb; +FILE *Toutputfile= 0; + +const struct Terrno Terrnos[]= { + { "EAGAIN", EAGAIN }, + { "EINPROGRESS", EINPROGRESS }, + { "EINTR", EINTR }, + { "EINVAL", EINVAL }, + { "EMSGSIZE", EMSGSIZE }, + { "ENOBUFS", ENOBUFS }, + { "ENOENT", ENOENT }, + { "ENOPROTOOPT", ENOPROTOOPT }, + { "ENOSPC", ENOSPC }, + { "EWOULDBLOCK", EWOULDBLOCK }, + { 0, 0 } +}; void Qgettimeofday(void) { - Tsyscall("gettimeofday()"); + Q_str("gettimeofday()"); } -void Qselect(int n, fd_set rfds, fd_set wfds, fd_set efds, const struct timeval *t) { - char buf[100]; - - sprintf(buf,"select(%d, [",n); +void Qselect(int n, const fd_set *rfds, const fd_set *wfds, const fd_set *efds, + const struct timeval *to) { vb.used= 0; - Tvba(&vb,buf); - Tvbfdset(&vb,n,rfds); - Tvba(&vb,"], ["); - Tvbfdset(&vb,n,wfds); - Tvba(&vb,"], ["); - Tvbfdset(&vb,n,efds); - if (t) { - sprintf(buf,"], %ld.%06ld)",t->tv_sec,t->tv_usec); - Tvba(&vb,buf); + Tvbf("select(%d,",n); + Tvbfdset(n,rfds); + Tvba(","); + Tvbfdset(n,wfds); + Tvba(","); + Tvbfdset(n,efds); + if (to) { + Tvbf(", %ld.%06ld)",to->tv_sec,to->tv_usec); } else { - Tvba(&vb,"], NULL)"); + Tvba(", NULL)"); } - Tvbfin(); - Tsyscall(vb.buf); + Q_vb(); } void Qsocket(int type) { switch (type) { - case SOCK_STREAM: Tsyscall("socket(,SOCK_STREAM,)"); break; - case SOCK_DGRAM: Tsyscall("socket(,SOCK_DGRAM,)"); break; + case SOCK_STREAM: Q_str("socket(,SOCK_STREAM,)"); break; + case SOCK_DGRAM: Q_str("socket(,SOCK_DGRAM,)"); break; default: abort(); } } -void Qfcntl(int fd, int cmd, long arg) { - static char buf[100]; +void Qfcntl_setfl(int fd, int cmd, long arg) { + vb.used= 0; + Tvbf("fcntl(%d, F_SETFL, %ld)",fd,arg); + Q_vb(); +} + +void Qfcntl_other(int fd, int cmd) { + assert(cmd==F_GETFL); + vb.used= 0; + Tvbf("fcntl(%d, F_GETFL)",fd); + Q_vb(); +} + +void Qconnect(int fd, struct sockaddr *addr, int addrlen) { + vb.used= 0; + Tvbf("connect(%d, ",fd); + Tvbaddr(addr,addrlen); + Tvba(")"); + Q_vb(); +} + +void Qclose(int fd) { + vb.used= 0; + Tvbf("close(%d)",fd); + Q_vb(); +} + +void Qsendto(int fd, const void *msg, int msglen, + const struct sockaddr *addr, int addrlen) { + vb.used= 0; + Tvbf("sendto(%d,,,, ",fd); + Tvbaddr(addr,addrlen); + Tvba(")"); + Tvbbytes(msg,msglen); + Q_vb(); +} + +void Qrecvfrom(int fd, int buflen, int addrlen) { + vb.used= 0; + Tvbf("recvfrom(%d,,%d,,,%d)",fd,buflen,addrlen); + Q_vb(); +} + +void Qread(int fd, size_t len) { + vb.used= 0; + Tvbf("read(%d,,%lu)",fd,(unsigned long)len); + Q_vb(); +} + +void Qwrite(int fd, const void *buf, size_t len) { + vb.used= 0; + Tvbf("write(%d,,)",fd); + Tvbbytes(buf,len); + Q_vb(); +} + + +void Tvbaddr(const struct sockaddr *addr, int len) { + const struct sockaddr_in *ai= (const struct sockaddr_in*)addr; + + assert(len==sizeof(struct sockaddr_in)); + assert(ai->sin_family==AF_INET); + Tvbf(" %s:%u",inet_ntoa(ai->sin_addr),htons(ai->sin_port)); +} + +void Tvbbytes(const void *buf, int len) { + const byte *bp; + int i; + + if (!len) { Tvba(" empty"); return; } + for (i=0, bp=buf; in && te->v != e; te++); + if (te->n) Tvba(te->n); + else Tvbf("E#%d",e); } -void Qconnect(int fd, struct sockaddr *addr, int addrlen); -void Qclose(int fd); +void Tvba(const char *str) { + if (!adns__vbuf_appendstr(&vb,str)) Tnomem(); +} -void Qsendto(int fd, const void *msg, int msglen, unsigned int flags, - const struct sockaddr *addr, int addrlen); -void Qrecvfrom(int fd, int buflen, unsigned int flags, int *addrlen); +void Tvbvf(const char *fmt, va_list al) { + char buf[1000]; + buf[sizeof(buf)-2]= '\t'; + vsnprintf(buf,sizeof(buf),fmt,al); + assert(buf[sizeof(buf)-2] == '\t'); -void Qread(int fd, size_t len); -void Qwrite(int fd, const void *buf, size_t len); + Tvba(buf); +} + +void Tvbf(const char *fmt, ...) { + va_list al; + va_start(al,fmt); + Tvbvf(fmt,al); + va_end(al); +} + + +void Tfailed(const char *why) { + fprintf(stderr,"adns test harness: failure: %s: %s\n",why,strerror(errno)); + exit(-1); +} + +void Tnomem(void) { + Tfailed("unable to malloc/realloc"); +} + +void Toutputerr(void) { + Tfailed("write error on test harness output"); +} + +void Tensureoutputfile(void) { + /* fixme: allow sending it elsewhere */ + Toutputfile= stdout; +}