X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=blobdiff_plain;f=client%2Fadnslogres.c;h=b8e5f52a000b2553d50d1e2b8bcf369dc838ee10;hp=a91af8702a82616b59674a0b5521846d00813290;hb=5a0be2445e09e1d0fc6ae995b6c0296bc28e657d;hpb=bb149f75ad8494e2f955297024c888f04513dea5 diff --git a/client/adnslogres.c b/client/adnslogres.c index a91af87..b8e5f52 100644 --- a/client/adnslogres.c +++ b/client/adnslogres.c @@ -5,10 +5,10 @@ /* * This file is * Copyright (C) 1999 Tony Finch - * 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) 1997-2000 Ian Jackson * Copyright (C) 1999 Tony Finch * * This program is free software; you can redistribute it and/or modify @@ -25,8 +25,9 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * This version was originally supplied by Tony Finch, but has been - * modified by Ian Jackson as it was incorporated into adns. + * This version was originally supplied by Tony Finch, but has been + * modified by Ian Jackson as it was incorporated into adns and + * subsequently. */ static const char * const cvsid = @@ -41,7 +42,9 @@ static const char * const cvsid = #include #include #include +#include +#include "config.h" #include "adns.h" /* maximum number of concurrent DNS queries */ @@ -56,9 +59,25 @@ static const char * const cvsid = static const char *progname; -static void aargh(const char *msg) { - fprintf(stderr, "%s: %s: %s (%d)\n", progname, msg, - strerror(errno) ? strerror(errno) : "Unknown error", errno); +#define guard_null(str) ((str) ? (str) : "") + +#define sensible_ctype(type,ch) (type((unsigned char)(ch))) + /* isfoo() functions from ctype.h can't safely be fed char - blech ! */ + +static void msg(const char *fmt, ...) { + va_list al; + + fprintf(stderr, "%s: ", progname); + va_start(al,fmt); + vfprintf(stderr, fmt, al); + va_end(al); + fputc('\n',stderr); +} + +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); } @@ -72,7 +91,7 @@ static char *ipaddr2domain(char *start, char **addr, char **rest) { ptrs[0]= start; retry: - while (!isdigit(*ptrs[0])) + while (!sensible_ctype(isdigit,*ptrs[0])) if (!*ptrs[0]++) { strcpy(buf, "invalid."); *addr= *rest= NULL; @@ -80,8 +99,8 @@ retry: } for (i= 1; i < 5; i++) { ptrs[i]= ptrs[i-1]; - while (isdigit(*ptrs[i]++)); - if ((i == 4 && !isspace(ptrs[i][-1])) || + while (sensible_ctype(isdigit,*ptrs[i]++)); + if ((i == 4 && !sensible_ctype(isspace,ptrs[i][-1])) || (i != 4 && ptrs[i][-1] != '.') || (ptrs[i]-ptrs[i-1] > 4)) { ptrs[0]= ptrs[i]-1; @@ -126,7 +145,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, line->addr, str); + msg("submitting %.*s -> %s", 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)) @@ -151,14 +170,15 @@ static void proclog(FILE *inf, FILE *outf, int opts) { while (head) { if (opts & OPT_DEBUG) msg("%d in queue; checking %.*s", len, - head->rest-head->addr, head->addr); - if (eof || len > MAXPENDING) + 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 err= adns_wait(adns, &head->query, &answer, NULL); - else + } else { err= adns_check(adns, &head->query, &answer, NULL); + } if (err != EAGAIN) { printline(outf, head->start, head->addr, head->rest, answer->status == adns_s_ok ? *answer->rrs.str : NULL);