X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/62fa243d1eecd59cb179f24549790b6d98c9aac1..26e1c3d691b52d21a8bb52d9bf3f8e2b42ae6cfa:/client/adnslogres.c diff --git a/client/adnslogres.c b/client/adnslogres.c index fc6b2cd..296ae1b 100644 --- a/client/adnslogres.c +++ b/client/adnslogres.c @@ -4,16 +4,18 @@ */ /* * This file is - * Copyright (C) 1999 Tony Finch + * Copyright (C) 1999-2000 Tony Finch * Copyright (C) 1999-2000 Ian Jackson * * It is part of adns, which is - * Copyright (C) 1997-2000 Ian Jackson - * Copyright (C) 1999 Tony Finch + * Copyright (C) 1997-2000,2003,2006,2014 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 - * 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, @@ -22,8 +24,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. * * This version was originally supplied by Tony Finch, but has been * modified by Ian Jackson as it was incorporated into adns and @@ -46,6 +47,11 @@ static const char * const cvsid = #include "config.h" #include "adns.h" +#include "client.h" + +#ifdef ADNS_REGRESS_TEST +# include "hredirect.h" +#endif /* maximum number of concurrent DNS queries */ #define MAXMAXPENDING 64000 @@ -58,7 +64,7 @@ static const char * const cvsid = #define OPT_DEBUG 1 #define OPT_POLL 2 -static const char *progname; +static const char *const progname= "adnslogres"; static const char *config_text; #define guard_null(str) ((str) ? (str) : "") @@ -110,10 +116,10 @@ retry: } } sprintf(buf, "%.*s.%.*s.%.*s.%.*s.in-addr.arpa.", - ptrs[4]-ptrs[3]-1, ptrs[3], - ptrs[3]-ptrs[2]-1, ptrs[2], - ptrs[2]-ptrs[1]-1, ptrs[1], - ptrs[1]-ptrs[0]-1, ptrs[0]); + (int)(ptrs[4]-ptrs[3]-1), ptrs[3], + (int)(ptrs[3]-ptrs[2]-1), ptrs[2], + (int)(ptrs[2]-ptrs[1]-1), ptrs[1], + (int)(ptrs[1]-ptrs[0]-1), ptrs[0]); *addr= ptrs[0]; *rest= ptrs[4]-1; return buf; @@ -121,7 +127,7 @@ retry: static void printline(FILE *outf, char *start, char *addr, char *rest, char *domain) { if (domain) - fprintf(outf, "%.*s%s%s", addr - start, start, domain, rest); + fprintf(outf, "%.*s%s%s", (int)(addr - start), start, domain, rest); else fputs(start, outf); if (ferror(outf)) aargh("write output"); @@ -147,7 +153,7 @@ static logline *readline(FILE *inf, adns_state adns, int opts) { strcpy(line->start, buf); str= ipaddr2domain(line->start, &line->addr, &line->rest); if (opts & OPT_DEBUG) - msg("submitting %.*s -> %s", line->rest-line->addr, guard_null(line->addr), str); + msg("submitting %.*s -> %s", (int)(line->rest-line->addr), guard_null(line->addr), str); if (adns_submit(adns, str, adns_r_ptr, adns_qf_quoteok_cname|adns_qf_cname_loose, NULL, &line->query)) @@ -179,8 +185,8 @@ static void proclog(FILE *inf, FILE *outf, int maxpending, int opts) { while (head) { if (opts & OPT_DEBUG) msg("%d in queue; checking %.*s", len, - head->rest-head->addr, guard_null(head->addr)); - if (eof || len > maxpending) { + (int)(head->rest-head->addr), guard_null(head->addr)); + if (eof || len >= maxpending) { if (opts & OPT_POLL) err= adns_wait_poll(adns, &head->query, &answer, NULL); else @@ -189,10 +195,15 @@ static void proclog(FILE *inf, FILE *outf, int maxpending, int opts) { err= adns_check(adns, &head->query, &answer, NULL); } if (err == EAGAIN) break; + if (err) { + fprintf(stderr, "%s: adns_wait/check: %s", progname, strerror(err)); + exit(1); + } printline(outf, head->start, head->addr, head->rest, answer->status == adns_s_ok ? *answer->rrs.str : NULL); line= head; head= head->next; - free(line); free(answer); + free(line); + free(answer); len--; } if (!eof) { @@ -209,9 +220,18 @@ static void proclog(FILE *inf, FILE *outf, int maxpending, int opts) { adns_finish(adns); } +static void printhelp(FILE *file) { + fputs("usage: adnslogres [] []\n" + " adnslogres --version|--help\n" + "options: -c set max number of outstanding queries\n" + " -p use poll(2) instead of select(2)\n" + " -d turn on debugging\n" + " -C use instead of contents of resolv.conf\n", + stdout); +} + static void usage(void) { - fprintf(stderr, "usage: %s [-d] [-p] [-c concurrency] [-C config] [logfile]\n", - progname); + printhelp(stderr); exit(1); } @@ -220,11 +240,17 @@ int main(int argc, char *argv[]) { extern char *optarg; FILE *inf; - progname= strrchr(*argv, '/'); - if (progname) - progname++; - else - progname= *argv; + if (argv[1] && !strncmp(argv[1],"--",2)) { + if (!strcmp(argv[1],"--help")) { + printhelp(stdout); + } else if (!strcmp(argv[1],"--version")) { + fputs(VERSION_MESSAGE("adnslogres"),stdout); + } else { + usage(); + } + if (ferror(stdout) || fclose(stdout)) { perror("stdout"); exit(1); } + exit(0); + } maxpending= DEFMAXPENDING; opts= 0;