| 1 | /* |
| 2 | * adnshost.c |
| 3 | * - useful general-purpose resolver client program |
| 4 | */ |
| 5 | /* |
| 6 | * This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson |
| 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License as published by |
| 10 | * the Free Software Foundation; either version 2, or (at your option) |
| 11 | * any later version. |
| 12 | * |
| 13 | * This program is distributed in the hope that it will be useful, |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 16 | * GNU General Public License for more details. |
| 17 | * |
| 18 | * You should have received a copy of the GNU General Public License |
| 19 | * along with this program; if not, write to the Free Software Foundation, |
| 20 | * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| 21 | */ |
| 22 | |
| 23 | #include <stdio.h> |
| 24 | #include <string.h> |
| 25 | #include <errno.h> |
| 26 | |
| 27 | #include "config.h" |
| 28 | |
| 29 | static void sysfail(const char *what, int errnoval) NONRETURNING; |
| 30 | static void sysfail(const char *what, int errnoval) { |
| 31 | fprintf(stderr,"adnshost failed: %s: %s\n",what,strerror(errnoval)); |
| 32 | exit(10); |
| 33 | } |
| 34 | |
| 35 | |
| 36 | static void printusage(void) { |
| 37 | if (fputs |
| 38 | ("usage: adnshost [global-opts] [query-opts] query-type query-domain\n" |
| 39 | " [[query-opts] [query-type] query-domain ...]\n" |
| 40 | " adnshost [global-opts] [query-opts] -f|--pipe\n" |
| 41 | "\n" |
| 42 | "global binary options:\n" |
| 43 | " +e --no-env No not look at environment variables at all.\n" |
| 44 | " -f --pipe Read queries on stdin instead of using args.\n" |
| 45 | " -A --asynch Allow answers to be reordered.\n" |
| 46 | " -0 --null stdin items are delimited by nulls.\n" |
| 47 | "global verbosity level:\n" |
| 48 | " -vq --quiet Do not print anything to stderr.\n" |
| 49 | " -vn --no-quiet Report unexpected kinds of problem only.\n" |
| 50 | " -vd --debug Debugging mode.\n" |
| 51 | "other global options:\n" |
| 52 | " --help, --version Print usage or version information.\n" |
| 53 | "\n" |
| 54 | "per-query binary options:\n" |
| 55 | " -R --search Use the search list.\n" |
| 56 | " -Qq --qc-query Let query domains contain quote-requiring chars.\n" |
| 57 | " -Qa --qc-anshost Let hostnames in answers contain ...\n" |
| 58 | " +Qc --no-qc-cname Prevent CNAME target domains from containing ...\n" |
| 59 | " -u --tcp Force use of a virtual circuit.\n" |
| 60 | " +fo --no-owner Do not display owner name in output.\n" |
| 61 | " +ft --no-type Do not display RR type in output.\n" |
| 62 | " +fc --no-show-cname Do not display CNAME target in output.\n" |
| 63 | "per-query TTL mode (NB TTL is minimum across whole query reply):\n" |
| 64 | " -Tt --ttl-ttl Show the TTL as a TTL.\n" |
| 65 | " -Ta --ttl-abs Show the TTL as a time_t when the data might expire.\n" |
| 66 | " -Tn --no-ttl Do not show the TTL (default).\n" |
| 67 | "per-query cname handling mode:\n" |
| 68 | " -cf --cname-reject Call it an error if a CNAME is found.\n" |
| 69 | " -cl --cname-loose Allow references to CNAMEs in other RRs.\n" |
| 70 | " -cs --cname-ok CNAME ok for query domain, but not in RRs (default).\n" |
| 71 | "other per-query options:\n" |
| 72 | " -I<id> ) Set the <id> to print in the output with --async.\n" |
| 73 | " --asynch-id <id> ) Default is a sequence number in decimal starting at 0.\n" |
| 74 | "\n" |
| 75 | "For binary options, --FOO and --no-FOO are opposites,\n" |
| 76 | "as are -X and +X; in each case the default is the one not listed.\n" |
| 77 | "Per query options stay set a particular way until they are reset,\n" |
| 78 | "whether they appear on the command line or on stdin.\n" |
| 79 | "\n" |
| 80 | "Output format is master file format without class or TTL by default:\n" |
| 81 | " [<owner>] [<ttl>] [<type>] <data>\n" |
| 82 | "or if the <owner> domain refers to a CNAME and --show-cname is on\n" |
| 83 | " [<owner>] [<ttl>] CNAME <cname>\n" |
| 84 | " [<cname>] [<ttl>] <type> <data>\n" |
| 85 | "When a query fails you get a line like:\n" |
| 86 | " ; failed <statustype> [<owner>] [<ttl>] [<type>] <status> \"<status string>\"\n" |
| 87 | "If you use --asynch, you don't get that. Instead, each answer (success or\n" |
| 88 | "failure) is preceded by a line:\n" |
| 89 | " <id> <statustype> <status> <nrrs> [<cname>] \"<status string>\"\n" |
| 90 | "where <nrrs> is the number of RRs that follow and <cname> will be `$' or\n" |
| 91 | "the canonical name.\n" |
| 92 | "\n" |
| 93 | "With -f, the input should be a list of arguments one per line (ie separated\n" |
| 94 | "by newlines), or separated by null characters if -0 or --null was used\n" |
| 95 | "\n" |
| 96 | "Exit status:\n" |
| 97 | " 0 all went well\n" |
| 98 | " 1-6 at least one query failed with statustype:\n" |
| 99 | " 1 localfail )\n" |
| 100 | " 2 remotefail ) temporary errors\n" |
| 101 | " 3 tempfail __)_________________\n" |
| 102 | " 4 misconfig )\n" |
| 103 | " 5 misquery ) permanent errors\n" |
| 104 | " 6 permfail )\n" |
| 105 | " 10 system trouble\n" |
| 106 | " 11 usage problems\n" |
| 107 | "\n" |
| 108 | "Query types (see adns.h):\n" |
| 109 | " NS SOA PTR MX RP A - enhanced versions\n" |
| 110 | " CNAME HINFO TXT - types with only one version\n" |
| 111 | " A- NS- SOA- PTR- MX- RP- - _raw versions\n", |
| 112 | stdout) == EOF) sysfail("write usage message",errno); |
| 113 | } |
| 114 | |
| 115 | int main(int argc, const char *const *argv) { |
| 116 | printusage(); |
| 117 | if (fclose(stdout)) sysfail("finish writing output",errno); |
| 118 | exit(0); |
| 119 | } |