summaryrefslogtreecommitdiffstats
path: root/contrib/bind/bin/dig/dig.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind/bin/dig/dig.c')
-rw-r--r--contrib/bind/bin/dig/dig.c108
1 files changed, 46 insertions, 62 deletions
diff --git a/contrib/bind/bin/dig/dig.c b/contrib/bind/bin/dig/dig.c
index 5bb6e7a..e18249f 100644
--- a/contrib/bind/bin/dig/dig.c
+++ b/contrib/bind/bin/dig/dig.c
@@ -1,5 +1,5 @@
#ifndef lint
-static const char rcsid[] = "$Id: dig.c,v 8.57 2002/06/18 02:26:49 marka Exp $";
+static const char rcsid[] = "$Id: dig.c,v 8.62.6.3 2003/06/02 10:06:30 marka Exp $";
#endif
/*
@@ -177,6 +177,7 @@ static const char rcsid[] = "$Id: dig.c,v 8.57 2002/06/18 02:26:49 marka Exp $";
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <time.h> /* time(2), ctime(3) */
#include "port_after.h"
@@ -206,15 +207,23 @@ static const char rcsid[] = "$Id: dig.c,v 8.57 2002/06/18 02:26:49 marka Exp $";
#define SAVEENV "DiG.env"
#define DIG_MAXARGS 30
+#ifndef DIG_PING
+#define DIG_PING "ping"
+#endif
+#ifndef DIG_TAIL
+#define DIG_TAIL "tail"
+#endif
+#ifndef DIG_PINGFMT
+#define DIG_PINGFMT "%s -s %s 56 3 | %s -3"
+#endif
+
static int eecode = 0;
static FILE * qfp;
-static char *defsrv, *srvmsg;
-static char defbuf[40] = "default -- ";
-static char srvbuf[1024];
static char myhostname[MAXHOSTNAMELEN];
static struct sockaddr_in myaddress;
static struct sockaddr_in6 myaddress6;
static u_int32_t ixfr_serial;
+static char ubuf[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:123.123.123.123")];
/* stuff for nslookup modules */
struct __res_state res;
@@ -260,7 +269,7 @@ main(int argc, char **argv) {
} packet_;
#define header (packet_.header_)
#define packet (packet_.packet_)
- u_char answer[64*1024];
+ u_char answer[NS_MAXMSG];
int n;
char doping[90];
char pingstr[50];
@@ -295,6 +304,7 @@ main(int argc, char **argv) {
ns_tsig_key key;
char *keyfile = NULL, *keyname = NULL;
+ const char *pingfmt = NULL;
res_ninit(&res);
res.pfcode = PRF_DEF;
@@ -315,7 +325,6 @@ main(int argc, char **argv) {
myaddress6.sin6_addr = in6addr_any;
myaddress6.sin6_port = 0; /*INPORT_ANY*/;
- defsrv = strcat(defbuf, inet_ntoa(res.nsaddr.sin_addr));
res_x = res;
/*
@@ -363,7 +372,6 @@ main(int argc, char **argv) {
vtmp++;
}
- res.id = 1;
gettimeofday(&tv1, NULL);
/*
@@ -408,6 +416,11 @@ main(int argc, char **argv) {
* deal with ....
*/
while (*(++argv) != NULL && **argv != '\0') {
+ if (strlen(cmd) + strlen(*argv) + 2 > sizeof (cmd)) {
+ fprintf(stderr,
+ "Argument too large for input buffer\n");
+ exit(1);
+ }
strcat(cmd, *argv);
strcat(cmd, " ");
if (**argv == '@') {
@@ -523,10 +536,14 @@ main(int argc, char **argv) {
port = htons(atoi(*argv));
break;
case 'P':
- if (argv[0][2] != '\0')
+ if (argv[0][2] != '\0') {
strcpy(pingstr, argv[0]+2);
- else
- strcpy(pingstr, "ping -s");
+ pingfmt =
+ "%s %s 56 3 | %s -3";
+ } else {
+ strcpy(pingstr, DIG_PING);
+ pingfmt = DIG_PINGFMT;
+ }
break;
case 'n':
if (argv[0][2] != '\0')
@@ -769,8 +786,6 @@ main(int argc, char **argv) {
* able to "put the resolver to work".
*/
- srvbuf[0] = 0;
- srvmsg = defsrv;
if (srv != NULL) {
int nscount = 0;
union res_sockaddr_union u[MAXNS];
@@ -803,31 +818,13 @@ main(int argc, char **argv) {
case AF_INET:
u[nscount].sin =
*(struct sockaddr_in*)cur->ai_addr;
- u[nscount++].sin6.sin6_port =
+ u[nscount++].sin.sin_port =
port;
break;
}
}
- if (nscount != 0) {
- char buf[80];
+ if (nscount != 0)
res_setservers(&res, u, nscount);
- srvmsg = strcat(srvbuf, srv);
- strcat(srvbuf, " ");
- buf[0] = '\0';
- switch (u[0].sin.sin_family) {
- case AF_INET:
- inet_ntop(AF_INET,
- &u[0].sin.sin_addr,
- buf, sizeof(buf));
- break;
- case AF_INET6:
- inet_ntop(AF_INET6,
- &u[0].sin6.sin6_addr,
- buf, sizeof(buf));
- break;
- }
- strcat(srvbuf, buf);
- }
freeaddrinfo(answer);
} else {
res = res_t;
@@ -836,7 +833,6 @@ main(int argc, char **argv) {
"; Bad server: %s -- using default server and timer opts\n",
srv);
fflush(stderr);
- srvmsg = defsrv;
srv = NULL;
}
printf("; (%d server%s found)\n",
@@ -849,7 +845,7 @@ main(int argc, char **argv) {
int nscount;
union res_sockaddr_union u[MAXNS];
nscount = res_getservers(&res, u, MAXNS);
- for (i = 0; i < res.nscount; i++) {
+ for (i = 0; i < nscount; i++) {
int x;
if (keyfile)
@@ -861,24 +857,11 @@ main(int argc, char **argv) {
&u[i].sin,
NULL);
if (res.pfcode & RES_PRF_STATS) {
- char buf[80];
exectime = time(NULL);
- buf[0] = '\0';
- switch (u[i].sin.sin_family) {
- case AF_INET:
- inet_ntop(AF_INET,
- &u[i].sin.sin_addr,
- buf, sizeof(buf));
- break;
- case AF_INET6:
- inet_ntop(AF_INET6,
- &u[i].sin6.sin6_addr,
- buf, sizeof(buf));
- break;
- }
printf(";; FROM: %s to SERVER: %s\n",
myhostname,
- buf);
+ p_sockun(u[RES_GETLAST(res)],
+ ubuf, sizeof(ubuf)));
printf(";; WHEN: %s", ctime(&exectime));
}
if (!x)
@@ -944,12 +927,10 @@ main(int argc, char **argv) {
if ((bytes_in = n) < 0) {
fflush(stdout);
n = 0 - n;
- msg[0]=0;
if (keyfile)
- strcat(msg,";; res_nsendsigned to server ");
+ strcpy(msg, ";; res_nsendsigned");
else
- strcat(msg,";; res_nsend to server ");
- strcat(msg,srvmsg);
+ strcat(msg, ";; res_nsend");
perror(msg);
fflush(stderr);
@@ -963,13 +944,17 @@ main(int argc, char **argv) {
(void) gettimeofday(&end_time, NULL);
if (res.pfcode & RES_PRF_STATS) {
+ union res_sockaddr_union u[MAXNS];
+
+ (void) res_getservers(&res, u, MAXNS);
query_time = difftv(start_time, end_time);
printf(";; Total query time: ");
prnttime(query_time);
putchar('\n');
exectime = time(NULL);
- printf(";; FROM: %s to SERVER: %s\n",
- myhostname, srvmsg);
+ printf(";; FROM: %s to SERVER: %s\n", myhostname,
+ p_sockun(u[RES_GETLAST(res)],
+ ubuf, sizeof(ubuf)));
printf(";; WHEN: %s", ctime(&exectime));
printf(";; MSG SIZE sent: %d rcvd: %d\n",
bytes_out, bytes_in);
@@ -980,9 +965,8 @@ main(int argc, char **argv) {
* Argh ... not particularly elegant. Should put in *real* ping code.
* Would necessitate root priviledges for icmp port though!
*/
- if (*pingstr) {
- sprintf(doping,"%s %s 56 3 | tail -3",pingstr,
- (srv==NULL)?(defsrv+10):srv);
+ if (*pingstr && srv != NULL) {
+ sprintf(doping, pingfmt, pingstr, srv, DIG_TAIL);
system(doping);
}
putchar('\n');
@@ -1038,7 +1022,7 @@ where: server,\n\
fputs("\
notes: defname and search don't work; use fully-qualified names.\n\
this is DiG version " VSTRING "\n\
- $Id: dig.c,v 8.57 2002/06/18 02:26:49 marka Exp $\n\
+ $Id: dig.c,v 8.62.6.3 2003/06/02 10:06:30 marka Exp $\n\
", stderr);
}
@@ -1383,7 +1367,7 @@ printZone(ns_type xfr, const char *zone, const struct sockaddr_in *sin,
sizeof myaddress) < 0){
int e = errno;
- fprintf(stderr, ";; bind(%s:%u): %s\n",
+ fprintf(stderr, ";; bind(%s port %u): %s\n",
inet_ntoa(myaddress.sin_addr),
ntohs(myaddress.sin_port),
strerror(e));
@@ -1407,7 +1391,7 @@ printZone(ns_type xfr, const char *zone, const struct sockaddr_in *sin,
int e = errno;
char buf[80];
- fprintf(stderr, ";; bind(%s:%u): %s\n",
+ fprintf(stderr, ";; bind(%s port %u): %s\n",
inet_ntop(AF_INET6, &myaddress6.sin6_addr,
buf, sizeof(buf)),
ntohs(myaddress6.sin6_port),
@@ -1799,7 +1783,7 @@ reverse6(char *domain, struct in6_addr *in6) {
in6->s6_addr[6] & 0x0f, (in6->s6_addr[6] >> 4) & 0x0f,
in6->s6_addr[5] & 0x0f, (in6->s6_addr[5] >> 4) & 0x0f,
in6->s6_addr[4] & 0x0f, (in6->s6_addr[4] >> 4) & 0x0f,
- in6->s6_addr[6] & 0x0f, (in6->s6_addr[3] >> 4) & 0x0f,
+ in6->s6_addr[3] & 0x0f, (in6->s6_addr[3] >> 4) & 0x0f,
in6->s6_addr[2] & 0x0f, (in6->s6_addr[2] >> 4) & 0x0f,
in6->s6_addr[1] & 0x0f, (in6->s6_addr[1] >> 4) & 0x0f,
in6->s6_addr[0] & 0x0f, (in6->s6_addr[0] >> 4) & 0x0f);
OpenPOWER on IntegriCloud