From bb149f75ad8494e2f955297024c888f04513dea5 Mon Sep 17 00:00:00 2001 From: ian Date: Fri, 15 Oct 1999 16:43:23 +0000 Subject: [PATCH] + * Include stdlib.h in adnshost.h. @@ -4,6 +4,12 @@ * Do not fail assertion if _qf_owner, _qf_search, domain ends in `.'. * Dynamic library building works properly. * adnshost prints somewhat better messages about some wrong usages. + * Include stdlib.h in adnshost.h. + * IP address parsing fixed in adnslogres (thanks Tony Finch). + * adnslogres has improved error checking (thanks Tony Finch). + + General improvements + * New fanftest test program from Tony Finch. -- --- changelog | 6 +++ client/Makefile.in | 2 +- client/adnshost.h | 1 + client/adnslogres.c | 103 ++++++++++++++++++++++++++++---------------- client/fanftest.c | 55 +++++++++++++++++++++++ 5 files changed, 129 insertions(+), 38 deletions(-) create mode 100644 client/fanftest.c diff --git a/changelog b/changelog index a3c0da5..351a027 100644 --- a/changelog +++ b/changelog @@ -4,6 +4,12 @@ adns (0.6) unstable; urgency=medium * Do not fail assertion if _qf_owner, _qf_search, domain ends in `.'. * Dynamic library building works properly. * adnshost prints somewhat better messages about some wrong usages. + * Include stdlib.h in adnshost.h. + * IP address parsing fixed in adnslogres (thanks Tony Finch). + * adnslogres has improved error checking (thanks Tony Finch). + + General improvements + * New fanftest test program from Tony Finch. -- diff --git a/client/Makefile.in b/client/Makefile.in index 9963c1a..9908562 100644 --- a/client/Makefile.in +++ b/client/Makefile.in @@ -24,7 +24,7 @@ srcdir= @srcdir@ VPATH= @srcdir@ -PROGRAMS= adnstest adnslogres adnshost +PROGRAMS= adnstest adnslogres adnshost fanftest TARG_INSTALL= $(PROGRAMS) TARG_LOCAL= $(addsuffix _s, $(PROGRAMS)) TARGETS= $(TARG_LOCAL) $(TARG_INSTALL) diff --git a/client/adnshost.h b/client/adnshost.h index ee3a5ca..7fe0020 100644 --- a/client/adnshost.h +++ b/client/adnshost.h @@ -28,6 +28,7 @@ #ifndef ADNSHOST_H_INCLUDED #define ADNSHOST_H_INCLUDED +#include #include #include #include diff --git a/client/adnslogres.c b/client/adnslogres.c index b567bf9..a91af87 100644 --- a/client/adnslogres.c +++ b/client/adnslogres.c @@ -78,13 +78,15 @@ retry: *addr= *rest= NULL; return buf; } - for (i= 1; i < 5; i ++) { - ptrs[i]= strchr(ptrs[i-1], (i == 4) ? ' ' : '.'); - if (!ptrs[i] || ptrs[i]-ptrs[i-1] > 3) { - ptrs[0]++; + for (i= 1; i < 5; i++) { + ptrs[i]= ptrs[i-1]; + while (isdigit(*ptrs[i]++)); + if ((i == 4 && !isspace(ptrs[i][-1])) || + (i != 4 && ptrs[i][-1] != '.') || + (ptrs[i]-ptrs[i-1] > 4)) { + ptrs[0]= ptrs[i]-1; goto retry; - } else - ptrs[i]++; + } } sprintf(buf, "%.*s.%.*s.%.*s.%.*s.in-addr.arpa.", ptrs[4]-ptrs[3]-1, ptrs[3], @@ -96,12 +98,12 @@ retry: return buf; } -static void printline(char *start, char *addr, char *rest, char *domain) { +static void printline(FILE *outf, char *start, char *addr, char *rest, char *domain) { if (domain) - printf("%.*s%s%s", addr - start, start, domain, rest); + fprintf(outf, "%.*s%s%s", addr - start, start, domain, rest); else - fputs(start, stdout); - if (ferror(stdout)) aargh("write output"); + fputs(start, outf); + if (ferror(outf)) aargh("write output"); } typedef struct logline { @@ -110,33 +112,33 @@ typedef struct logline { adns_query query; } logline; -static logline *readline(adns_state adns, int opts) { +static logline *readline(FILE *inf, adns_state adns, int opts) { static char buf[MAXLINE]; char *str; logline *line; - if (fgets(buf, MAXLINE, stdin)) { + if (fgets(buf, MAXLINE, inf)) { str= malloc(sizeof(*line) + strlen(buf) + 1); if (!str) aargh("malloc"); line= (logline*)str; line->next= NULL; line->start= str+sizeof(logline); strcpy(line->start, buf); - str = ipaddr2domain(line->start, &line->addr, &line->rest); + str= ipaddr2domain(line->start, &line->addr, &line->rest); if (opts & OPT_DEBUG) - fprintf(stderr, "%s: adns_submit %s\n", progname, str); + msg("submitting %.*s -> %s", line->rest-line->addr, line->addr, str); if (adns_submit(adns, str, adns_r_ptr, adns_qf_quoteok_cname|adns_qf_cname_loose, NULL, &line->query)) aargh("adns_submit"); return line; } - if (!feof(stdin)) + if (!feof(inf)) aargh("fgets"); return NULL; } -static void proclog(int opts) { +static void proclog(FILE *inf, FILE *outf, int opts) { int eof, err, len; adns_state adns; adns_answer *answer; @@ -144,9 +146,12 @@ static void proclog(int opts) { errno= adns_init(&adns, (opts & OPT_DEBUG) ? adns_if_debug : 0, 0); if (errno) aargh("adns_init"); - head= tail= readline(adns, opts); + head= tail= readline(inf, adns, opts); len= 1; eof= 0; while (head) { + if (opts & OPT_DEBUG) + msg("%d in queue; checking %.*s", len, + head->rest-head->addr, head->addr); if (eof || len > MAXPENDING) if (opts & OPT_POLL) err= adns_wait_poll(adns, &head->query, &answer, NULL); @@ -155,22 +160,22 @@ static void proclog(int opts) { else err= adns_check(adns, &head->query, &answer, NULL); if (err != EAGAIN) { - printline(head->start, head->addr, head->rest, - answer->status == adns_s_ok ? *answer->rrs.str : NULL); - line= head; head= head->next; - free(line); free(answer); - len--; + 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); + len--; } if (!eof) { - line= readline(adns, opts); + line= readline(inf, adns, opts); if (!line) eof= 1; else { if (!head) - head = line; + head= line; else - tail->next = line; - tail = line; + tail->next= line; + tail= line; len++; } } @@ -178,30 +183,54 @@ static void proclog(int opts) { adns_finish(adns); } +static void usage(void) { + fprintf(stderr, "usage: %s [-d] [-p] [logfile]\n", progname); + exit(1); +} + int main(int argc, char *argv[]) { int c, opts; + FILE *inf; - progname= *argv; + progname= strrchr(*argv, '/'); + if (progname) + progname++; + else + progname= *argv; opts= 0; - while ((c= getopt(argc, argv, "dp")) != -1) { + while ((c= getopt(argc, argv, "dp")) != -1) switch (c) { case 'd': - opts |= OPT_DEBUG; + opts|= OPT_DEBUG; break; case 'p': - opts |= OPT_POLL; + opts|= OPT_POLL; break; default: - fprintf(stderr, "usage: %s [-d] < logfile\n", progname); - exit(1); + usage(); } - argc-= optind; - argv+= optind; - } - proclog(opts); + argc-= optind; + argv+= optind; + + inf= NULL; + if (argc == 0) + inf= stdin; + else if (argc == 1) + inf= fopen(*argv, "r"); + else + usage(); + + if (!inf) + aargh("couldn't open input"); + + proclog(inf, stdout, opts); + + if (fclose(inf)) + aargh("fclose input"); + if (fclose(stdout)) + aargh("fclose output"); - if (fclose(stdout)) aargh("finish writing output"); return 0; } diff --git a/client/fanftest.c b/client/fanftest.c new file mode 100644 index 0000000..4ca0cf0 --- /dev/null +++ b/client/fanftest.c @@ -0,0 +1,55 @@ + +#include +#include + +#include +#include +#include +#include + +#include "adns.h" + +static const char *progname; + +#define msg(fmt, args...) fprintf(stderr, "%s: " fmt "\n", progname, ##args) + +static void aargh(const char *cause) { + const char *why = strerror(errno); + if (!why) why = "Unknown error"; + msg("%s: %s (%d)", cause, why, errno); + exit(1); +} + +int main(int argc, char *argv[]) { + adns_state adns; + adns_query query; + adns_answer *answer; + + progname= strrchr(*argv, '/'); + if (progname) + progname++; + else + progname= *argv; + + if (argc != 2) { + fprintf(stderr, "usage: %s \n", progname); + exit(1); + } + + errno= adns_init(&adns, adns_if_debug, 0); + if (errno) aargh("adns_init"); + + errno= adns_submit(adns, argv[1], adns_r_ptr, + adns_qf_quoteok_cname|adns_qf_cname_loose, + NULL, &query); + if (errno) aargh("adns_submit"); + + errno= adns_wait(adns, &query, &answer, NULL); + if (errno) aargh("adns_init"); + + printf("%s\n", answer->status == adns_s_ok ? *answer->rrs.str : "dunno"); + + adns_finish(adns); + + return 0; +} -- 2.30.2