+ * Documentation improved somewhat, including new GPL-vs-LGPL file.
[adns] / regress / hrecord.c
1 #include <assert.h>
2 #include <string.h>
3 #include <errno.h>
4 #include <stdlib.h>
5 #include <sys/types.h>
6 #include <unistd.h>
7 #include <fcntl.h>
8 #include "harness.h"
9 static FILE *Toutputfile;
10 void Tshutdown(void) {
11 }
12 static void R_recordtime(void) {
13 int r;
14 struct timeval tv, tvrel;
15 Tensureoutputfile();
16 r= gettimeofday(&tv,0); if (r) Tfailed("gettimeofday syscallbegin");
17 tvrel.tv_sec= tv.tv_sec - currenttime.tv_sec;
18 tvrel.tv_usec= tv.tv_usec - currenttime.tv_usec;
19 if (tv.tv_usec < 0) { tvrel.tv_usec += 1000000; tvrel.tv_sec--; }
20 Tvbf("\n +%ld.%06ld",(long)tvrel.tv_sec,(long)tvrel.tv_usec);
21 currenttime= tv;
22 }
23 void Tensureoutputfile(void) {
24 const char *fdstr;
25 int fd, r;
26 if (Toutputfile) return;
27 Toutputfile= stdout;
28 fdstr= getenv("ADNS_TEST_OUT_FD");
29 if (fdstr) {
30 fd= atoi(fdstr);
31 Toutputfile= fdopen(fd,"a"); if (!Toutputfile) Tfailed("fdopen ADNS_TEST_OUT_FD");
32 }
33 r= gettimeofday(&currenttime,0); if (r) Tfailed("gettimeofday syscallbegin");
34 if (fprintf(Toutputfile," start %ld.%06ld\n",
35 (long)currenttime.tv_sec,(long)currenttime.tv_usec) == EOF) Toutputerr();
36 }
37 void Q_vb(void) {
38 if (!adns__vbuf_append(&vb,"",1)) Tnomem();
39 Tensureoutputfile();
40 if (fprintf(Toutputfile," %s\n",vb.buf) == EOF) Toutputerr();
41 if (fflush(Toutputfile)) Toutputerr();
42 }
43 static void R_vb(void) {
44 Q_vb();
45 }
46 int Hselect( int max , fd_set *rfds , fd_set *wfds , fd_set *efds , struct timeval *to ) {
47 int r, e;
48 Qselect( max , rfds , wfds , efds , to );
49 r= select( max , rfds , wfds , efds , to );
50 e= errno;
51 vb.used= 0;
52 Tvba("select=");
53 if (r==-1) { Tvberrno(e); goto x_error; }
54 Tvbf("%d",r);
55 Tvba(" rfds="); Tvbfdset(max,rfds);
56 Tvba(" wfds="); Tvbfdset(max,wfds);
57 Tvba(" efds="); Tvbfdset(max,efds);
58 x_error:
59 R_recordtime();
60 R_vb();
61 errno= e;
62 return r;
63 }
64 #ifdef HAVE_POLL
65 int Hpoll( struct pollfd *fds , int nfds , int timeout ) {
66 int r, e;
67 Qpoll( fds , nfds , timeout );
68 r= poll( fds , nfds , timeout );
69 e= errno;
70 vb.used= 0;
71 Tvba("poll=");
72 if (r==-1) { Tvberrno(e); goto x_error; }
73 Tvbf("%d",r);
74 Tvba(" fds="); Tvbpollfds(fds,nfds);
75 x_error:
76 R_recordtime();
77 R_vb();
78 errno= e;
79 return r;
80 }
81 #endif
82 int Hsocket( int domain , int type , int protocol ) {
83 int r, e;
84 Tmust("socket","domain",domain==AF_INET);
85 Tmust("socket","type",type==SOCK_STREAM || type==SOCK_DGRAM);
86 Qsocket( type );
87 r= socket( domain , type , protocol );
88 e= errno;
89 vb.used= 0;
90 Tvba("socket=");
91 if (r==-1) { Tvberrno(e); goto x_error; }
92 Tvbf("%d",r);
93 x_error:
94 R_recordtime();
95 R_vb();
96 errno= e;
97 return r;
98 }
99 int Hfcntl( int fd , int cmd , ... ) {
100 int r, e;
101 va_list al; long arg;
102 Tmust("fcntl","cmd",cmd==F_SETFL || cmd==F_GETFL);
103 if (cmd == F_SETFL) {
104 va_start(al,cmd); arg= va_arg(al,long); va_end(al);
105 } else {
106 arg= 0;
107 }
108 Qfcntl( fd , cmd , arg );
109 r= fcntl( fd , cmd , arg );
110 e= errno;
111 vb.used= 0;
112 Tvba("fcntl=");
113 if (r==-1) { Tvberrno(e); goto x_error; }
114 if (cmd == F_GETFL) {
115 Tvbf(r & O_NONBLOCK ? "O_NONBLOCK|..." : "~O_NONBLOCK&...");
116 } else {
117 if (cmd == F_SETFL) {
118 Tmust("fcntl","return",!r);
119 } else {
120 Tmust("cmd","F_GETFL/F_SETFL",0);
121 }
122 Tvba("OK");
123 }
124 x_error:
125 R_recordtime();
126 R_vb();
127 errno= e;
128 return r;
129 }
130 int Hconnect( int fd , const struct sockaddr *addr , int addrlen ) {
131 int r, e;
132 Qconnect( fd , addr , addrlen );
133 r= connect( fd , addr , addrlen );
134 e= errno;
135 vb.used= 0;
136 Tvba("connect=");
137 if (r) { Tvberrno(e); goto x_error; }
138 Tvba("OK");
139 x_error:
140 R_recordtime();
141 R_vb();
142 errno= e;
143 return r;
144 }
145 int Hclose( int fd ) {
146 int r, e;
147 Qclose( fd );
148 r= close( fd );
149 e= errno;
150 vb.used= 0;
151 Tvba("close=");
152 if (r) { Tvberrno(e); goto x_error; }
153 Tvba("OK");
154 x_error:
155 R_recordtime();
156 R_vb();
157 errno= e;
158 return r;
159 }
160 int Hsendto( int fd , const void *msg , int msglen , unsigned int flags , const struct sockaddr *addr , int addrlen ) {
161 int r, e;
162 Tmust("sendto","flags",flags==0);
163 Qsendto( fd , msg , msglen , addr , addrlen );
164 r= sendto( fd , msg , msglen , flags , addr , addrlen );
165 e= errno;
166 vb.used= 0;
167 Tvba("sendto=");
168 if (r==-1) { Tvberrno(e); goto x_error; }
169 Tvbf("%d",r);
170 x_error:
171 R_recordtime();
172 R_vb();
173 errno= e;
174 return r;
175 }
176 int Hrecvfrom( int fd , void *buf , int buflen , unsigned int flags , struct sockaddr *addr , int *addrlen ) {
177 int r, e;
178 Tmust("recvfrom","flags",flags==0);
179 Tmust("recvfrom","*addrlen",*addrlen>=sizeof(struct sockaddr_in));
180 Qrecvfrom( fd , buflen , *addrlen );
181 r= recvfrom( fd , buf , buflen , flags , addr , addrlen );
182 e= errno;
183 vb.used= 0;
184 Tvba("recvfrom=");
185 if (r==-1) { Tvberrno(e); goto x_error; }
186 Tmust("recvfrom","return",r<=buflen);
187 Tvba("OK");
188 Tvba(" addr="); Tvbaddr(addr,*addrlen);
189 Tvbbytes(buf,r);
190 x_error:
191 R_recordtime();
192 R_vb();
193 errno= e;
194 return r;
195 }
196 int Hread( int fd , void *buf , size_t buflen ) {
197 int r, e;
198 Qread( fd , buflen );
199 r= read( fd , buf , buflen );
200 e= errno;
201 vb.used= 0;
202 Tvba("read=");
203 if (r==-1) { Tvberrno(e); goto x_error; }
204 Tmust("read","return",r<=buflen);
205 Tvba("OK");
206 Tvbbytes(buf,r);
207 x_error:
208 R_recordtime();
209 R_vb();
210 errno= e;
211 return r;
212 }
213 int Hwrite( int fd , const void *buf , size_t len ) {
214 int r, e;
215 Qwrite( fd , buf , len );
216 r= write( fd , buf , len );
217 e= errno;
218 vb.used= 0;
219 Tvba("write=");
220 if (r==-1) { Tvberrno(e); goto x_error; }
221 Tvbf("%d",r);
222 x_error:
223 R_recordtime();
224 R_vb();
225 errno= e;
226 return r;
227 }