* main program and useful subroutines
*/
/*
- * This file is
- * Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
- *
- * It is part of adns, which is
- * Copyright (C) 1997-1999 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 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 "adnshost.h"
+int rcode;
+const char *config_text;
+
+static int used, avail;
+static char *buf;
+
+void quitnow(int rc) {
+ if (ads) adns_finish(ads);
+ free(buf);
+ free(ov_id);
+ exit(rc);
+}
+
void sysfail(const char *what, int errnoval) {
fprintf(stderr,"adnshost failed: %s: %s\n",what,strerror(errnoval));
- exit(10);
+ quitnow(10);
}
void usageerr(const char *fmt, ...) {
vfprintf(stderr,fmt,al);
va_end(al);
putc('\n',stderr);
- exit(11);
+ quitnow(11);
}
void outerr(void) {
sysfail("write to stdout",errno);
}
-static void domain_do(const char *domain) {
- if (ov_pipe && !ads) usageerr("-f/--pipe not consistent with domains on command line");
- ensure_adns_init();
- query_do(domain);
-}
-
void *xmalloc(size_t sz) {
void *p;
return p;
}
-void of_type(const struct optioninfo *oi, const char *arg) {
+void of_config(const struct optioninfo *oi, const char *arg, const char *arg2) {
+ config_text= arg;
+}
+
+void of_type(const struct optioninfo *oi, const char *arg, const char *arg2) {
static const struct typename {
adns_rrtype type;
const char *desc;
{ adns_r_ptr, "ptr" },
{ adns_r_mx, "mx" },
{ adns_r_rp, "rp" },
+ { adns_r_srv, "srv" },
{ adns_r_addr, "addr" },
/* types with only one version */
/* raw versions */
{ adns_r_a, "a" },
+ { adns_r_aaaa, "aaaa" },
{ adns_r_ns_raw, "ns-" },
{ adns_r_soa_raw, "soa-" },
{ adns_r_ptr_raw, "ptr-" },
{ adns_r_mx_raw, "mx-" },
{ adns_r_rp_raw, "rp-" },
+ { adns_r_srv_raw, "srv-" },
{ adns_r_none, 0 }
};
const struct typename *tnp;
+ unsigned long unknowntype;
+ char *ep;
+
+ if (strlen(arg) > 4 && !memcmp(arg,"type",4) &&
+ (unknowntype= strtoul(arg+4, &ep, 10), !*ep) && unknowntype < 65536) {
+ ov_type= unknowntype | adns_r_unknown;
+ return;
+ }
for (tnp=typenames;
tnp->type && strcmp(arg,tnp->desc);
ov_type= tnp->type;
}
-int rcode;
-
static void process_optarg(const char *arg,
const char *const **argv_p,
const char *value) {
const struct optioninfo *oip;
+ const char *arg2;
int invert;
if (arg[0] == '-' || arg[0] == '+') {
if (oip->type == ot_funcarg) {
arg= argv_p ? *++(*argv_p) : value;
if (!arg) usageerr("option --%s requires a value argument",oip->lopt);
+ arg2= 0;
+ } else if (oip->type == ot_funcarg2) {
+ assert(argv_p);
+ arg= *++(*argv_p);
+ arg2= arg ? *++(*argv_p) : 0;
+ if (!arg || !arg2)
+ usageerr("option --%s requires two more arguments", oip->lopt);
} else {
if (value) usageerr("option --%s does not take a value",oip->lopt);
arg= 0;
+ arg2= 0;
}
- opt_do(oip,arg,invert);
+ opt_do(oip,invert,arg,arg2);
} else if (arg[0] == '-' && arg[1] == 0) {
arg= argv_p ? *++(*argv_p) : value;
if (!arg) usageerr("option `-' must be followed by a domain");
- domain_do(arg);
+ query_do(arg);
} else { /* arg[1] != '-', != '\0' */
invert= (arg[0] == '+');
++arg;
} else {
if (value) usageerr("two values for option -%s given !",oip->sopt);
}
- opt_do(oip,arg,invert);
+ opt_do(oip,invert,arg,0);
arg= "";
} else {
if (value) usageerr("option -%s does not take a value",oip->sopt);
- opt_do(oip,0,invert);
+ opt_do(oip,invert,0,0);
}
}
}
} else { /* arg[0] != '-' */
- domain_do(arg);
+ query_do(arg);
}
}
static void read_stdin(void) {
- static int used, avail;
- static char *buf;
-
int anydone, r;
char *newline, *space;
}
x_quit:
if (fclose(stdout)) outerr();
- exit(rcode);
+ quitnow(rcode);
}