X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/41559f53541ae03b5647c41c42883dc4b78634d9..bef232aebeabbef525faa7d7f5b08cf7a1427f95:/client/adnsresfilter.c diff --git a/client/adnsresfilter.c b/client/adnsresfilter.c index 136929d..3a3cacf 100644 --- a/client/adnsresfilter.c +++ b/client/adnsresfilter.c @@ -4,11 +4,11 @@ */ /* * This file is - * Copyright (C) 1999 Ian Jackson + * Copyright (C) 1999-2000 Ian Jackson * * It is part of adns, which is - * Copyright (C) 1997-1999 Ian Jackson - * Copyright (C) 1999 Tony Finch + * Copyright (C) 1997-2000 Ian Jackson + * Copyright (C) 1999-2000 Tony Finch * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,13 +33,19 @@ #include #include -#include +#include +#include +#include -#include "adns.h" #include "config.h" +#include "adns.h" #include "dlist.h" #include "tvarith.h" +#ifdef ADNS_REGRESS_TEST +# include "hredirect.h" +#endif + struct outqueuenode { struct outqueuenode *next, *back; void *buffer; @@ -49,9 +55,11 @@ struct outqueuenode { struct treething *addr; }; -static int bracket, forever; -static unsigned long timeout=100; +static int bracket, forever, address; +static unsigned long timeout= 1000; static adns_rrtype rrt= adns_r_ptr; +static adns_initflags initflags= 0; +static const char *config_text; static int outblocked, inputeof; static struct { struct outqueuenode *head, *tail; } outqueue; @@ -109,11 +117,17 @@ static void outputerr(void) { sysfail("write to stdout"); } static void usage(void) { if (printf("usage: adnsresfilter []\n" " adnsresfilter -h|--help\n" - "options: -b|--brackets\n" - " -w|--wait\n" - " -t|--timeout \n" - " -u|--unchecked\n") + "options: -t|--timeout \n" + " -w|--wait (always wait for queries to time out or fail)\n" + " -b|--brackets (require [...] around IP addresses)\n" + " -a|--address (always include [address] in output)\n" + " -u|--unchecked (do not forward map for checking)\n" + " --config (use this instead of resolv.conf)\n" + " --debug (turn on adns resolver debugging)\n" + "Timeout is the maximum amount to delay any particular bit of output for.\n" + "Lookups will go on in the background. Default timeout = 1000 (ms).\n") == EOF) outputerr(); + if (fflush(stdout)) sysfail("flush stdout"); } static void usageerr(const char *why) NONRETURNING; @@ -142,43 +156,53 @@ static void parseargs(const char *const *argv) { while ((arg= *++argv)) { if (arg[0] != '-') usageerr("no non-option arguments are allowed"); if (arg[1] == '-') { - if (!strcmp(arg,"--brackets")) { + if (!strcmp(arg,"--timeout")) { + if (!(arg= *++argv)) usageerr("--timeout needs a value"); + settimeout(arg); + forever= 0; + } else if (!strcmp(arg,"--wait")) { + forever= 1; + } else if (!strcmp(arg,"--brackets")) { bracket= 1; + } else if (!strcmp(arg,"--address")) { + address= 1; } else if (!strcmp(arg,"--unchecked")) { rrt= adns_r_ptr_raw; - } else if (!strcmp(arg,"--wait")) { - forever= 1; + } else if (!strcmp(arg,"--config")) { + if (!(arg= *++argv)) usageerr("--config needs a value"); + config_text= arg; + } else if (!strcmp(arg,"--debug")) { + initflags |= adns_if_debug; } else if (!strcmp(arg,"--help")) { usage(); quit(0); - } else if (!strcmp(arg,"--timeout")) { - if (!(arg= *++argv)) usageerr("--timeout needs a value"); - settimeout(arg); - forever= 0; } else { usageerr("unknown long option"); } } else { while ((c= *++arg)) { switch (c) { + case 't': + if (*++arg) settimeout(arg); + else if ((arg= *++argv)) settimeout(arg); + else usageerr("-t needs a value"); + forever= 0; + arg= "\0"; + break; + case 'w': + forever= 1; + break; case 'b': bracket= 1; break; + case 'a': + address= 1; + break; case 'u': rrt= adns_r_ptr_raw; break; - case 'w': - forever= 1; - break; case 'h': usage(); quit(0); - case 't': - if (*++arg) settimeout(arg); - else if ((arg= *++argv)) settimeout(arg); - else usageerr("-t needs a value"); - forever= 0; - arg= "\0"; - break; default: usageerr("unknown short option"); } @@ -232,10 +256,24 @@ static void writestdout(struct outqueuenode *entry) { } static void replacetextwithname(struct outqueuenode *entry) { - free(entry->buffer); - entry->buffer= 0; - entry->textp= entry->addr->ans->rrs.str[0]; - entry->textlen= strlen(entry->textp); + char *name, *newbuf; + int namelen, newlen; + + name= entry->addr->ans->rrs.str[0]; + namelen= strlen(name); + if (!address) { + free(entry->buffer); + entry->buffer= 0; + entry->textp= name; + entry->textlen= namelen; + } else { + newlen= entry->textlen + namelen + (bracket ? 0 : 2); + newbuf= xmalloc(newlen + 1); + sprintf(newbuf, bracket ? "%s%.*s" : "%s[%.*s]", name, entry->textlen, entry->textp); + free(entry->buffer); + entry->buffer= entry->textp= newbuf; + entry->textlen= newlen; + } } static void checkadnsqueries(void) { @@ -347,7 +385,6 @@ static void readstdin(void) { if (!bracket && !isalnum(c)) startaddr(); } } - if (cbyte==3 && inbyte>0 && !bracket) procaddr(); } static void startup(void) { @@ -357,7 +394,12 @@ static void startup(void) { if (nonblock(1,1)) sysfail("set stdout to nonblocking mode"); memset(&sa,0,sizeof(sa)); sa.sin_family= AF_INET; - r= adns_init(&ads,0,0); if (r) adnsfail("init",r); + if (config_text) { + r= adns_init_strcfg(&ads,initflags,stderr,config_text); + } else { + r= adns_init(&ads,initflags,0); + } + if (r) adnsfail("init",r); cbyte= -1; inbyte= -1; inbuf= 0; @@ -426,7 +468,6 @@ int main(int argc, const char *const *argv) { } if (nonblock(0,0)) sysfail("un-nonblock stdin"); if (nonblock(1,0)) sysfail("un-nonblock stdout"); - if (ferror(stdin) || fclose(stdin)) sysfail("read stdin"); - if (fclose(stdout)) sysfail("close stdout"); + adns_finish(ads); exit(0); }