ReactOS  0.4.13-dev-52-g0efcfec
adnstest.c File Reference
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "config.h"
#include "adns.h"
Include dependency graph for adnstest.c:

Go to the source code of this file.

Classes

struct  myctx
 

Macros

#define adns_beforepoll(a, b, c, d, e)   0
 
#define adns_afterpoll(a, b, c, d)   0
 

Functions

static void quitnow (int rc) NONRETURNING
 
int poll (struct pollfd *ufds, int nfds, int timeout)
 
static void failure_status (const char *what, adns_status st) NONRETURNING
 
static void failure_errno (const char *what, int errnoval) NONRETURNING
 
static void usageerr (const char *why) NONRETURNING
 
static void dumptype (adns_status ri, const char *rrtn, const char *fmtn)
 
static void fdom_split (const char *fdom, const char **dom_r, int *qf_r, char *ownflags, int ownflags_l)
 
static int consistsof (const char *string, const char *accept)
 
int main (int argc, char *const *argv)
 

Variables

static struct myctxmcs
 
static adns_state ads
 
static adns_rrtypetypes_a
 
static const adns_rrtype defaulttypes []
 

Macro Definition Documentation

◆ adns_afterpoll

#define adns_afterpoll (   a,
  b,
  c,
  d 
)    0

Definition at line 74 of file adnstest.c.

◆ adns_beforepoll

#define adns_beforepoll (   a,
  b,
  c,
  d,
  e 
)    0

Definition at line 73 of file adnstest.c.

Function Documentation

◆ consistsof()

static int consistsof ( const char string,
const char accept 
)
static

Definition at line 155 of file adnstest.c.

155  {
156  return strspn(string,accept) == strlen(string);
157 }
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
_Check_return_ _CRTIMP size_t __cdecl strspn(_In_z_ const char *_Str, _In_z_ const char *_Control)
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
Definition: socklife.c:23

Referenced by main().

◆ dumptype()

static void dumptype ( adns_status  ri,
const char rrtn,
const char fmtn 
)
static

Definition at line 131 of file adnstest.c.

131  {
132  fprintf(stdout, "%s(%s)%s%s",
133  ri ? "?" : rrtn, ri ? "?" : fmtn ? fmtn : "-",
134  ri ? " " : "", ri ? adns_strerror(ri) : "");
135 }
FILE * stdout
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
ADNS_API const char * adns_strerror(adns_status st)
Definition: general.c:268

Referenced by main().

◆ failure_errno()

static void failure_errno ( const char what,
int  errnoval 
)
static

Definition at line 84 of file adnstest.c.

84  {
85  fprintf(stderr,"adns failure: %s: errno=%d\n",what,errnoval);
86  quitnow(2);
87 }
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
static void quitnow(int rc) NONRETURNING
Definition: adnstest.c:58
FILE * stderr

Referenced by main().

◆ failure_status()

static void failure_status ( const char what,
adns_status  st 
)
static

Definition at line 78 of file adnstest.c.

78  {
79  fprintf(stderr,"adns failure: %s: %s\n",what,adns_strerror(st));
80  quitnow(2);
81 }
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
ADNS_API const char * adns_strerror(adns_status st)
Definition: general.c:268
static void quitnow(int rc) NONRETURNING
Definition: adnstest.c:58
FILE * stderr

Referenced by main().

◆ fdom_split()

static void fdom_split ( const char fdom,
const char **  dom_r,
int qf_r,
char ownflags,
int  ownflags_l 
)
static

Definition at line 137 of file adnstest.c.

138  {
139  int qf;
140  char *ep;
141 
142  qf= strtoul(fdom,&ep,0);
143  if (*ep == ',' && strchr(ep,'/')) {
144  ep++;
145  while (*ep != '/') {
146  if (--ownflags_l <= 0) { fputs("too many flags\n",stderr); quitnow(3); }
147  *ownflags++= *ep++;
148  }
149  }
150  if (*ep != '/') { *dom_r= fdom; *qf_r= 0; }
151  else { *dom_r= ep+1; *qf_r= qf; }
152  *ownflags= 0;
153 }
UINT32 strtoul(const char *String, char **Terminator, UINT32 Base)
Definition: utclib.c:696
static void quitnow(int rc) NONRETURNING
Definition: adnstest.c:58
char * strchr(const char *String, int ch)
Definition: utclib.c:501
FILE * stderr
_Check_return_opt_ _CRTIMP int __cdecl fputs(_In_z_ const char *_Str, _Inout_ FILE *_File)

Referenced by main().

◆ main()

int main ( int argc  ,
char *const argv 
)

Definition at line 159 of file adnstest.c.

