* - filter which does resolving, not part of the library
*/
/*
- * This file is
- * Copyright (C) 1999-2000 Ian Jackson <ian@davenant.greenend.org.uk>
- *
- * It is part of adns, which is
- * Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
- * Copyright (C) 1999 Tony Finch <dot@dotat.at>
+ * This file is part of adns, which is
+ * Copyright (C) 1997-2000,2003,2006,2014-2016,2020 Ian Jackson
+ * Copyright (C) 2014 Mark Wooding
+ * 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,
* 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.
*/
#include <stdio.h>
#include "adns.h"
#include "dlist.h"
#include "tvarith.h"
+#include "client.h"
#ifdef ADNS_REGRESS_TEST
# include "hredirect.h"
struct outqueuenode {
struct outqueuenode *next, *back;
- void *buffer;
- char *textp;
+ char *buffer, *textp;
int textlen;
struct timeval printbefore;
struct treething *addr;
static struct sockaddr_in sa;
static adns_state ads;
-static char addrtextbuf[14];
+static char addrtextbuf[18]; /* [ddd.ddd.ddd.ddd] + nul */
static int cbyte, inbyte, inbuf;
static unsigned char bytes[4];
static struct timeval printbefore;
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);
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) {
static void usage(void) {
if (printf("usage: adnsresfilter [<options ...>]\n"
- " adnsresfilter -h|--help\n"
+ " adnsresfilter -h|--help | --version\n"
"options: -t<milliseconds>|--timeout <milliseconds>\n"
" -w|--wait (always wait for queries to time out or fail)\n"
" -b|--brackets (require [...] around IP addresses)\n"
"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) {
} 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");
}
break;
case 'h':
usage();
- quit(0);
+ quitnow(0);
default:
usageerr("unknown short option");
}
struct outqueuenode *entry;
entry= outqueue.tail;
- if (!entry || entry->addr || entry->textlen >= peroutqueuenode) {
+ if (!entry || entry->addr ||
+ entry->textlen >= peroutqueuenode - (entry->textp - entry->buffer)) {
peroutqueuenode= !peroutqueuenode || !entry || entry->addr ? 128 :
peroutqueuenode >= 1024 ? 4096 : peroutqueuenode<<2;
entry= xmalloc(sizeof(*entry));
}
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);
}