X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=client%2Fadnsresfilter.c;h=f3244b901e329ce075a088622076b8c30c170f58;hb=HEAD;hp=3a3cacf96d6997aca88385d844cfe8869417027e;hpb=bef232aebeabbef525faa7d7f5b08cf7a1427f95;p=adns.git diff --git a/client/adnsresfilter.c b/client/adnsresfilter.c index 3a3cacf..038b3ad 100644 --- a/client/adnsresfilter.c +++ b/client/adnsresfilter.c @@ -3,16 +3,12 @@ * - filter which does resolving, not part of the library */ /* - * This file is - * Copyright (C) 1999-2000 Ian Jackson - * - * It is part of adns, which is - * Copyright (C) 1997-2000 Ian Jackson - * Copyright (C) 1999-2000 Tony Finch + * This file is part of adns, which is Copyright Ian Jackson + * and contributors (see the file INSTALL for full details). * * 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 - * the Free Software Foundation; either version 2, or (at your option) + * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, @@ -21,8 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * along with this program; if not, write to the Free Software Foundation. */ #include @@ -41,6 +36,7 @@ #include "adns.h" #include "dlist.h" #include "tvarith.h" +#include "client.h" #ifdef ADNS_REGRESS_TEST # include "hredirect.h" @@ -48,8 +44,7 @@ struct outqueuenode { struct outqueuenode *next, *back; - void *buffer; - char *textp; + char *buffer, *textp; int textlen; struct timeval printbefore; struct treething *addr; @@ -68,7 +63,7 @@ static int peroutqueuenode, outqueuelen; static struct sockaddr_in sa; static adns_state ads; -static char addrtextbuf[14]; +static char addrtextbuf[18]; /* [ddd.ddd.ddd.ddd] + nul */ static int cbyte, inbyte, inbuf; static unsigned char bytes[4]; static struct timeval printbefore; @@ -92,8 +87,7 @@ static int nonblock(int fd, int isnonblock) { return 0; } -static void quit(int exitstatus) NONRETURNING; -static void quit(int exitstatus) { +void quitnow(int exitstatus) { nonblock(0,0); nonblock(1,0); exit(exitstatus); @@ -102,7 +96,7 @@ static void quit(int exitstatus) { static void sysfail(const char *what) NONRETURNING; static void sysfail(const char *what) { fprintf(stderr,"adnsresfilter: system call failed: %s: %s\n",what,strerror(errno)); - quit(2); + quitnow(2); } static void *xmalloc(size_t sz) { @@ -116,7 +110,7 @@ static void outputerr(void) { sysfail("write to stdout"); } static void usage(void) { if (printf("usage: adnsresfilter []\n" - " adnsresfilter -h|--help\n" + " adnsresfilter -h|--help | --version\n" "options: -t|--timeout \n" " -w|--wait (always wait for queries to time out or fail)\n" " -b|--brackets (require [...] around IP addresses)\n" @@ -134,13 +128,13 @@ static void usageerr(const char *why) NONRETURNING; static void usageerr(const char *why) { fprintf(stderr,"adnsresfilter: bad usage: %s\n",why); usage(); - quit(1); + quitnow(1); } static void adnsfail(const char *what, int e) NONRETURNING; static void adnsfail(const char *what, int e) { fprintf(stderr,"adnsresfilter: adns call failed: %s: %s\n",what,strerror(e)); - quit(2); + quitnow(2); } static void settimeout(const char *arg) { @@ -173,8 +167,14 @@ static void parseargs(const char *const *argv) { config_text= arg; } else if (!strcmp(arg,"--debug")) { initflags |= adns_if_debug; + } else if (!strcmp(arg,"--checkc-freq")) { + initflags |= adns_if_checkc_freq; + } else if (!strcmp(arg,"--checkc-entex")) { + initflags |= adns_if_checkc_entex; } else if (!strcmp(arg,"--help")) { - usage(); quit(0); + usage(); quitnow(0); + } else if (!strcmp(arg,"--version")) { + VERSION_PRINT_QUIT("adnsresfilter"); quitnow(0); } else { usageerr("unknown long option"); } @@ -202,7 +202,7 @@ static void parseargs(const char *const *argv) { break; case 'h': usage(); - quit(0); + quitnow(0); default: usageerr("unknown short option"); } @@ -215,7 +215,8 @@ static void queueoutchar(int c) { struct outqueuenode *entry; entry= outqueue.tail; - if (!entry || entry->addr || entry->textlen >= peroutqueuenode) { + if (!entry || entry->addr || + entry->textlen >= peroutqueuenode - (entry->textp - entry->buffer)) { peroutqueuenode= !peroutqueuenode || !entry || entry->addr ? 128 : peroutqueuenode >= 1024 ? 4096 : peroutqueuenode<<2; entry= xmalloc(sizeof(*entry));