159  {
160  adns_query qu;
161  struct myctx *mc, *mcw;
162  void *mcr;
163  adns_answer *ans;
164  const char *initstring, *rrtn, *fmtn;
165  const char *const *fdomlist, *domain;
166  char *show, *cp;
167  int len, i, qc, qi, tc, ti, ch, qflags, initflagsnum;
168  adns_status ri;
169  int r;
170  const adns_rrtype *types;
171  struct timeval now;
172  char ownflags[10];
173  char *ep;
174  const char *initflags, *owninitflags;
175 
176  if (argv[0] && argv[1] && argv[1][0] == '-') {
177  initflags= argv[1]+1;
178  argv++;
179  } else {
180  initflags= "";
181  }
182  if (argv[0] && argv[1] && argv[1][0] == '/') {
183  initstring= argv[1]+1;
184  argv++;
185  } else {
186  initstring= 0;
187  }
188 
189  initflagsnum= strtoul(initflags,&ep,0);
190  if (*ep == ',') {
191  owninitflags= ep+1;
192  if (!consistsof(owninitflags,"ps")) usageerr("unknown owninitflag");
193  } else if (!*ep) {
194  owninitflags= "";
195  } else {
196  usageerr("bad <initflagsnum>[,<owninitflags>]");
197  }
198 
199  if (argv[0] && argv[1] && argv[1][0] == ':') {
200  for (cp= argv[1]+1, tc=1; (ch= *cp); cp++)
201  if (ch==',') tc++;
202  types_a= malloc(sizeof(*types_a)*(tc+1));
203  if (!types_a) { perror("malloc types"); quitnow(3); }
204  for (cp= argv[1]+1, ti=0; ti<tc; ti++) {
205  types_a[ti]= strtoul(cp,&cp,10);
206  if ((ch= *cp)) {
207  if (ch != ',') usageerr("unexpected char (not comma) in or between types");
208  cp++;
209  }
210  }
211  types_a[ti]= adns_r_none;
212  types= types_a;
213  argv++;
214  } else {
215  types_a= 0;
217  }
218 
219  if (!(argv[0] && argv[1])) usageerr("no query domains supplied");
220  fdomlist= (const char *const*)argv+1;
221 
222  for (qc=0; fdomlist[qc]; qc++);
223  for (tc=0; types[tc] != adns_r_none; tc++);
224  mcs= malloc(tc ? sizeof(*mcs)*qc*tc : 1);
225  if (!mcs) { perror("malloc mcs"); quitnow(3); }
226 
227  setvbuf(stdout,0,_IOLBF,0);
228 
229  if (initstring) {
232  ^initflagsnum,
233  stdout,initstring);
234  } else {
235  r= adns_init(&ads,
236  (adns_if_debug|adns_if_noautosys)^initflagsnum,
237  0);
238  }
239  if (r) failure_errno("init",r);
240 
241  for (qi=0; qi<qc; qi++) {
242  fdom_split(fdomlist[qi],&domain,&qflags,ownflags,sizeof(ownflags));
243  if (!consistsof(ownflags,"a")) usageerr("unknown ownqueryflag");
244  for (ti=0; ti<tc; ti++) {
245  mc= &mcs[qi*tc+ti];
246  mc->doneyet= 0;
247  mc->fdom= fdomlist[qi];
248 
249  fprintf(stdout,"%s flags %d type %d",domain,qflags,types[ti]);
250  r= adns_submit(ads,domain,types[ti],qflags,mc,&mc->qu);
251  if (r == ENOSYS) {
252  fprintf(stdout," not implemented\n");
253  mc->qu= 0;
254  mc->doneyet= 1;
255  } else if (r) {
256  failure_errno("submit",r);
257  } else {
258  ri= adns_rr_info(types[ti], &rrtn,&fmtn,0, 0,0);
259  putc(' ',stdout);
260  dumptype(ri,rrtn,fmtn);
261  fprintf(stdout," submitted\n");
262  }
263  }
264  }
265 
266  for (;;) {
267  for (qi=0; qi<qc; qi++) {
268  for (ti=0; ti<tc; ti++) {
269  mc= &mcs[qi*tc+ti];
270  mc->found= 0;
271  }
272  }
274  (qu= adns_forallqueries_next(ads,&mcr));
275  ) {
276  mc= mcr;
277  assert(qu == mc->qu);
278  assert(!mc->doneyet);
279  mc->found= 1;
280  }
281  mcw= 0;
282  for (qi=0; qi<qc; qi++) {
283  for (ti=0; ti<tc; ti++) {
284  mc= &mcs[qi*tc+ti];
285  if (mc->doneyet) continue;
286  assert(mc->found);
287  if (!mcw) mcw= mc;
288  }
289  }
290  if (!mcw) break;
291 
292  if (strchr(owninitflags,'s')) {
293  qu= mcw->qu;
294  mc= mcw;
295  } else {
296  qu= 0;
297  mc= 0;
298  }
299 
300 #ifdef HAVE_POLL
301  if (strchr(owninitflags,'p')) {
302  r= adns_wait_poll(ads,&qu,&ans,&mcr);
303  } else
304 #endif
305  {
306  r= adns_wait(ads,&qu,&ans,&mcr);
307  }
308  if (r) failure_errno("wait/check",r);
309 
310  if (mc) assert(mcr==mc);
311  else mc= mcr;
312  assert(qu==mc->qu);
313  assert(!mc->doneyet);
314 
315  fdom_split(mc->fdom,&domain,&qflags,ownflags,sizeof(ownflags));
316 
317  if (gettimeofday(&now,0)) { perror("gettimeofday"); quitnow(3); }
318 
319  ri= adns_rr_info(ans->type, &rrtn,&fmtn,&len, 0,0);
320  fprintf(stdout, "%s flags %d type ",domain,qflags);
321  dumptype(ri,rrtn,fmtn);
322  fprintf(stdout, "%s%s: %s; nrrs=%d; cname=%s; owner=%s; ttl=%ld\n",
323  ownflags[0] ? " ownflags=" : "", ownflags,
324  strchr(ownflags,'a')
325  ? adns_errabbrev(ans->status)
326  : adns_strerror(ans->status),
327  ans->nrrs,
328  ans->cname ? ans->cname : "$",
329  ans->owner ? ans->owner : "$",
330  (long)ans->expires - (long)now.tv_sec);
331  if (ans->nrrs) {
332  assert(!ri);
333  for (i=0; i<ans->nrrs; i++) {
334  ri= adns_rr_info(ans->type, 0,0,0, ans->rrs.bytes + i*len, &show);
335  if (ri) failure_status("info",ri);
336  fprintf(stdout," %s\n",show);
337  free(show);
338  }
339  }
340  free(ans);
341 
342  mc->doneyet= 1;
343  }
344 
345  quitnow(0);
346 }
int doneyet
Definition: adnstest.c:49
static int consistsof(const char *string, const char *accept)
Definition: adnstest.c:155
UINT32 strtoul(const char *String, char **Terminator, UINT32 Base)
Definition: utclib.c:696
static adns_rrtype * types_a
Definition: adnstest.c:55
unsigned char * bytes
Definition: adns.h:319
const char * fdom
Definition: adnstest.c:50
adns_rrtype type
Definition: adns.h:314
Definition: adnstest.c:47
static void usageerr(const char *why) NONRETURNING
Definition: adnstest.c:90
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
adns_rrtype
Definition: adns.h:113
#define free
Definition: debug_ros.c:5
static const adns_rrtype defaulttypes[]
Definition: adnstest.c:109
GLsizei GLenum GLenum * types
Definition: glext.h:7753
#define assert(x)
Definition: debug.h:53
static adns_state ads
Definition: adnstest.c:54
ADNS_API const char * adns_errabbrev(adns_status st)
Definition: general.c:275
static void failure_status(const char *what, adns_status st) NONRETURNING
Definition: adnstest.c:78
#define argv
Definition: mplay32.c:18
ADNS_API adns_status adns_rr_info(adns_rrtype type, const char **rrtname_r, const char **fmtname_r, int *len_r, const void *datap, char **data_r)
Definition: general.c:186
FILE * stdout
static void fdom_split(const char *fdom, const char **dom_r, int *qf_r, char *ownflags, int ownflags_l)
Definition: adnstest.c:137
#define gettimeofday(tv, tz)
Definition: adns_win32.h:159
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
ADNS_API int adns_wait_poll(adns_state ads, adns_query *query_io, adns_answer **answer_r, void **context_r)
_CRTIMP void __cdecl perror(_In_opt_z_ const char *_ErrMsg)
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
adns_status
Definition: adns.h:215
time_t now
Definition: finger.c:65
const GLfloat * tc
Definition: glext.h:8925
ADNS_API int adns_init_strcfg(adns_state *newstate_r, adns_initflags flags, FILE *diagfile, const char *configtext)
Definition: setup.c:629
_Check_return_opt_ _CRTIMP int __cdecl putc(_In_ int _Ch, _Inout_ FILE *_File)
int found
Definition: adnstest.c:49
#define ENOSYS
Definition: errno.h:45
Definition: cmds.c:130
time_t expires
Definition: adns.h:315
adns_status status
Definition: adns.h:311
adns_query qu
Definition: adnstest.c:48
char * cname
Definition: adns.h:312
GLenum GLsizei len
Definition: glext.h:6722
union adns_answer::@3821 rrs
ADNS_API adns_query adns_forallqueries_next(adns_state ads, void **context_r)
Definition: setup.c:680
int nrrs
Definition: adns.h:316
ADNS_API int adns_init(adns_state *newstate_r, adns_initflags flags, FILE *diagfile)
Definition: setup.c:568
ADNS_API int adns_submit(adns_state ads, const char *owner, adns_rrtype type, adns_queryflags flags, void *context, adns_query *query_r)
Definition: query.c:204
ADNS_API const char * adns_strerror(adns_status st)
Definition: general.c:268
static adns_initflags initflags
Definition: adnsresfilter.c:62
static void quitnow(int rc) NONRETURNING
Definition: adnstest.c:58
char * strchr(const char *String, int ch)
Definition: utclib.c:501
POINT cp
Definition: magnifier.c:60
static void failure_errno(const char *what, int errnoval) NONRETURNING
Definition: adnstest.c:84
static struct myctx * mcs
Definition: adnstest.c:53
_Check_return_opt_ _CRTIMP int __cdecl setvbuf(_Inout_ FILE *_File, _Inout_updates_opt_z_(_Size) char *_Buf, _In_ int _Mode, _In_ size_t _Size)
#define malloc
Definition: debug_ros.c:4
ADNS_API void adns_forallqueries_begin(adns_state ads)
Definition: setup.c:671
char * owner
Definition: adns.h:313
ADNS_API int adns_wait(adns_state ads, adns_query *query_io, adns_answer **answer_r, void **context_r)
Definition: event.c:696
static void dumptype(adns_status ri, const char *rrtn, const char *fmtn)
Definition: adnstest.c:131
#define _IOLBF
Definition: stdio.h:129

