X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=client%2Fadnslogres.c;h=b567bf99e6a83d010085c18d7a3e069b1f6ab19c;hb=3d1ae6ea11f3fa0f7eda890c7c81dc6a1ba76a95;hp=814ad62ac9607444ded7eb23bab662e5e47c4621;hpb=23d78b27cbd50ce871d20713cb28760a37fd2f09;p=adns.git diff --git a/client/adnslogres.c b/client/adnslogres.c index 814ad62..b567bf9 100644 --- a/client/adnslogres.c +++ b/client/adnslogres.c @@ -4,8 +4,12 @@ */ /* * This file is - * Copyright (C) 1999 Tony Finch + * Copyright (C) 1999 Tony Finch * Copyright (C) 1999 Ian Jackson + * + * It is part of adns, which is + * Copyright (C) 1997-1999 Ian Jackson + * Copyright (C) 1999 Tony Finch * * 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 @@ -31,6 +35,7 @@ static const char * const cvsid = #include #include +#include #include #include #include @@ -45,6 +50,10 @@ static const char * const cvsid = /* maximum length of a line */ #define MAXLINE 1024 +/* option flags */ +#define OPT_DEBUG 1 +#define OPT_POLL 2 + static const char *progname; static void aargh(const char *msg) { @@ -56,19 +65,25 @@ static void aargh(const char *msg) { /* * Parse the IP address and convert to a reverse domain name. */ -static void ipaddr2domain(char *start, char **addr, char **rest, char **domain) { +static char *ipaddr2domain(char *start, char **addr, char **rest) { static char buf[30]; /* "123.123.123.123.in-addr.arpa.\0" */ char *ptrs[5]; int i; - for (ptrs[0]= start; !isdigit(*ptrs[0]); ptrs[0]++) - if (!*ptrs[0]) - goto invalid; + ptrs[0]= start; +retry: + while (!isdigit(*ptrs[0])) + if (!*ptrs[0]++) { + strcpy(buf, "invalid."); + *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) - goto invalid; - else + if (!ptrs[i] || ptrs[i]-ptrs[i-1] > 3) { + ptrs[0]++; + goto retry; + } else ptrs[i]++; } sprintf(buf, "%.*s.%.*s.%.*s.%.*s.in-addr.arpa.", @@ -78,13 +93,7 @@ static void ipaddr2domain(char *start, char **addr, char **rest, char **domain) ptrs[1]-ptrs[0]-1, ptrs[0]); *addr= ptrs[0]; *rest= ptrs[4]-1; - *domain= buf; - return; -invalid: - strcpy(buf, "invalid."); - *addr= *rest= NULL; - *domain= buf; - return; + return buf; } static void printline(char *start, char *addr, char *rest, char *domain) { @@ -101,7 +110,7 @@ typedef struct logline { adns_query query; } logline; -static logline *readline(adns_state adns) { +static logline *readline(adns_state adns, int opts) { static char buf[MAXLINE]; char *str; logline *line; @@ -113,7 +122,9 @@ static logline *readline(adns_state adns) { line->next= NULL; line->start= str+sizeof(logline); strcpy(line->start, buf); - ipaddr2domain(line->start, &line->addr, &line->rest, &str); + str = ipaddr2domain(line->start, &line->addr, &line->rest); + if (opts & OPT_DEBUG) + fprintf(stderr, "%s: adns_submit %s\n", progname, str); if (adns_submit(adns, str, adns_r_ptr, adns_qf_quoteok_cname|adns_qf_cname_loose, NULL, &line->query)) @@ -125,22 +136,25 @@ static logline *readline(adns_state adns) { return NULL; } -static void proclog(void) { +static void proclog(int opts) { int eof, err, len; adns_state adns; adns_answer *answer; logline *head, *tail, *line; - errno= adns_init(&adns, 0, 0); + errno= adns_init(&adns, (opts & OPT_DEBUG) ? adns_if_debug : 0, 0); if (errno) aargh("adns_init"); - head= tail= readline(adns); + head= tail= readline(adns, opts); len= 1; eof= 0; while (head) { if (eof || len > MAXPENDING) - err= adns_wait(adns, &head->query, &answer, NULL); + if (opts & OPT_POLL) + err= adns_wait_poll(adns, &head->query, &answer, NULL); + else + err= adns_wait(adns, &head->query, &answer, NULL); else err= adns_check(adns, &head->query, &answer, NULL); - if (err != EWOULDBLOCK) { + if (err != EAGAIN) { printline(head->start, head->addr, head->rest, answer->status == adns_s_ok ? *answer->rrs.str : NULL); line= head; head= head->next; @@ -148,7 +162,7 @@ static void proclog(void) { len--; } if (!eof) { - line= readline(adns); + line= readline(adns, opts); if (!line) eof= 1; else { @@ -165,8 +179,29 @@ static void proclog(void) { } int main(int argc, char *argv[]) { + int c, opts; + progname= *argv; - proclog(); + opts= 0; + + while ((c= getopt(argc, argv, "dp")) != -1) { + switch (c) { + case 'd': + opts |= OPT_DEBUG; + break; + case 'p': + opts |= OPT_POLL; + break; + default: + fprintf(stderr, "usage: %s [-d] < logfile\n", progname); + exit(1); + } + argc-= optind; + argv+= optind; + } + + proclog(opts); + if (fclose(stdout)) aargh("finish writing output"); return 0; }