X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=client%2Fadnsresfilter.c;h=c534f7d70f578ea5906a4c39b348541750b41e7f;hb=bf41c1c2f7c3d6ff50211cf8b7b75bf245bab110;hp=02d0f4c2e4a35d0062dec2e6ae7c45c15caba017;hpb=98e3fa813e15297eaa1c9858aa962d08d52c92cd;p=adns.git diff --git a/client/adnsresfilter.c b/client/adnsresfilter.c index 02d0f4c..c534f7d 100644 --- a/client/adnsresfilter.c +++ b/client/adnsresfilter.c @@ -3,12 +3,11 @@ * - 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 Tony Finch + * This file is part of adns, which is + * Copyright (C) 1997-2000,2003,2006 Ian Jackson + * Copyright (C) 1999-2000,2003,2006 Tony Finch + * Copyright (C) 1991 Massachusetts Institute of Technology + * (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 @@ -41,6 +40,7 @@ #include "adns.h" #include "dlist.h" #include "tvarith.h" +#include "client.h" #ifdef ADNS_REGRESS_TEST # include "hredirect.h" @@ -92,8 +92,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 +101,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 +115,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" @@ -127,19 +126,20 @@ static void usage(void) { "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; 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,7 +173,9 @@ static void parseargs(const char *const *argv) { } else if (!strcmp(arg,"--debug")) { initflags |= adns_if_debug; } 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"); } @@ -201,7 +203,7 @@ static void parseargs(const char *const *argv) { break; case 'h': usage(); - quit(0); + quitnow(0); default: usageerr("unknown short option"); } @@ -467,7 +469,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); }