◆ poll()

int poll ( struct pollfd ufds,
int  nfds,
int  timeout 
)

Definition at line 68 of file adnstest.c.

68  {
69  fputs("poll(2) not supported on this system\n",stderr);
70  quitnow(5);
71  return -1; /* compiler food */
72 }
static void quitnow(int rc) NONRETURNING
Definition: adnstest.c:58
FILE * stderr
_Check_return_opt_ _CRTIMP int __cdecl fputs(_In_z_ const char *_Str, _Inout_ FILE *_File)

Referenced by ActiveScript_SetScriptSite(), IcmpSendEcho(), netconn_create(), read_vc(), rpc_broadcast_exp(), wined3d_cs_exec_query_issue(), wined3d_cs_run(), wined3d_occlusion_query_ops_issue(), wined3d_pipeline_query_ops_issue(), and wined3d_so_statistics_query_ops_issue().

◆ quitnow()

static void quitnow ( int  rc)
static

Definition at line 58 of file adnstest.c.

58  {
59  free(mcs);
60  free(types_a);
61  if (ads) adns_finish(ads);
62 
63  exit(rc);
64 }
static adns_rrtype * types_a
Definition: adnstest.c:55
ADNS_API void adns_finish(adns_state ads)
Definition: setup.c:650
#define free
Definition: debug_ros.c:5
static adns_state ads
Definition: adnstest.c:54
static struct myctx * mcs
Definition: adnstest.c:53
void exit(int exitcode)
Definition: _exit.c:33

Referenced by failure_errno(), failure_status(), fdom_split(), main(), poll(), and usageerr().

◆ usageerr()

static void usageerr ( const char why)
static

Definition at line 90 of file adnstest.c.

90  {
92  "bad usage: %s\n"
93  "usage: adnstest [-<initflagsnum>[,<owninitflags>]] [/<initstring>]\n"
94  " [ :<typenum>,... ]\n"
95  " [ [<queryflagsnum>[,<ownqueryflags>]/]<domain> ... ]\n"
96  "initflags: p use poll(2) instead of select(2)\n"
97  " s use adns_wait with specified query, instead of 0\n"
98  "queryflags: a print status abbrevs instead of strings\n"
99  "exit status: 0 ok (though some queries may have failed)\n"
100  " 1 used by test harness to indicate test failed\n"
101  " 2 unable to submit or init or some such\n"
102  " 3 unexpected failure\n"
103  " 4 usage error\n"
104  " 5 operation not supported on this system\n",
105  why);
106  quitnow(4);
107 }
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
static void quitnow(int rc) NONRETURNING
Definition: adnstest.c:58
FILE * stderr

Referenced by main().

Variable Documentation

◆ ads

adns_state ads
static

Definition at line 54 of file adnstest.c.

Referenced by main(), and quitnow().

◆ defaulttypes

◆ mcs

◆ types_a

adns_rrtype* types_a
static

Definition at line 55 of file adnstest.c.

Referenced by main(), and quitnow().