Import of ISC BIND version 8.3.6.
Version 8.3.5 was skipped due to bugs fixed in this version.
This commit is contained in:
parent
7f1ab065eb
commit
55d7029049
File diff suppressed because it is too large
Load Diff
@ -10,6 +10,12 @@ artifacts including BIND, INN, and DHCP.
|
||||
Note that BIND 8 is in "end-of-life", having been replaced by BIND 9. See
|
||||
http://www.isc.org/ for more details.
|
||||
|
||||
BIND 8.3.6 Highlights
|
||||
Maintenance release.
|
||||
|
||||
BIND 8.3.5 Highlights
|
||||
Maintenance release.
|
||||
|
||||
BIND 8.3.4 Highlights
|
||||
Security Fix DoS and buffer overrun.
|
||||
|
||||
|
@ -1 +1 @@
|
||||
8.3.4-REL
|
||||
8.3.6-REL
|
||||
|
@ -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);
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: dnsquery.c,v 8.19 2002/04/12 03:03:48 marka Exp $";
|
||||
static const char rcsid[] = "$Id: dnsquery.c,v 8.19.10.1 2003/06/02 09:15:45 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -85,7 +85,7 @@ main(int argc, char *argv[]) {
|
||||
int c, n;
|
||||
int nameservers = 0, class, type, len;
|
||||
union res_sockaddr_union q_nsaddr[MAXNS];
|
||||
extern int optind, opterr;
|
||||
extern int optind;
|
||||
extern char *optarg;
|
||||
int stream = 0, debug = 0;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef lint
|
||||
static const char rcsid[] = "$Id: host.c,v 8.53 2002/06/18 02:34:02 marka Exp $";
|
||||
static const char rcsid[] = "$Id: host.c,v 8.55.8.1 2003/06/02 09:24:38 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -136,7 +136,7 @@ static const char copyright[] =
|
||||
#define ERROR -3
|
||||
#define NONAUTH -4
|
||||
|
||||
#define MY_PACKETSZ 64*1024 /* need this to hold tcp answers */
|
||||
#define MY_PACKETSZ NS_MAXMSG
|
||||
|
||||
typedef union {
|
||||
HEADER qb1;
|
||||
@ -226,7 +226,7 @@ Usage: %s [-adlrwv] [-t querytype] [-c class] host [server]\n\
|
||||
int
|
||||
main(int argc, char **argv) {
|
||||
struct sockaddr_storage addr;
|
||||
struct hostent *hp;
|
||||
int ok = 0;
|
||||
char *s;
|
||||
int waitmode = 0;
|
||||
int ncnames, ch;
|
||||
@ -383,7 +383,6 @@ main(int argc, char **argv) {
|
||||
}
|
||||
freeaddrinfo(answer);
|
||||
}
|
||||
hp = NULL;
|
||||
res.res_h_errno = TRY_AGAIN;
|
||||
/*
|
||||
* We handle default domains ourselves, thank you.
|
||||
@ -393,10 +392,10 @@ main(int argc, char **argv) {
|
||||
if (list)
|
||||
exit(ListHosts(getdomain, querytype ? querytype : ns_t_a));
|
||||
ncnames = 5; nkeychains = 18;
|
||||
while (hp == NULL && res.res_h_errno == TRY_AGAIN) {
|
||||
while (ok == 0 && res.res_h_errno == TRY_AGAIN) {
|
||||
if (!ip) {
|
||||
cname = NULL;
|
||||
hp = (struct hostent *)gethostinfo(getdomain);
|
||||
ok = gethostinfo(getdomain);
|
||||
getdomain[0] = 0; /* clear this query */
|
||||
if (sigchase && (chase_step & SD_RR)) {
|
||||
if (nkeychains-- == 0) {
|
||||
@ -413,7 +412,7 @@ main(int argc, char **argv) {
|
||||
strcpy (getdomain, chase_domain);
|
||||
strcat (getdomain, ".");
|
||||
querytype = ns_t_sig;
|
||||
} else if (hp && !(chase_step & SD_SIG) &&
|
||||
} else if (ok != 0 && !(chase_step & SD_SIG) &&
|
||||
(chase_step & SD_BADSIG)) {
|
||||
printf ("%s for %s not found, last verified key %s\n",
|
||||
chase_step & SD_SIG ? "Key" : "Signature",
|
||||
@ -437,21 +436,17 @@ main(int argc, char **argv) {
|
||||
sym_ntos(__p_type_syms, chase_type, NULL),
|
||||
getdomain);
|
||||
}
|
||||
hp = NULL;
|
||||
ok = 0;
|
||||
res.res_h_errno = TRY_AGAIN;
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (addrinfo(&addr) == 0)
|
||||
hp = NULL;
|
||||
else
|
||||
hp = (struct hostent *)1; /* XXX */
|
||||
}
|
||||
} else
|
||||
ok = addrinfo(&addr);
|
||||
if (!waitmode)
|
||||
break;
|
||||
}
|
||||
|
||||
if (hp == NULL) {
|
||||
if (ok == 0) {
|
||||
hperror(res.res_h_errno);
|
||||
exit(1);
|
||||
}
|
||||
@ -749,14 +744,14 @@ printinfo(const querybuf *answer, const u_char *eom, int filter, int isls,
|
||||
case SERVFAIL:
|
||||
res.res_h_errno = TRY_AGAIN;
|
||||
return (0);
|
||||
case NOERROR:
|
||||
res.res_h_errno = NO_DATA;
|
||||
return (0);
|
||||
case FORMERR:
|
||||
case NOTIMP:
|
||||
case REFUSED:
|
||||
res.res_h_errno = NO_RECOVERY;
|
||||
return (0);
|
||||
case NOERROR:
|
||||
res.res_h_errno = NO_DATA;
|
||||
return (0);
|
||||
case FORMERR:
|
||||
case NOTIMP:
|
||||
case REFUSED:
|
||||
res.res_h_errno = NO_RECOVERY;
|
||||
return (0);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
@ -1053,7 +1048,7 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
|
||||
}
|
||||
|
||||
if (doprint)
|
||||
fprintf(file, "(\n\t\t\t%lu\t;serial (version)",
|
||||
fprintf(file, " (\n\t\t\t%lu\t;serial (version)",
|
||||
ns_get32(cp));
|
||||
cp += INT32SZ;
|
||||
if (doprint)
|
||||
@ -1321,15 +1316,15 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
|
||||
/* original ttl */
|
||||
origttl = cp;
|
||||
if (doprint && verbose)
|
||||
fprintf(file, " %ld", ns_get32(cp));
|
||||
fprintf(file, " %lu", ns_get32(cp));
|
||||
cp += INT32SZ;
|
||||
/* signature expiration */
|
||||
if (doprint && verbose)
|
||||
fprintf(file, " %ld", ns_get32(cp));
|
||||
fprintf(file, " %lu", ns_get32(cp));
|
||||
cp += INT32SZ;
|
||||
/* time signed */
|
||||
if (doprint && verbose)
|
||||
fprintf(file, " %ld", ns_get32(cp));
|
||||
fprintf(file, " %lu", ns_get32(cp));
|
||||
cp += INT32SZ;
|
||||
/* key footprint */
|
||||
if (doprint && verbose)
|
||||
@ -1415,7 +1410,8 @@ pr_rr(const u_char *cp, const u_char *msg, FILE *file, int filter) {
|
||||
}
|
||||
|
||||
default:
|
||||
fprintf (stderr, "Unknown algorithm %d\n", n);
|
||||
if (doprint && verbose)
|
||||
fprintf (stderr, "Unknown algorithm %d\n", n);
|
||||
cp = cp1 + dlen;
|
||||
break;
|
||||
}
|
||||
|
@ -130,7 +130,7 @@ char copyright[] =
|
||||
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char sccsid[] = "@(#)named-xfer.c 4.18 (Berkeley) 3/7/91";
|
||||
static const char rcsid[] = "$Id: named-xfer.c,v 8.121 2002/06/26 03:27:22 marka Exp $";
|
||||
static const char rcsid[] = "$Id: named-xfer.c,v 8.122.8.2 2003/06/02 05:59:56 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "port_before.h"
|
||||
@ -242,8 +242,9 @@ LIST(tsig_node) tsig_list;
|
||||
/*
|
||||
* Debugging printf.
|
||||
*/
|
||||
void
|
||||
dprintf(int level, const char *format, ...) {
|
||||
static void lprintf(int level, const char *format, ...) ISC_FORMAT_PRINTF(2, 3);
|
||||
static void
|
||||
lprintf(int level, const char *format, ...) {
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
@ -596,15 +597,15 @@ main(int argc, char *argv[]) {
|
||||
#endif /* SIGUSR1&&SIGUSR2 */
|
||||
|
||||
if (dbfile)
|
||||
dprintf(1, "domain `%s'; file `%s'; serial %u\n",
|
||||
lprintf(1, "domain `%s'; file `%s'; serial %u\n",
|
||||
domain, dbfile, serial_no);
|
||||
|
||||
if (ixfrfile)
|
||||
dprintf(1, "domain `%s'; ixfrfile `%s'; serial %u\n",
|
||||
lprintf(1, "domain `%s'; ixfrfile `%s'; serial %u\n",
|
||||
domain, ixfrfile, serial_no);
|
||||
|
||||
if (tsigfile)
|
||||
dprintf(1, "tsigfile `%s'\n", tsigfile);
|
||||
lprintf(1, "tsigfile `%s'\n", tsigfile);
|
||||
|
||||
buildservicelist();
|
||||
buildprotolist();
|
||||
@ -626,7 +627,7 @@ main(int argc, char *argv[]) {
|
||||
zp->z_source = dbfile;
|
||||
zp->z_axfr_src = axfr_src;
|
||||
zp->z_addrcnt = 0;
|
||||
dprintf(1, "zone found (%d): \"%s\", source = %s\n",
|
||||
lprintf(1, "zone found (%d): \"%s\", source = %s\n",
|
||||
zp->z_type,
|
||||
(zp->z_origin[0] == '\0') ? "." : zp->z_origin,
|
||||
zp->z_source);
|
||||
@ -670,15 +671,15 @@ main(int argc, char *argv[]) {
|
||||
memcpy(&zp->z_addr[zp->z_addrcnt],
|
||||
hp->h_addr,
|
||||
INADDRSZ);
|
||||
dprintf(1, "Arg: \"%s\" %s\n", tm,((tmpsupportixfr) ? "IXFR":"AXFR"));
|
||||
lprintf(1, "Arg: \"%s\" %s\n", tm,((tmpsupportixfr) ? "IXFR":"AXFR"));
|
||||
}
|
||||
if (++zp->z_addrcnt >= NSMAX) {
|
||||
zp->z_addrcnt = NSMAX;
|
||||
dprintf(1, "NSMAX reached\n");
|
||||
lprintf(1, "NSMAX reached\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
dprintf(1, "addrcnt = %d\n", zp->z_addrcnt);
|
||||
lprintf(1, "addrcnt = %d\n", zp->z_addrcnt);
|
||||
|
||||
res_ninit(&res);
|
||||
res.options &= ~(RES_DEFNAMES | RES_DNSRCH | RES_RECURSE);
|
||||
@ -890,7 +891,7 @@ make_query(int fd, struct zoneinfo *zp, int type, u_int32_t serial_no,
|
||||
if (type == T_IXFR) {
|
||||
hp = (HEADER *) buf;
|
||||
cp = buf;
|
||||
dprintf(1, "len = %d\n", n);
|
||||
lprintf(1, "len = %d\n", n);
|
||||
hp->nscount = htons(1+ntohs(hp->nscount));
|
||||
cp += n;
|
||||
n = dn_comp(zp->z_origin, cp, bufsize - (cp - buf), NULL, NULL);
|
||||
@ -911,7 +912,7 @@ make_query(int fd, struct zoneinfo *zp, int type, u_int32_t serial_no,
|
||||
PUTLONG(0xABCD, cp); /* Expire */
|
||||
PUTLONG(0x1776, cp); /* Min TTL */
|
||||
n = cp - buf;
|
||||
dprintf(1, "len = %d\n", cp-buf);
|
||||
lprintf(1, "len = %d\n", cp-buf);
|
||||
}
|
||||
|
||||
tsig_signed = 0;
|
||||
@ -1116,7 +1117,7 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
|
||||
for (cnt = 0; cnt < zp->z_addrcnt; cnt++) {
|
||||
methode = servermethode[cnt];
|
||||
sin.sin_addr = zp->z_addr[cnt];
|
||||
dprintf(3, "address [%s] %s\n",
|
||||
lprintf(3, "address [%s] %s\n",
|
||||
inet_ntoa(sin.sin_addr),
|
||||
(methode == ISIXFR) ? "IXFR":"AXFR");
|
||||
}
|
||||
@ -1156,7 +1157,7 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_port = 0; /* "ANY" */
|
||||
sin.sin_addr = z_axfr_src;
|
||||
dprintf(2, "binding to address [%s]\n",
|
||||
lprintf(2, "binding to address [%s]\n",
|
||||
inet_ntoa(sin.sin_addr));
|
||||
if (bind(s, (struct sockaddr *)&sin, sizeof sin) < 0)
|
||||
syslog(LOG_INFO, "warning: bind(%s) failed",
|
||||
@ -1166,11 +1167,11 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_port = port;
|
||||
sin.sin_addr = zp->z_addr[cnt];
|
||||
dprintf(2, "connecting to server #%d [%s].%d\n",
|
||||
lprintf(2, "connecting to server #%d [%s].%d\n",
|
||||
cnt + 1, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
|
||||
if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
|
||||
if (z_axfr_src.s_addr != 0) {
|
||||
dprintf(2, "connect failed, trying w/o -x");
|
||||
lprintf(2, "connect failed, trying w/o -x");
|
||||
z_axfr_src.s_addr = 0;
|
||||
(void) my_close(s);
|
||||
goto try_again;
|
||||
@ -1369,7 +1370,7 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
|
||||
}
|
||||
}
|
||||
if ((loop_cnt >= 1) && (soa_cnt < 2)) {
|
||||
dprintf(1,
|
||||
lprintf(1,
|
||||
"server %s %d rejected IXFR and responded with AXFR\n",
|
||||
inet_ntoa(sin.sin_addr), soa_cnt);
|
||||
methode = ISNOTIXFR;
|
||||
@ -1379,7 +1380,7 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
|
||||
break;
|
||||
}
|
||||
/* Skip to next record, if any. */
|
||||
dprintf(1, "skipping %s %s RR in response\n",
|
||||
lprintf(1, "skipping %s %s RR in response\n",
|
||||
name2, p_type(type));
|
||||
tmp = cp4 + dlen;
|
||||
loop_cnt++;
|
||||
@ -1391,7 +1392,7 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
|
||||
if (check_serial &&
|
||||
!SEQ_GT(zp_start.z_serial, query_serial)) {
|
||||
(void) my_close(s);
|
||||
dprintf(1,
|
||||
lprintf(1,
|
||||
"zone up-to-date, serial %u\n",
|
||||
zp_start.z_serial);
|
||||
if (ixfp) {
|
||||
@ -1540,7 +1541,7 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
|
||||
soa_cnt = 0;
|
||||
goto axfr_response;
|
||||
}
|
||||
dprintf(1, "need update, serial %u\n",
|
||||
lprintf(1, "need update, serial %u\n",
|
||||
zp_start.z_serial);
|
||||
soa_cnt = 0;
|
||||
hp = (HEADER *) buf;
|
||||
@ -1564,14 +1565,16 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
|
||||
serial_no, tsig_key,
|
||||
buf, bufsize);
|
||||
syslog(LOG_INFO,
|
||||
"send %s query %d to %s",
|
||||
p_type(query_type),
|
||||
cnt, inet_ntoa(sin.sin_addr));
|
||||
dprintf(1,
|
||||
"send %s query %d to %s for %s",
|
||||
p_type(query_type),
|
||||
cnt, inet_ntoa(sin.sin_addr),
|
||||
(*zp->z_origin != '\0') ?
|
||||
zp->z_origin : ".");
|
||||
lprintf(1,
|
||||
"send %s query to %s\n",
|
||||
p_type(query_type),
|
||||
inet_ntoa(sin.sin_addr));
|
||||
dprintf(1,"bufsize = %d\n", bufsize);
|
||||
lprintf(1,"bufsize = %d\n", bufsize);
|
||||
if (n < 0) {
|
||||
if (!quiet) {
|
||||
if (zp->z_type == Z_STUB)
|
||||
@ -1645,7 +1648,7 @@ receive:
|
||||
axfr_response:
|
||||
if (query_type == T_IXFR)
|
||||
if (hp->rcode != NOERROR) {
|
||||
dprintf(1,
|
||||
lprintf(1,
|
||||
"server %s did not support IXFR\n",
|
||||
inet_ntoa(sin.sin_addr));
|
||||
methode = ISNOTIXFR;
|
||||
@ -1655,7 +1658,7 @@ axfr_response:
|
||||
if (ntohs(hp->qdcount) == 1) {
|
||||
if ((query_type == T_IXFR) &&
|
||||
(methode == ISIXFR)) {
|
||||
dprintf(1,
|
||||
lprintf(1,
|
||||
"server %s rejected IXFR and responded with AXFR\n",
|
||||
inet_ntoa(sin.sin_addr));
|
||||
methode = ISNOTIXFR;
|
||||
@ -1805,10 +1808,10 @@ axfr_response:
|
||||
(void) fclose(ixfp);
|
||||
ixfp = NULL;
|
||||
}
|
||||
dprintf(2, "error receiving zone transfer\n");
|
||||
lprintf(2, "error receiving zone transfer\n");
|
||||
} else if (zp_start.z_serial == serial_no) {
|
||||
(void) my_close(s);
|
||||
dprintf(1, "zone up-to-date, serial %u\n",
|
||||
lprintf(1, "zone up-to-date, serial %u\n",
|
||||
zp_start.z_serial);
|
||||
if (ixfp) {
|
||||
(void) fclose(ixfp);
|
||||
@ -1828,7 +1831,7 @@ axfr_response:
|
||||
} else {
|
||||
if (zp_finish.z_serial == query_serial) {
|
||||
(void) my_close(s);
|
||||
dprintf(1, "zone up-to-date, serial %u\n",
|
||||
lprintf(1, "zone up-to-date, serial %u\n",
|
||||
zp_start.z_serial);
|
||||
if (ixfp) {
|
||||
(void) fclose(ixfp);
|
||||
@ -1843,7 +1846,7 @@ axfr_response:
|
||||
"serial from [%s], zone %s: %u lower than current: %u\n",
|
||||
inet_ntoa(sin.sin_addr), zp->z_origin,
|
||||
zp_finish.z_serial, query_serial);
|
||||
dprintf(1,
|
||||
lprintf(1,
|
||||
"serial from [%s], zone %s: %u lower than current: %u\n",
|
||||
inet_ntoa(sin.sin_addr), zp->z_origin,
|
||||
zp_finish.z_serial, query_serial);
|
||||
@ -1883,7 +1886,7 @@ axfr_response:
|
||||
soa_cnt = 0;
|
||||
goto axfr_response;
|
||||
}
|
||||
dprintf(1, "We have an IXFR\n");
|
||||
lprintf(1, "We have an IXFR\n");
|
||||
loop_cnt = 0;
|
||||
while (SEQ_GT(zp_finish.z_serial, serial_no)) {
|
||||
/*
|
||||
@ -2055,7 +2058,7 @@ writemsg(int rfd, const u_char *msg, int msglen) {
|
||||
u_char len[INT16SZ];
|
||||
int ret;
|
||||
|
||||
__putshort(msglen, len);
|
||||
ns_put16(msglen, len);
|
||||
iov[0].iov_base = (char *)len;
|
||||
iov[0].iov_len = INT16SZ;
|
||||
DE_CONST(msg, iov[1].iov_base);
|
||||
@ -2171,7 +2174,7 @@ print_output(struct zoneinfo *zp, u_int32_t serial_no, u_char *msg,
|
||||
}
|
||||
escaped = (*origin++ == '\\') && !escaped;
|
||||
}
|
||||
dprintf(3, "print_output: dname %s type %d class %d ttl %u\n",
|
||||
lprintf(3, "print_output: dname %s type %d class %d ttl %u\n",
|
||||
dname, type, class, ttl);
|
||||
/*
|
||||
* Convert the resource record data into the internal database format.
|
||||
@ -2430,13 +2433,13 @@ print_output(struct zoneinfo *zp, u_int32_t serial_no, u_char *msg,
|
||||
}
|
||||
|
||||
if (n > MAXDATA) {
|
||||
dprintf(1, "update type %d: %d bytes is too much data\n",
|
||||
lprintf(1, "update type %d: %d bytes is too much data\n",
|
||||
type, n);
|
||||
hp->rcode = FORMERR;
|
||||
return (-1);
|
||||
}
|
||||
if (cp != rdatap + dlen) {
|
||||
dprintf(1,
|
||||
lprintf(1,
|
||||
"encoded rdata length is %u, but actual length was %u\n",
|
||||
dlen, (u_int)(cp - rdatap));
|
||||
hp->rcode = FORMERR;
|
||||
@ -2517,10 +2520,10 @@ print_output(struct zoneinfo *zp, u_int32_t serial_no, u_char *msg,
|
||||
} else
|
||||
soa_cnt++;
|
||||
} else {
|
||||
dprintf(2, "SOA, serial %u\n",
|
||||
lprintf(2, "SOA, serial %u\n",
|
||||
zp_finish.z_serial);
|
||||
if (zp_start.z_serial != zp_finish.z_serial) {
|
||||
dprintf(1, "serial changed, restart\n");
|
||||
lprintf(1, "serial changed, restart\n");
|
||||
restarts++;
|
||||
if (restarts > MAX_XFER_RESTARTS) {
|
||||
syslog(LOG_INFO,
|
||||
@ -3190,13 +3193,13 @@ ixfr_log(const u_char *msg, int len, int *delete, FILE *file,
|
||||
ns_rr rr;
|
||||
|
||||
if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
|
||||
dprintf(1, "ixfr_log() failed\n");
|
||||
lprintf(1, "ixfr_log() failed\n");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (ns_initparse(msg, len, &handle) < 0) {
|
||||
fprintf(file, ";; ns_initparse: %s\n", strerror(errno));
|
||||
dprintf(1, "ixfr_log() failed\n");
|
||||
lprintf(1, "ixfr_log() failed\n");
|
||||
return (-1);
|
||||
}
|
||||
opcode = (ns_opcode) ns_msg_getflag(handle, ns_f_opcode);
|
||||
@ -3207,7 +3210,7 @@ ixfr_log(const u_char *msg, int len, int *delete, FILE *file,
|
||||
{
|
||||
|
||||
(void) fprintf(file,"ns_parserr() failed");
|
||||
dprintf(1, "ixfr_log() failed\n");
|
||||
lprintf(1, "ixfr_log() failed\n");
|
||||
return (-1);
|
||||
}
|
||||
type = (ns_type)rr.type;
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* from db.h 4.16 (Berkeley) 6/1/90
|
||||
* $Id: db_defs.h,v 8.47.4.1 2002/11/14 13:22:24 marka Exp $
|
||||
* $Id: db_defs.h,v 8.48 2002/11/17 14:51:50 marka Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static char rcsid[] = "$Id: db_ixfr.c,v 8.31 2002/01/02 04:47:10 marka Exp $";
|
||||
static char rcsid[] = "$Id: db_ixfr.c,v 8.32 2002/07/08 06:26:04 marka Exp $";
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -857,8 +857,9 @@ ixfr_getdelta(struct zoneinfo *zp, FILE *fp, const char *filename, char *origin,
|
||||
err++;
|
||||
break;
|
||||
}
|
||||
n = strtoul(buf, &cp, 10);
|
||||
if (n > 0xffff || *cp != '\0') {
|
||||
errno = 0;
|
||||
n = strtoul(buf, &cp, 10);
|
||||
if (errno != 0 || n > 0xffff || *cp != '\0') {
|
||||
err++;
|
||||
break;
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char sccsid[] = "@(#)db_load.c 4.38 (Berkeley) 3/2/91";
|
||||
static const char rcsid[] = "$Id: db_load.c,v 8.121 2001/11/12 21:22:22 marka Exp $";
|
||||
static const char rcsid[] = "$Id: db_load.c,v 8.123 2002/08/20 04:27:23 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -1097,8 +1097,9 @@ db_load(const char *filename, const char *in_origin,
|
||||
if (!getword(buf, sizeof buf, fp, 0) ||
|
||||
!isdigit((unsigned char)buf[0]))
|
||||
ERRTO("opaque length");
|
||||
errno = 0;
|
||||
n = strtoul(buf, &cp, 10);
|
||||
if (n > 0xffff || *cp != '\0')
|
||||
if (errno != 0 || n > 0xffff || *cp != '\0')
|
||||
ERRTO("opaque length");
|
||||
multiline = 0;
|
||||
i = isc_gethexstring(data, sizeof(data), n, fp,
|
||||
@ -1190,10 +1191,8 @@ db_load(const char *filename, const char *in_origin,
|
||||
zp->z_origin, filename, msg);
|
||||
}
|
||||
}
|
||||
errs += purge_nonglue(zp->z_origin,
|
||||
(dataflags & DB_F_HINT) ? fcachetab :
|
||||
hashtab, zp->z_class,
|
||||
zp->z_type == z_master);
|
||||
errs += purge_nonglue(zp, (dataflags & DB_F_HINT) ? fcachetab :
|
||||
hashtab, zp->z_type == z_master);
|
||||
cleanup:
|
||||
while (filenames) {
|
||||
fn = filenames;
|
||||
@ -1210,8 +1209,7 @@ db_load(const char *filename, const char *in_origin,
|
||||
p_class(zp->z_class), zp->z_serial);
|
||||
if ((zp->z_flags & Z_NOTIFY) != 0)
|
||||
ns_stopnotify(zp->z_origin, zp->z_class);
|
||||
do_reload(zp->z_origin, zp->z_type, zp->z_class,
|
||||
loading);
|
||||
do_reload(zp, loading);
|
||||
} else
|
||||
ns_info(ns_log_load,
|
||||
"%s zone \"%s\" (%s) loaded (serial %u)",
|
||||
|
@ -1,6 +1,6 @@
|
||||
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: db_sec.c,v 8.35.4.2 2002/11/14 13:24:44 marka Exp $";
|
||||
static const char rcsid[] = "$Id: db_sec.c,v 8.36 2002/11/17 14:51:50 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: ns_config.c,v 8.135 2002/05/24 03:04:59 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_config.c,v 8.136.8.1 2003/06/02 09:56:34 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -562,7 +562,7 @@ update_zone_info(struct zoneinfo *zp, struct zoneinfo *new_zp) {
|
||||
if (zp->z_source) {
|
||||
zp->z_source = freestr(zp->z_source);
|
||||
ns_stopxfrs(zp);
|
||||
purge_zone(zp->z_origin, fcachetab, zp->z_class);
|
||||
purge_zone(zp, fcachetab);
|
||||
}
|
||||
zp->z_source = new_zp->z_source;
|
||||
new_zp->z_source = NULL;
|
||||
@ -669,8 +669,7 @@ update_zone_info(struct zoneinfo *zp, struct zoneinfo *new_zp) {
|
||||
* reloading so that NS records are present
|
||||
* during the zone transfer.
|
||||
*/
|
||||
do_reload(zp->z_origin, zp->z_type,
|
||||
zp->z_class, 1);
|
||||
do_reload(zp, 1);
|
||||
}
|
||||
}
|
||||
if (zp->z_source == NULL) {
|
||||
@ -1150,6 +1149,7 @@ new_options() {
|
||||
#ifdef BIND_NOTIFY
|
||||
op->notify = notify_yes;
|
||||
#endif
|
||||
op->edns_udp_size = EDNS_MESSAGE_SZ;
|
||||
return (op);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: ns_ctl.c,v 8.47 2002/06/24 07:11:07 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_ctl.c,v 8.48 2002/07/29 02:06:56 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -1126,7 +1126,7 @@ verb_args(struct ctl_sctx *ctl, struct ctl_sess *sess,
|
||||
*/
|
||||
cp = saved_argv[pvt->argc++];
|
||||
tp = pvt->text;
|
||||
while (cp && *cp != NULL)
|
||||
while (cp && *cp != '\0')
|
||||
if (*cp == '%' || *cp == ' ' ||
|
||||
!isprint((unsigned char)*cp)) {
|
||||
if (tp >= pvt->text + sizeof(pvt->text) - 4)
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* from ns.h 4.33 (Berkeley) 8/23/90
|
||||
* $Id: ns_defs.h,v 8.121.2.1 2002/11/14 13:28:12 marka Exp $
|
||||
* $Id: ns_defs.h,v 8.124.6.1 2003/06/02 09:56:34 marka Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -450,7 +450,8 @@ struct qserv {
|
||||
struct timeval stime; /* time first query started */
|
||||
unsigned int forwarder:1; /* this entry is for a forwarder */
|
||||
unsigned int noedns:1; /* don't try edns */
|
||||
unsigned int nretry:30; /* # of times addr retried */
|
||||
unsigned int lame:1; /* this server was lame, try it last */
|
||||
unsigned int nretry:29; /* # of times addr retried */
|
||||
u_int32_t serial; /* valid if Q_ZSERIAL */
|
||||
};
|
||||
|
||||
@ -793,6 +794,7 @@ typedef struct options {
|
||||
u_int lame_ttl;
|
||||
int minroots;
|
||||
u_int16_t preferred_glue;
|
||||
u_int16_t edns_udp_size;
|
||||
enum notify notify;
|
||||
} *options;
|
||||
|
||||
@ -886,6 +888,7 @@ typedef enum ns_logging_categories {
|
||||
ns_log_load,
|
||||
ns_log_resp_checks,
|
||||
ns_log_control,
|
||||
ns_log_update_security,
|
||||
ns_log_max_category
|
||||
} ns_logging_categories;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char sccsid[] = "@(#)ns_forw.c 4.32 (Berkeley) 3/3/91";
|
||||
static const char rcsid[] = "$Id: ns_forw.c,v 8.91 2002/05/24 03:04:57 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_forw.c,v 8.92.6.1 2003/06/02 09:56:34 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -240,7 +240,8 @@ ns_forw(struct databuf *nsp[], u_char *msg, int msglen,
|
||||
|
||||
if (!qp->q_addr[0].noedns)
|
||||
smsglen += ns_add_opt(smsg, smsg + smsglen, smsgsize, 0, 0,
|
||||
EDNS_MESSAGE_SZ, 0, NULL, 0);
|
||||
server_options->edns_udp_size,
|
||||
0, NULL, 0);
|
||||
|
||||
if (key != NULL) {
|
||||
n = ns_sign(smsg, &smsglen, smsgsize, NOERROR, key, NULL, 0,
|
||||
@ -465,14 +466,14 @@ nslookup(struct databuf *nsp[], struct qinfo *qp,
|
||||
struct hashbuf *tmphtp;
|
||||
char *dname;
|
||||
const char *fname;
|
||||
int oldn, naddr, class, found_arr, potential_ns, lame_ns;
|
||||
int oldn, naddr, class, found_arr, potential_ns;
|
||||
time_t curtime;
|
||||
int found_auth6;
|
||||
|
||||
ns_debug(ns_log_default, 3, "nslookup(nsp=%p, qp=%p, \"%s\", d=%d)",
|
||||
nsp, qp, syslogdname, qp->q_distance);
|
||||
|
||||
lame_ns = potential_ns = 0;
|
||||
potential_ns = 0;
|
||||
naddr = n = qp->q_naddr;
|
||||
curtime = (u_long) tt.tv_sec;
|
||||
while ((nsdp = *nsp++) != NULL && n < NSMAX) {
|
||||
@ -492,18 +493,6 @@ nslookup(struct databuf *nsp[], struct qinfo *qp,
|
||||
}
|
||||
}
|
||||
|
||||
/* skip lame servers */
|
||||
if ((nsdp->d_flags & DB_F_LAME) != 0) {
|
||||
time_t when;
|
||||
when = db_lame_find(qp->q_domain, nsdp);
|
||||
if (when != 0 && when > tt.tv_sec) {
|
||||
ns_debug(ns_log_default, 3,
|
||||
"skipping lame NS");
|
||||
lame_ns++;
|
||||
goto skipserver;
|
||||
}
|
||||
}
|
||||
|
||||
found_arr = 0;
|
||||
found_auth6 = 0;
|
||||
tmphtp = ((nsdp->d_flags & DB_F_HINT) ?fcachetab :hashtab);
|
||||
@ -617,6 +606,13 @@ nslookup(struct databuf *nsp[], struct qinfo *qp,
|
||||
if (si && (si->flags & SERVER_INFO_EDNS) == 0)
|
||||
qs->noedns = 1;
|
||||
}
|
||||
qs->lame = 0;
|
||||
if ((nsdp->d_flags & DB_F_LAME) != 0) {
|
||||
time_t when;
|
||||
when = db_lame_find(qp->q_domain, nsdp);
|
||||
if (when != 0 && when > tt.tv_sec)
|
||||
qs->lame = 1;
|
||||
}
|
||||
qs->nretry = 0;
|
||||
/*
|
||||
* If this A RR has no RTT, initialize its RTT to a
|
||||
@ -708,15 +704,13 @@ nslookup(struct databuf *nsp[], struct qinfo *qp,
|
||||
qp->q_naddr = n;
|
||||
if (n == 0 && potential_ns == 0 && !NS_ZFWDTAB(qp->q_fzone)) {
|
||||
static const char *complaint = "No possible A RRs";
|
||||
if (lame_ns != 0)
|
||||
complaint = "All possible A RR's lame";
|
||||
if (sysloginfo && syslogdname &&
|
||||
!haveComplained((u_long)syslogdname, (u_long)complaint))
|
||||
{
|
||||
ns_info(ns_log_default, "%s: query(%s) %s",
|
||||
sysloginfo, syslogdname, complaint);
|
||||
}
|
||||
return ((lame_ns == 0) ? -1 : -2);
|
||||
return (-1);
|
||||
}
|
||||
/* Update the refcounts before the sort. */
|
||||
for (i = naddr; i < (u_int)n; i++) {
|
||||
@ -792,6 +786,11 @@ int
|
||||
qcomp(struct qserv *qs1, struct qserv *qs2) {
|
||||
u_int rtt1, rtt2, rttr1, rttr2;
|
||||
|
||||
/* sort lame servers to last */
|
||||
if (qs1->lame != qs2->lame)
|
||||
return (qs1->lame - qs2->lame);
|
||||
|
||||
/* sort by rtt */
|
||||
if (qs1->nsdata == NULL) {
|
||||
rtt1 = 0;
|
||||
rttr1 = 0;
|
||||
@ -968,6 +967,23 @@ retry(struct qinfo *qp, int samehost) {
|
||||
if (qp->q_naddr > 0) {
|
||||
qp->q_addr[n].noedns = 1;
|
||||
++qp->q_addr[n].nretry;
|
||||
/*
|
||||
* Look for a non-lame server.
|
||||
*/
|
||||
do {
|
||||
if (++n >= (int)qp->q_naddr)
|
||||
n = 0;
|
||||
if ((qp->q_flags & Q_ZSERIAL) != 0 &&
|
||||
qp->q_addr[n].serial != 0)
|
||||
continue;
|
||||
if (qp->q_addr[n].lame)
|
||||
continue;
|
||||
if (qp->q_addr[n].nretry < MAXRETRY)
|
||||
goto found;
|
||||
} while (n != qp->q_curaddr);
|
||||
/*
|
||||
* Look for any server including lame servers.
|
||||
*/
|
||||
do {
|
||||
if (++n >= (int)qp->q_naddr)
|
||||
n = 0;
|
||||
@ -1071,7 +1087,8 @@ retry(struct qinfo *qp, int samehost) {
|
||||
|
||||
if (!qp->q_addr[n].noedns)
|
||||
smsglen += ns_add_opt(smsg, smsg + smsglen, smsgsize, 0, 0,
|
||||
EDNS_MESSAGE_SZ, 0, NULL, 0);
|
||||
server_options->edns_udp_size,
|
||||
0, NULL, 0);
|
||||
|
||||
if (key != NULL) {
|
||||
n = ns_sign(smsg, &smsglen, smsgsize, NOERROR, key, NULL, 0,
|
||||
|
@ -90,7 +90,7 @@
|
||||
|
||||
/* ns_func.h - declarations for ns_*.c's externally visible functions
|
||||
*
|
||||
* $Id: ns_func.h,v 8.117 2002/04/25 05:27:07 marka Exp $
|
||||
* $Id: ns_func.h,v 8.120.8.1 2003/06/02 05:19:56 marka Exp $
|
||||
*/
|
||||
|
||||
/* ++from ns_glue.c++ */
|
||||
@ -122,7 +122,6 @@ char * __newstr_record(size_t, int, const char *, int);
|
||||
char * __savestr_record(const char *, int, const char *, int);
|
||||
u_char * ina_put(struct in_addr ina, u_char *data);
|
||||
u_char * savebuf(const u_char *, size_t, int);
|
||||
void dprintf(int level, const char *format, ...) ISC_FORMAT_PRINTF(2, 3);
|
||||
#ifdef DEBUG_STRINGS
|
||||
char * debug_newstr(size_t, int, const char *, int);
|
||||
char * debug_savestr(const char *, int, const char *, int);
|
||||
@ -167,7 +166,7 @@ int send_msg(u_char *, int, struct qinfo *);
|
||||
int findns(struct namebuf **, int,
|
||||
struct databuf **, int *, int);
|
||||
int finddata(struct namebuf *, int, int, HEADER *,
|
||||
char **, int *, int *);
|
||||
char **, int *, int *, int, int);
|
||||
int add_data(struct namebuf *,
|
||||
struct databuf **,
|
||||
u_char *, int, int *);
|
||||
@ -304,7 +303,7 @@ void ns_cleancache(evContext ctx, void *uap,
|
||||
struct timespec inter);
|
||||
void clean_cache_from(char *dname, struct hashbuf *htp);
|
||||
void remove_zone(struct zoneinfo *, const char *);
|
||||
void purge_zone(const char *, struct hashbuf *, int);
|
||||
void purge_zone(struct zoneinfo *, struct hashbuf *);
|
||||
void loadxfer(void);
|
||||
void qserial_retrytime(struct zoneinfo *, time_t);
|
||||
void qserial_query(struct zoneinfo *);
|
||||
@ -334,8 +333,8 @@ void ns_heartbeat(evContext ctx, void *uap,
|
||||
void make_new_zones(void);
|
||||
void free_zone(struct zoneinfo *);
|
||||
struct zoneinfo * find_auth_zone(const char *, ns_class);
|
||||
int purge_nonglue(const char *dname, struct hashbuf *htp,
|
||||
int class, int log);
|
||||
int purge_nonglue(struct zoneinfo *, struct hashbuf *htp,
|
||||
int log);
|
||||
/* --from ns_maint.c-- */
|
||||
|
||||
/* ++from ns_sort.c++ */
|
||||
@ -347,7 +346,6 @@ void sort_response(u_char *, u_char *, int,
|
||||
void ns_refreshtime(struct zoneinfo *, time_t);
|
||||
void ns_retrytime(struct zoneinfo *, time_t);
|
||||
time_t ns_init(const char *);
|
||||
void purgeandload(struct zoneinfo *zp);
|
||||
enum context ns_ptrcontext(const char *owner);
|
||||
enum context ns_ownercontext(int type, enum transport);
|
||||
int ns_nameok(const struct qinfo *qry, const char *name,
|
||||
@ -357,7 +355,7 @@ int ns_nameok(const struct qinfo *qry, const char *name,
|
||||
struct in_addr source);
|
||||
int ns_wildcard(const char *name);
|
||||
void zoneinit(struct zoneinfo *);
|
||||
void do_reload(const char *, int, int, int);
|
||||
void do_reload(struct zoneinfo *, int);
|
||||
void ns_shutdown(void);
|
||||
/* --from ns_init.c-- */
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* from ns.h 4.33 (Berkeley) 8/23/90
|
||||
* $Id: ns_glob.h,v 8.58 2002/06/05 04:53:50 marka Exp $
|
||||
* $Id: ns_glob.h,v 8.59 2002/07/19 22:44:08 marka Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -309,6 +309,7 @@ DECL const struct ns_sym category_constants[]
|
||||
{ ns_log_load, "load" },
|
||||
{ ns_log_resp_checks, "response-checks" },
|
||||
{ ns_log_control, "control" },
|
||||
{ ns_log_update_security, "update-security" },
|
||||
{ 0, NULL }
|
||||
}
|
||||
#endif
|
||||
|
@ -1,6 +1,6 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char sccsid[] = "@(#)ns_init.c 4.38 (Berkeley) 3/21/91";
|
||||
static const char rcsid[] = "$Id: ns_init.c,v 8.76 2001/12/19 01:41:51 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_init.c,v 8.77 2002/08/20 04:27:23 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -107,6 +107,7 @@ static const char rcsid[] = "$Id: ns_init.c,v 8.76 2001/12/19 01:41:51 marka Exp
|
||||
#ifdef DEBUG
|
||||
static void content_zone(int, int);
|
||||
#endif
|
||||
static void purgeandload(struct zoneinfo *zp);
|
||||
|
||||
/*
|
||||
* Set new refresh time for zone. Use a random number in the last half of
|
||||
@ -237,7 +238,7 @@ zoneinit(struct zoneinfo *zp) {
|
||||
result = stat(zp->z_source, &sb);
|
||||
if (result != -1) {
|
||||
ns_stopxfrs(zp);
|
||||
purge_zone(zp->z_origin, hashtab, zp->z_class);
|
||||
purge_zone(zp, hashtab);
|
||||
}
|
||||
if (result == -1 ||
|
||||
db_load(zp->z_source, zp->z_origin, zp, NULL, ISNOTIXFR))
|
||||
@ -265,8 +266,11 @@ zoneinit(struct zoneinfo *zp) {
|
||||
* delegation to that child when it was first loaded.
|
||||
*/
|
||||
void
|
||||
do_reload(const char *domain, int type, int class, int mark) {
|
||||
do_reload(struct zoneinfo *ozp, int mark) {
|
||||
struct zoneinfo *zp;
|
||||
const char *domain = ozp->z_origin;
|
||||
int type = ozp->z_type;
|
||||
int class = ozp->z_class;
|
||||
|
||||
ns_debug(ns_log_config, 1, "do_reload: %s %d %d %d",
|
||||
*domain ? domain : ".", type, class, mark);
|
||||
@ -295,9 +299,9 @@ do_reload(const char *domain, int type, int class, int mark) {
|
||||
*/
|
||||
ns_stopxfrs(zp);
|
||||
if (type == z_hint || (type == z_stub && *domain == 0))
|
||||
purge_zone(domain, fcachetab, class);
|
||||
purge_zone(ozp, fcachetab);
|
||||
else
|
||||
purge_zone(domain, hashtab, class);
|
||||
purge_zone(ozp, hashtab);
|
||||
|
||||
/*
|
||||
* Reload
|
||||
@ -326,7 +330,7 @@ do_reload(const char *domain, int type, int class, int mark) {
|
||||
domain = ""; /* root zone */
|
||||
|
||||
zp = find_zone(domain, class);
|
||||
if (zp != NULL) {
|
||||
if (zp != NULL && zp->z_type != Z_HINT) {
|
||||
ns_debug(ns_log_config, 1, "do_reload: matched %s",
|
||||
*domain ? domain : ".");
|
||||
if (mark)
|
||||
@ -338,7 +342,7 @@ do_reload(const char *domain, int type, int class, int mark) {
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
purgeandload(struct zoneinfo *zp) {
|
||||
|
||||
#ifdef BIND_UPDATE
|
||||
@ -355,9 +359,9 @@ purgeandload(struct zoneinfo *zp) {
|
||||
ns_stopxfrs(zp);
|
||||
|
||||
if (zp->z_type == Z_HINT)
|
||||
purge_zone(zp->z_origin, fcachetab, zp->z_class);
|
||||
purge_zone(zp, fcachetab);
|
||||
else
|
||||
purge_zone(zp->z_origin, hashtab, zp->z_class);
|
||||
purge_zone(zp, hashtab);
|
||||
|
||||
zp->z_flags &= ~Z_AUTH;
|
||||
|
||||
@ -563,10 +567,9 @@ ns_shutdown() {
|
||||
if (zp->z_type) {
|
||||
if (zp->z_type != z_hint && zp->z_type != z_cache) {
|
||||
ns_stopxfrs(zp);
|
||||
purge_zone(zp->z_origin, hashtab, zp->z_class);
|
||||
purge_zone(zp, hashtab);
|
||||
} else if (zp->z_type == z_hint)
|
||||
purge_zone(zp->z_origin, fcachetab,
|
||||
zp->z_class);
|
||||
purge_zone(zp, fcachetab);
|
||||
free_zone_contents(zp, 1);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: ns_ixfr.c,v 8.32 2002/05/18 01:02:57 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_ixfr.c,v 8.33 2003/02/24 23:36:01 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -408,6 +408,7 @@ ixfr_log_maint(struct zoneinfo *zp) {
|
||||
int len;
|
||||
struct stat db_sb;
|
||||
struct stat sb;
|
||||
size_t check_size;
|
||||
static char buf[MAXBSIZE];
|
||||
|
||||
ns_debug(ns_log_default, 3, "ixfr_log_maint(%s)", zp->z_origin);
|
||||
@ -443,20 +444,13 @@ ixfr_log_maint(struct zoneinfo *zp) {
|
||||
}
|
||||
ns_debug(ns_log_default, 3, "%s, size %ld max %ld\n", zp->z_ixfr_base,
|
||||
(long)sb.st_size, (long)zp->z_max_log_size_ixfr);
|
||||
if (zp->z_max_log_size_ixfr) {
|
||||
if (sb.st_size > zp->z_max_log_size_ixfr)
|
||||
seek = sb.st_size -
|
||||
(size_t)(zp->z_max_log_size_ixfr +
|
||||
(zp->z_max_log_size_ixfr * 0.10) );
|
||||
else
|
||||
seek = 0;
|
||||
} else {
|
||||
if (sb.st_size > (db_sb.st_size * 0.50))
|
||||
seek = sb.st_size - (size_t)((db_sb.st_size * 0.50)
|
||||
+ ((db_sb.st_size * zp->z_max_log_size_ixfr) * 0.10));
|
||||
else
|
||||
seek = 0;
|
||||
}
|
||||
check_size = zp->z_max_log_size_ixfr;
|
||||
if (!check_size)
|
||||
check_size = db_sb.st_size / 2;
|
||||
if (sb.st_size > check_size)
|
||||
seek = (sb.st_size - check_size) + (check_size / 10);
|
||||
else
|
||||
seek = 0;
|
||||
ns_debug(ns_log_default, 3, "seek: %ld", (long)seek);
|
||||
if (seek < 1) {
|
||||
ns_debug(ns_log_default, 3, "%s does not need to be reduced",
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: ns_lexer.c,v 8.31 2002/05/24 03:05:03 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_lexer.c,v 8.31.10.1 2003/06/02 09:56:35 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -252,6 +252,7 @@ static struct keyword keywords[] = {
|
||||
{"dump-file", T_DUMP_FILE},
|
||||
{"dynamic", T_DYNAMIC},
|
||||
{"edns", T_EDNS},
|
||||
{"edns-udp-size", T_EDNS_UDP_SIZE},
|
||||
{"explicit", T_EXPLICIT},
|
||||
{"fail", T_FAIL},
|
||||
{"fake-iquery", T_FAKE_IQUERY},
|
||||
|
@ -1,6 +1,6 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char sccsid[] = "@(#)ns_main.c 4.55 (Berkeley) 7/1/91";
|
||||
static const char rcsid[] = "$Id: ns_main.c,v 8.160 2002/06/24 07:06:55 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_main.c,v 8.162.6.2 2003/06/08 22:08:02 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -141,6 +141,10 @@ char copyright[] =
|
||||
#include "named.h"
|
||||
#undef MAIN_PROGRAM
|
||||
|
||||
#ifdef TRUCLUSTER5
|
||||
# include <clua/clua.h>
|
||||
#endif
|
||||
|
||||
typedef void (*handler)(void);
|
||||
|
||||
typedef struct _savedg {
|
||||
@ -193,7 +197,8 @@ static int sq_dowrite(struct qstream *);
|
||||
static void use_desired_debug(void);
|
||||
static void stream_write(evContext, void *, int, int);
|
||||
|
||||
static interface * if_find(struct in_addr, u_int16_t port);
|
||||
static interface * if_find(struct in_addr, u_int16_t port,
|
||||
int anyport);
|
||||
|
||||
static void deallocate_everything(void),
|
||||
stream_accept(evContext, void *, int,
|
||||
@ -825,8 +830,12 @@ stream_accept(evContext lev, void *uap, int rfd,
|
||||
sp->s_ifp = ifp;
|
||||
INSIST(sizeof sp->s_temp >= INT16SZ);
|
||||
iov = evConsIovec(sp->s_temp, INT16SZ);
|
||||
INSIST_ERR(evRead(lev, rfd, &iov, 1, stream_getlen, sp, &sp->evID_r)
|
||||
!= -1);
|
||||
if (evRead(lev, rfd, &iov, 1, stream_getlen, sp, &sp->evID_r) == -1) {
|
||||
ns_error(ns_log_default, "evRead(fd %d): %s",
|
||||
rfd, strerror(errno));
|
||||
sq_remove(sp);
|
||||
return;
|
||||
}
|
||||
sp->flags |= STREAM_READ_EV;
|
||||
ns_debug(ns_log_default, 1, "IP/TCP connection from %s (fd %d)",
|
||||
sin_ntoa(sp->s_from), rfd);
|
||||
@ -968,8 +977,12 @@ stream_write(evContext ctx, void *uap, int fd, int evmask) {
|
||||
sp->flags &= ~STREAM_WRITE_EV;
|
||||
sp->s_refcnt = 0;
|
||||
iov = evConsIovec(sp->s_temp, INT16SZ);
|
||||
INSIST_ERR(evRead(ctx, fd, &iov, 1, stream_getlen, sp, &sp->evID_r) !=
|
||||
-1);
|
||||
if (evRead(ctx, fd, &iov, 1, stream_getlen, sp, &sp->evID_r) == -1) {
|
||||
ns_error(ns_log_default, "evRead(fd %d): %s",
|
||||
fd, strerror(errno));
|
||||
sq_remove(sp);
|
||||
return;
|
||||
}
|
||||
sp->flags |= STREAM_READ_EV;
|
||||
}
|
||||
|
||||
@ -1034,9 +1047,12 @@ stream_getlen(evContext lev, void *uap, int fd, int bytes) {
|
||||
iov = evConsIovec(sp->s_buf, (sp->s_size <= sp->s_bufsize) ?
|
||||
sp->s_size : sp->s_bufsize);
|
||||
if (evRead(lev, sp->s_rfd, &iov, 1, stream_getmsg, sp, &sp->evID_r)
|
||||
== -1)
|
||||
ns_panic(ns_log_default, 1, "evRead(fd %d): %s",
|
||||
== -1) {
|
||||
ns_error(ns_log_default, "evRead(fd %d): %s",
|
||||
sp->s_rfd, strerror(errno));
|
||||
sq_remove(sp);
|
||||
return;
|
||||
}
|
||||
sp->flags |= STREAM_READ_EV;
|
||||
}
|
||||
|
||||
@ -1258,6 +1274,11 @@ getnetconf(int periodic_scan) {
|
||||
ip_match_element ime;
|
||||
u_char *mask_ptr;
|
||||
struct in_addr mask;
|
||||
#ifdef TRUCLUSTER5
|
||||
struct sockaddr clua_addr;
|
||||
int clua_cnt, clua_tot;
|
||||
#endif
|
||||
int clua_buf;
|
||||
|
||||
if (iflist_initialized) {
|
||||
if (iflist_dont_rescan)
|
||||
@ -1287,8 +1308,19 @@ getnetconf(int periodic_scan) {
|
||||
free_ip_match_list(local_networks);
|
||||
local_networks = new_ip_match_list();
|
||||
|
||||
#ifdef TRUCLUSTER5
|
||||
/* Find out how many cluster aliases there are */
|
||||
clua_cnt = 0;
|
||||
clua_tot = 0;
|
||||
while (clua_getaliasaddress(&clua_addr, &clua_cnt) == CLUA_SUCCESS)
|
||||
clua_tot ++;
|
||||
clua_buf = clua_tot * sizeof(ifreq);
|
||||
#else
|
||||
clua_buf = 0;
|
||||
#endif
|
||||
|
||||
for (;;) {
|
||||
buf = memget(bufsiz);
|
||||
buf = memget(bufsiz + clua_buf);
|
||||
if (!buf)
|
||||
ns_panic(ns_log_default, 1, "memget(interface)");
|
||||
ifc.ifc_len = bufsiz;
|
||||
@ -1323,10 +1355,29 @@ getnetconf(int periodic_scan) {
|
||||
if (bufsiz > 1000000)
|
||||
ns_panic(ns_log_default, 1,
|
||||
"get interface configuration: maximum buffer size exceeded");
|
||||
memput(buf, bufsiz);
|
||||
memput(buf, bufsiz + clua_buf);
|
||||
bufsiz += 4096;
|
||||
}
|
||||
|
||||
#ifdef TRUCLUSTER5
|
||||
/* Get the cluster aliases and create interface entries for them */
|
||||
clua_cnt = 0;
|
||||
while (clua_tot--) {
|
||||
memset(&ifreq, 0, sizeof (ifreq));
|
||||
if (clua_getaliasaddress(&ifreq.ifr_addr, &clua_cnt) !=
|
||||
CLUA_SUCCESS)
|
||||
/*
|
||||
* It is possible the count of aliases has changed; if
|
||||
* it has increased, they won't be found this pass.
|
||||
* If has decreased, stop the loop early. */
|
||||
break;
|
||||
strcpy(ifreq.ifr_name, "lo0");
|
||||
memcpy(ifc.ifc_buf + ifc.ifc_len, &ifreq, sizeof (ifreq));
|
||||
ifc.ifc_len += sizeof (ifreq);
|
||||
bufsiz += sizeof (ifreq);
|
||||
}
|
||||
#endif
|
||||
|
||||
ns_debug(ns_log_default, 2, "getnetconf: SIOCGIFCONF: ifc_len = %d",
|
||||
ifc.ifc_len);
|
||||
|
||||
@ -1398,7 +1449,7 @@ getnetconf(int periodic_scan) {
|
||||
* point interfaces, then the local address
|
||||
* may appear more than once.
|
||||
*/
|
||||
ifp = if_find(ina, li->port);
|
||||
ifp = if_find(ina, li->port, 0);
|
||||
if (ifp != NULL) {
|
||||
ns_debug(ns_log_default, 1,
|
||||
"dup interface addr [%s].%u (%s)",
|
||||
@ -1835,7 +1886,7 @@ opensocket_f() {
|
||||
* we'll notice we're in trouble if it goes away.
|
||||
*/
|
||||
ifp = if_find(server_options->query_source.sin_addr,
|
||||
server_options->query_source.sin_port);
|
||||
server_options->query_source.sin_port, 0);
|
||||
if (ifp != NULL) {
|
||||
ifp->flags |= INTERFACE_FORWARDING;
|
||||
prev_ifp = ifp;
|
||||
@ -2155,7 +2206,7 @@ sq_write(struct qstream *qs, const u_char *buf, int len) {
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
__putshort(len, qs->s_wbuf_free);
|
||||
ns_put16(len, qs->s_wbuf_free);
|
||||
qs->s_wbuf_free += NS_INT16SZ;
|
||||
memcpy(qs->s_wbuf_free, buf, len);
|
||||
qs->s_wbuf_free += len;
|
||||
@ -2196,9 +2247,12 @@ sq_done(struct qstream *sp) {
|
||||
}
|
||||
iov = evConsIovec(sp->s_temp, INT16SZ);
|
||||
if (evRead(ev, sp->s_rfd, &iov, 1, stream_getlen, sp, &sp->evID_r) ==
|
||||
-1)
|
||||
ns_panic(ns_log_default, 1, "evRead(fd %d): %s",
|
||||
-1) {
|
||||
ns_error(ns_log_default, "evRead(fd %d): %s",
|
||||
sp->s_rfd, strerror(errno));
|
||||
sq_remove(sp);
|
||||
return;
|
||||
}
|
||||
sp->flags |= STREAM_READ_EV;
|
||||
}
|
||||
|
||||
@ -2302,26 +2356,25 @@ net_mask(struct in_addr ina) {
|
||||
int
|
||||
aIsUs(struct in_addr addr) {
|
||||
|
||||
if (ina_hlong(addr) == INADDR_ANY || if_find(addr, 0) != NULL)
|
||||
if (ina_hlong(addr) == INADDR_ANY || if_find(addr, 0, 1) != NULL)
|
||||
return (1);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* interface *
|
||||
* if_find(addr, port)
|
||||
* if_find(addr, port, anyport)
|
||||
* scan our list of interface addresses for "addr" and port.
|
||||
* port == 0 means match any port
|
||||
* returns:
|
||||
* pointer to interface with this address/port, or NULL if there isn't
|
||||
* one.
|
||||
*/
|
||||
static interface *
|
||||
if_find(struct in_addr addr, u_int16_t port) {
|
||||
if_find(struct in_addr addr, u_int16_t port, int anyport) {
|
||||
interface *ifp;
|
||||
|
||||
for (ifp = HEAD(iflist); ifp != NULL; ifp = NEXT(ifp, link))
|
||||
if (ina_equal(addr, ifp->addr))
|
||||
if (port == 0 || ifp->port == port)
|
||||
if (anyport || ifp->port == port)
|
||||
break;
|
||||
return (ifp);
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char sccsid[] = "@(#)ns_maint.c 4.39 (Berkeley) 3/2/91";
|
||||
static const char rcsid[] = "$Id: ns_maint.c,v 8.136 2002/06/26 03:27:20 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_maint.c,v 8.137.8.1 2003/06/02 05:34:25 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -134,7 +134,7 @@ static void startxfer(struct zoneinfo *),
|
||||
abortxfer(struct zoneinfo *),
|
||||
purge_z_2(struct hashbuf *, int);
|
||||
static int purge_nonglue_2(const char *, struct hashbuf *,
|
||||
int, int, int);
|
||||
int, int, int, int);
|
||||
|
||||
#ifndef HAVE_SPAWNXFER
|
||||
static pid_t spawnxfer(char **, struct zoneinfo *);
|
||||
@ -181,7 +181,7 @@ zone_maint(struct zoneinfo *zp) {
|
||||
if ((zp->z_flags & Z_NOTIFY) != 0)
|
||||
ns_stopnotify(zp->z_origin, zp->z_class);
|
||||
/* calls purge_zone */
|
||||
do_reload(zp->z_origin, zp->z_type, zp->z_class, 0);
|
||||
do_reload(zp, 0);
|
||||
/* reset zone state */
|
||||
if (!haveComplained((u_long)zp, (u_long)stale)) {
|
||||
ns_notice(ns_log_default,
|
||||
@ -906,7 +906,7 @@ startxfer(struct zoneinfo *zp) {
|
||||
last = &buffer[sizeof buffer - 1]; /* leave room for \0 */
|
||||
for (i = 0; i < argc; i++) {
|
||||
len = strlen(argv[i]);
|
||||
if (curr + len + 1 >= last) {
|
||||
if (len + 1 >= last - curr) {
|
||||
ns_debug(ns_log_xfer_in, 1,
|
||||
"xfer args debug printout truncated");
|
||||
break;
|
||||
@ -1215,7 +1215,7 @@ remove_zone(struct zoneinfo *zp, const char *verb) {
|
||||
zp->z_xferpid = 0;
|
||||
ns_need(main_need_tryxfer);
|
||||
}
|
||||
do_reload(zp->z_origin, zp->z_type, zp->z_class, 1);
|
||||
do_reload(zp, 1);
|
||||
ns_notice(ns_log_config, "%s zone \"%s\" (%s) %s",
|
||||
zoneTypeString(zp->z_type), zp->z_origin,
|
||||
p_class(zp->z_class), verb);
|
||||
@ -1228,17 +1228,30 @@ remove_zone(struct zoneinfo *zp, const char *verb) {
|
||||
}
|
||||
|
||||
int
|
||||
purge_nonglue(const char *dname, struct hashbuf *htp, int class, int log) {
|
||||
purge_nonglue(struct zoneinfo *zp, struct hashbuf *htp, int log) {
|
||||
const char *dname = zp->z_origin;
|
||||
const char *fname;
|
||||
struct namebuf *np;
|
||||
struct hashbuf *phtp = htp;
|
||||
int root_zone = 0;
|
||||
int errs = 0;
|
||||
int zone = zp - zones;
|
||||
struct databuf *pdp, *dp;
|
||||
int class = zp->z_class;
|
||||
|
||||
ns_debug(ns_log_default, 1, "purge_zone(%s,%d)", dname, class);
|
||||
ns_debug(ns_log_default, 1, "purge_nonglue(%s/%d)", dname, class);
|
||||
if ((np = nlookup(dname, &phtp, &fname, 0)) && dname == fname &&
|
||||
!ns_wildcard(NAME(*np))) {
|
||||
|
||||
for (pdp = NULL, dp = np->n_data; dp != NULL; (void)NULL) {
|
||||
if (dp->d_class == class && dp->d_zone != zone)
|
||||
dp = rm_datum(dp, np, pdp, NULL);
|
||||
else {
|
||||
pdp = dp;
|
||||
dp = dp->d_next;
|
||||
}
|
||||
}
|
||||
|
||||
if (*dname == '\0')
|
||||
root_zone = 1;
|
||||
|
||||
@ -1249,7 +1262,7 @@ purge_nonglue(const char *dname, struct hashbuf *htp, int class, int log) {
|
||||
h = htp;
|
||||
else
|
||||
h = np->n_hash;
|
||||
errs += purge_nonglue_2(dname, h, class, 0, log);
|
||||
errs += purge_nonglue_2(dname, h, class, 0, log, zone);
|
||||
if (h->h_cnt == 0 && !root_zone) {
|
||||
rm_hash(np->n_hash);
|
||||
np->n_hash = NULL;
|
||||
@ -1290,7 +1303,7 @@ valid_glue(struct databuf *dp, char *name, int belowcut) {
|
||||
|
||||
static int
|
||||
purge_nonglue_2(const char *dname, struct hashbuf *htp, int class,
|
||||
int belowcut, int log)
|
||||
int belowcut, int log, int zone)
|
||||
{
|
||||
struct databuf *dp, *pdp;
|
||||
struct namebuf *np, *pnp, *npn;
|
||||
@ -1315,10 +1328,16 @@ purge_nonglue_2(const char *dname, struct hashbuf *htp, int class,
|
||||
for (pdp = NULL, dp = np->n_data;
|
||||
dp != NULL;
|
||||
(void)NULL) {
|
||||
if (dp->d_class == class &&
|
||||
zonecut &&
|
||||
int delete = 0;
|
||||
if (!zonecut &&
|
||||
dp->d_class == class &&
|
||||
dp->d_zone != zone)
|
||||
delete = 1;
|
||||
if (zonecut &&
|
||||
dp->d_class == class &&
|
||||
!valid_glue(dp, name, belowcut)) {
|
||||
if (log)
|
||||
if (log &&
|
||||
dp->d_zone == zone) {
|
||||
ns_error(ns_log_load,
|
||||
"zone: %s/%s: non-glue record %s bottom of zone: %s/%s",
|
||||
*dname ? dname : ".",
|
||||
@ -1327,11 +1346,14 @@ purge_nonglue_2(const char *dname, struct hashbuf *htp, int class,
|
||||
"at",
|
||||
*name ? name : ".",
|
||||
p_type(dp->d_type));
|
||||
errs++;
|
||||
}
|
||||
delete = 1;
|
||||
}
|
||||
if (delete)
|
||||
dp = rm_datum(dp, np, pdp,
|
||||
NULL);
|
||||
if (log)
|
||||
errs++;
|
||||
} else {
|
||||
else {
|
||||
pdp = dp;
|
||||
dp = dp->d_next;
|
||||
}
|
||||
@ -1346,7 +1368,7 @@ purge_nonglue_2(const char *dname, struct hashbuf *htp, int class,
|
||||
class,
|
||||
zonecut ||
|
||||
belowcut,
|
||||
log);
|
||||
log, zone);
|
||||
|
||||
/* if now empty, free it */
|
||||
if (np->n_hash->h_cnt == 0) {
|
||||
@ -1369,18 +1391,20 @@ purge_nonglue_2(const char *dname, struct hashbuf *htp, int class,
|
||||
}
|
||||
|
||||
void
|
||||
purge_zone(const char *dname, struct hashbuf *htp, int class) {
|
||||
purge_zone(struct zoneinfo *zp, struct hashbuf *htp) {
|
||||
const char *fname;
|
||||
struct databuf *dp, *pdp;
|
||||
struct namebuf *np;
|
||||
struct hashbuf *phtp = htp;
|
||||
int root_zone = 0;
|
||||
int zone = zp - zones;
|
||||
char *dname = zp->z_origin;
|
||||
|
||||
ns_debug(ns_log_default, 1, "purge_zone(%s,%d)", dname, class);
|
||||
ns_debug(ns_log_default, 1, "purge_zone(%s)", dname);
|
||||
if ((np = nlookup(dname, &phtp, &fname, 0)) && dname == fname &&
|
||||
!ns_wildcard(NAME(*np))) {
|
||||
for (pdp = NULL, dp = np->n_data; dp != NULL; (void)NULL) {
|
||||
if (dp->d_class == class)
|
||||
if (dp->d_zone == zone)
|
||||
dp = rm_datum(dp, np, pdp, NULL);
|
||||
else {
|
||||
pdp = dp;
|
||||
@ -1398,7 +1422,7 @@ purge_zone(const char *dname, struct hashbuf *htp, int class) {
|
||||
h = htp;
|
||||
else
|
||||
h = np->n_hash;
|
||||
purge_z_2(h, class);
|
||||
purge_z_2(h, zone);
|
||||
if (h->h_cnt == 0 && !root_zone) {
|
||||
rm_hash(np->n_hash);
|
||||
np->n_hash = NULL;
|
||||
@ -1411,10 +1435,7 @@ purge_zone(const char *dname, struct hashbuf *htp, int class) {
|
||||
}
|
||||
|
||||
static void
|
||||
purge_z_2(htp, class)
|
||||
struct hashbuf *htp;
|
||||
int class;
|
||||
{
|
||||
purge_z_2(struct hashbuf *htp, int zone) {
|
||||
struct databuf *dp, *pdp;
|
||||
struct namebuf *np, *pnp, *npn;
|
||||
struct namebuf **npp, **nppend;
|
||||
@ -1422,27 +1443,25 @@ purge_z_2(htp, class)
|
||||
nppend = htp->h_tab + htp->h_size;
|
||||
for (npp = htp->h_tab; npp < nppend; npp++) {
|
||||
for (pnp = NULL, np = *npp; np != NULL; np = npn) {
|
||||
if (!bottom_of_zone(np->n_data, class)) {
|
||||
for (pdp = NULL, dp = np->n_data;
|
||||
dp != NULL;
|
||||
(void)NULL) {
|
||||
if (dp->d_class == class)
|
||||
dp = rm_datum(dp, np, pdp,
|
||||
NULL);
|
||||
else {
|
||||
pdp = dp;
|
||||
dp = dp->d_next;
|
||||
}
|
||||
for (pdp = NULL, dp = np->n_data;
|
||||
dp != NULL;
|
||||
(void)NULL) {
|
||||
if (dp->d_zone == zone)
|
||||
dp = rm_datum(dp, np, pdp,
|
||||
NULL);
|
||||
else {
|
||||
pdp = dp;
|
||||
dp = dp->d_next;
|
||||
}
|
||||
if (np->n_hash) {
|
||||
/* call recursively to rm subdomains */
|
||||
purge_z_2(np->n_hash, class);
|
||||
}
|
||||
if (np->n_hash) {
|
||||
/* call recursively to rm subdomains */
|
||||
purge_z_2(np->n_hash, zone);
|
||||
|
||||
/* if now empty, free it */
|
||||
if (np->n_hash->h_cnt == 0) {
|
||||
rm_hash(np->n_hash);
|
||||
np->n_hash = NULL;
|
||||
}
|
||||
/* if now empty, free it */
|
||||
if (np->n_hash->h_cnt == 0) {
|
||||
rm_hash(np->n_hash);
|
||||
np->n_hash = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1804,12 +1823,12 @@ loadxfer(void) {
|
||||
isixfr = ISIXFR;
|
||||
} else {
|
||||
tmpnom = zp->z_source;
|
||||
purge_zone(zp->z_origin, hashtab, zp->z_class);
|
||||
purge_zone(zp, hashtab);
|
||||
isixfr = ISNOTIXFR;
|
||||
}
|
||||
if (zp->z_xferpid == XFER_ISAXFRIXFR) {
|
||||
tmpnom= zp->z_source;
|
||||
purge_zone(zp->z_origin, hashtab, zp->z_class);
|
||||
purge_zone(zp, hashtab);
|
||||
isixfr = ISNOTIXFR;
|
||||
}
|
||||
|
||||
@ -1892,7 +1911,7 @@ reload_master(struct zoneinfo *zp) {
|
||||
(zp->z_flags & Z_NEED_DUMP) != 0))
|
||||
(void) zonedump(zp, ISNOTIXFR);
|
||||
#endif
|
||||
purge_zone(zp->z_origin, hashtab, zp->z_class);
|
||||
purge_zone(zp, hashtab);
|
||||
ns_debug(ns_log_config, 1, "reloading zone");
|
||||
#ifdef BIND_UPDATE
|
||||
if ((zp->z_flags & Z_DYNAMIC) != 0) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: ns_ncache.c,v 8.29.4.1 2002/11/14 13:41:31 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_ncache.c,v 8.30 2002/11/17 14:51:51 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
|
@ -1,6 +1,6 @@
|
||||
%{
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static char rcsid[] = "$Id: ns_parser.y,v 8.80 2002/05/24 03:05:01 marka Exp $";
|
||||
static char rcsid[] = "$Id: ns_parser.y,v 8.81.8.1 2003/06/02 09:56:35 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -158,6 +158,7 @@ int yyparse();
|
||||
%token T_MAX_NCACHE_TTL T_HAS_OLD_CLIENTS T_RFC2308_TYPE1
|
||||
%token T_LAME_TTL T_MIN_ROOTS
|
||||
%token T_TREAT_CR_AS_SPACE
|
||||
%token T_EDNS_UDP_SIZE
|
||||
|
||||
/* Items used for the "logging" statement: */
|
||||
%token T_LOGGING T_CATEGORY T_CHANNEL T_SEVERITY T_DYNAMIC
|
||||
@ -609,6 +610,16 @@ option: /* Empty */
|
||||
if ($2 >= 1)
|
||||
current_options->minroots = $2;
|
||||
}
|
||||
|
|
||||
| T_EDNS_UDP_SIZE L_NUMBER
|
||||
{
|
||||
if ($2 < 512)
|
||||
current_options->edns_udp_size = 512;
|
||||
else if ($2 > EDNS_MESSAGE_SZ)
|
||||
current_options->edns_udp_size = EDNS_MESSAGE_SZ;
|
||||
else
|
||||
current_options->edns_udp_size = $2;
|
||||
}
|
||||
| error
|
||||
;
|
||||
|
||||
@ -711,6 +722,7 @@ ordering_type: /* nothing */
|
||||
}
|
||||
(void)freestr($2);
|
||||
}
|
||||
;
|
||||
|
||||
ordering_name: /* nothing */
|
||||
{
|
||||
@ -726,7 +738,7 @@ ordering_name: /* nothing */
|
||||
}
|
||||
/* XXX Should do any more name validation here? */
|
||||
}
|
||||
|
||||
;
|
||||
|
||||
rrset_ordering_element: ordering_class ordering_type ordering_name T_ORDER L_STRING
|
||||
{
|
||||
@ -749,7 +761,7 @@ rrset_ordering_element: ordering_class ordering_type ordering_name T_ORDER L_STR
|
||||
$$ = new_rrset_order_element($1, $2, $3, o);
|
||||
}
|
||||
}
|
||||
|
||||
;
|
||||
|
||||
transfer_format: T_ONE_ANSWER
|
||||
{
|
||||
@ -1434,7 +1446,7 @@ key_list: key_list_element L_EOS
|
||||
| error
|
||||
;
|
||||
|
||||
dummy_key_list_element: key_ref;
|
||||
dummy_key_list_element: key_ref { /* empty */ } ;
|
||||
|
||||
dummy_key_list: dummy_key_list_element L_EOS
|
||||
| dummy_key_list dummy_key_list_element L_EOS
|
||||
|
@ -1,6 +1,6 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char sccsid[] = "@(#)ns_req.c 4.47 (Berkeley) 7/1/91";
|
||||
static const char rcsid[] = "$Id: ns_req.c,v 8.169.2.1 2002/11/14 13:02:48 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_req.c,v 8.175.6.2 2003/06/02 09:56:35 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -563,8 +563,9 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
|
||||
ns_name_rollback(cp, (const u_char **)dnptrs,
|
||||
(const u_char **)dnptrs_end);
|
||||
if (opt > 0) {
|
||||
n = ns_add_opt(msg, cp, buflen_orig, 0,
|
||||
rcode, EDNS_MESSAGE_SZ, 0, NULL, 0);
|
||||
n = ns_add_opt(msg, cp, buflen_orig, 0, rcode,
|
||||
server_options->edns_udp_size,
|
||||
0, NULL, 0);
|
||||
if (n < 0) {
|
||||
hp->qdcount = htons(0);
|
||||
goto sign_again;
|
||||
@ -604,8 +605,9 @@ ns_req(u_char *msg, int msglen, int buflen, struct qstream *qsp,
|
||||
msglen += n;
|
||||
if (opt > 0) {
|
||||
buflen += opt_size;
|
||||
n = ns_add_opt(msg, cp, msglen + buflen, 0,
|
||||
rcode, EDNS_MESSAGE_SZ, 0, NULL, 0);
|
||||
n = ns_add_opt(msg, cp, msglen + buflen, 0, rcode,
|
||||
server_options->edns_udp_size,
|
||||
0, NULL, 0);
|
||||
INSIST(n > 0);
|
||||
cp += n;
|
||||
buflen -= n;
|
||||
@ -856,6 +858,9 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
|
||||
DST_KEY *in_key = (in_tsig != NULL) ? in_tsig->key : NULL;
|
||||
int access_class;
|
||||
int adjustlen = 0;
|
||||
int pass = 0;
|
||||
char tsig_keyname_mesg[15+MAXDNAME] = "";
|
||||
int glueok;
|
||||
|
||||
nameserIncr(from.sin_addr, nssRcvdQ);
|
||||
|
||||
@ -900,7 +905,6 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
|
||||
return (Finish);
|
||||
}
|
||||
*cpp += n;
|
||||
answers = *cpp;
|
||||
if (*cpp + 2 * INT16SZ > eom) {
|
||||
ns_debug(ns_log_default, 1,
|
||||
"FORMERR Query message length short");
|
||||
@ -1017,6 +1021,7 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
|
||||
#endif /*QRYLOG*/
|
||||
|
||||
try_again:
|
||||
pass++;
|
||||
foundname = 0;
|
||||
ns_debug(ns_log_default, 1, "req: nlookup(%s) id %d type=%d class=%d",
|
||||
dname, ntohs(hp->id), type, class);
|
||||
@ -1303,13 +1308,19 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
|
||||
return (Refuse);
|
||||
}
|
||||
|
||||
if (type == ns_t_ixfr) {
|
||||
ns_info(ns_log_security, "approved %s from %s for \"%s\"",
|
||||
(ixfr_found) ? p_type(type) : "IXFR/AXFR",
|
||||
sin_ntoa(from), *dname ? dname : ".");
|
||||
} else
|
||||
ns_info(ns_log_security, "approved %s from %s for \"%s\"",
|
||||
p_type(type), sin_ntoa(from), *dname ? dname : ".");
|
||||
if (in_key != NULL)
|
||||
sprintf(tsig_keyname_mesg, " (TSIG key \"%s\")",
|
||||
in_key->dk_key_name);
|
||||
|
||||
if (type == ns_t_ixfr)
|
||||
ns_info(ns_log_security, "approved %s from %s for \"%s\"%s",
|
||||
(ixfr_found) ? p_type(type) : "IXFR/AXFR",
|
||||
sin_ntoa(from), *dname ? dname : ".",
|
||||
tsig_keyname_mesg);
|
||||
else
|
||||
ns_info(ns_log_security, "approved %s from %s for \"%s\"%s",
|
||||
p_type(type), sin_ntoa(from), *dname ? dname : ".",
|
||||
tsig_keyname_mesg);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1354,7 +1365,7 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
|
||||
(dp->d_class == class)) {
|
||||
#ifdef RETURNSOA
|
||||
n = finddata(np, class, T_SOA, hp, &dname,
|
||||
buflenp, &count);
|
||||
buflenp, &count, pass, 1);
|
||||
if (n != 0) {
|
||||
if (count) {
|
||||
*cpp += n;
|
||||
@ -1392,8 +1403,9 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
|
||||
* If not NXDOMAIN, the NOERROR_NODATA record might be
|
||||
* anywhere in the chain. Have to go through the grind.
|
||||
*/
|
||||
|
||||
n = finddata(np, class, type, hp, &dname, buflenp, &count);
|
||||
glueok = !NS_OPTION_P(OPTION_NORECURSE);
|
||||
n = finddata(np, class, type, hp, &dname, buflenp, &count, pass,
|
||||
glueok);
|
||||
if (n == 0) {
|
||||
/*
|
||||
* NO data available. Refuse transfer requests, or
|
||||
@ -1509,7 +1521,8 @@ req_query(HEADER *hp, u_char **cpp, u_char *eom, struct qstream *qsp,
|
||||
ns_debug(ns_log_default, 3, "req: leaving (%s, rcode %d)",
|
||||
dname, hp->rcode);
|
||||
if (class != C_ANY) {
|
||||
hp->aa = 1;
|
||||
if (!cname)
|
||||
hp->aa = 1;
|
||||
if (np && (!foundname || !founddata)) {
|
||||
n = doaddauth(hp, *cpp, *buflenp, np, nsp[0]);
|
||||
*cpp += n;
|
||||
@ -2323,9 +2336,9 @@ doaddinfo(HEADER *hp, u_char *msg, int msglen) {
|
||||
loop:
|
||||
for (ap = addinfo, i = 0; i < addcount; ap++, i++) {
|
||||
int auth = 0,
|
||||
drop = 0,
|
||||
founda = 0,
|
||||
foundaaaa = 0,
|
||||
founda6 = 0,
|
||||
foundcname = 0,
|
||||
save_count = count,
|
||||
save_msglen = msglen;
|
||||
@ -2353,12 +2366,11 @@ loop:
|
||||
if (dp->d_class != ap->a_class)
|
||||
continue;
|
||||
if (dp->d_rcode == NXDOMAIN) {
|
||||
founda = founda6 = foundaaaa = 1;
|
||||
founda = foundaaaa = 1;
|
||||
continue;
|
||||
}
|
||||
switch (dp->d_type) {
|
||||
case ns_t_a: founda = 1; break;
|
||||
case ns_t_a6: founda6 = 1; break;
|
||||
case ns_t_aaaa: foundaaaa = 1; break;
|
||||
}
|
||||
if (!dp->d_rcode && dp->d_type == T_CNAME) {
|
||||
@ -2366,8 +2378,7 @@ loop:
|
||||
break;
|
||||
}
|
||||
if (auth == 0 && ap->a_type == T_A &&
|
||||
(dp->d_type == ns_t_a || dp->d_type == ns_t_a6 ||
|
||||
dp->d_type == ns_t_aaaa) &&
|
||||
(dp->d_type == ns_t_a || dp->d_type == ns_t_aaaa) &&
|
||||
(zones[dp->d_zone].z_type == z_master ||
|
||||
zones[dp->d_zone].z_type == z_slave))
|
||||
auth = 1;
|
||||
@ -2385,8 +2396,7 @@ loop:
|
||||
}
|
||||
if (ap->a_type == T_A &&
|
||||
!match(dp, (int)ap->a_class, T_A) &&
|
||||
!match(dp, (int)ap->a_class, T_AAAA) &&
|
||||
!match(dp, (int)ap->a_class, ns_t_a6)) {
|
||||
!match(dp, (int)ap->a_class, T_AAAA)) {
|
||||
continue;
|
||||
}
|
||||
if (ap->a_type == T_KEY &&
|
||||
@ -2397,6 +2407,8 @@ loop:
|
||||
continue;
|
||||
if (dp->d_rcode)
|
||||
continue;
|
||||
if (drop)
|
||||
continue;
|
||||
/*
|
||||
* Should be smart and eliminate duplicate
|
||||
* data here. XXX
|
||||
@ -2426,7 +2438,14 @@ loop:
|
||||
cp = save_cp;
|
||||
msglen = save_msglen;
|
||||
count = save_count;
|
||||
break;
|
||||
/*
|
||||
* Continue processing list to prevent
|
||||
* unnecessary fetches for glue.
|
||||
* Prevent partial RRsets being sent by
|
||||
* setting drop.
|
||||
*/
|
||||
drop = 1;
|
||||
continue;
|
||||
}
|
||||
ns_debug(ns_log_default, 5,
|
||||
"addinfo: adding address data n = %d", n);
|
||||
@ -2446,10 +2465,6 @@ loop:
|
||||
(void) sysquery(ap->a_dname, (int)ap->a_class,
|
||||
ns_t_aaaa, NULL, NULL, 0,
|
||||
ns_port, QUERY, 0);
|
||||
if (!founda6 && !auth)
|
||||
(void) sysquery(ap->a_dname, (int)ap->a_class,
|
||||
ns_t_a6, NULL, NULL, 0, ns_port,
|
||||
QUERY, 0);
|
||||
}
|
||||
if (foundcname) {
|
||||
if (!haveComplained(nhash(ap->a_dname),
|
||||
|
@ -1,6 +1,6 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char sccsid[] = "@(#)ns_resp.c 4.65 (Berkeley) 3/3/91";
|
||||
static const char rcsid[] = "$Id: ns_resp.c,v 8.178.2.2 2002/11/14 13:39:13 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_resp.c,v 8.186.6.4 2003/06/02 09:56:35 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -270,7 +270,6 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
|
||||
int i, c, n, qdcount, ancount, aucount, nscount, arcount, arfirst;
|
||||
int soacount;
|
||||
u_int qtype, qclass;
|
||||
int restart; /* flag for processing cname response */
|
||||
int validanswer, dbflags;
|
||||
int cname, lastwascname, externalcname;
|
||||
int count, founddata, foundname;
|
||||
@ -281,7 +280,7 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
|
||||
char *dname, tmpdomain[MAXDNAME];
|
||||
const char *fname;
|
||||
const char *formerrmsg = "brain damage";
|
||||
u_char newmsg[EDNS_MESSAGE_SZ];
|
||||
u_char newmsg[NS_MAXMSG];
|
||||
u_char **dpp, *tp;
|
||||
time_t rtrip;
|
||||
struct hashbuf *htp;
|
||||
@ -298,6 +297,7 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
|
||||
time_t tsig_time;
|
||||
DST_KEY *key;
|
||||
int expect_cname;
|
||||
int pass = 0;
|
||||
|
||||
nameserIncr(from.sin_addr, nssRcvdR);
|
||||
nsp[0] = NULL;
|
||||
@ -905,7 +905,6 @@ tcp_retry:
|
||||
|
||||
tp = cp;
|
||||
|
||||
restart = 0;
|
||||
validanswer = -1;
|
||||
nscount = 0;
|
||||
soacount = 0;
|
||||
@ -1001,6 +1000,10 @@ tcp_retry:
|
||||
tname = NULL;
|
||||
}
|
||||
|
||||
/* Cache for current tick. */
|
||||
if (type == T_SOA)
|
||||
dp->d_ttl = tt.tv_sec;
|
||||
|
||||
dp->d_cred = (hp->aa && ns_samename(name, qname) == 1)
|
||||
? DB_C_AUTH
|
||||
: DB_C_ANSWER;
|
||||
@ -1048,6 +1051,9 @@ tcp_retry:
|
||||
}
|
||||
if (type == T_SOA) {
|
||||
soacount++;
|
||||
/* -ve caching only. */
|
||||
db_detach(&dp);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
case T_NXT:
|
||||
@ -1182,38 +1188,6 @@ tcp_retry:
|
||||
return;
|
||||
}
|
||||
|
||||
if (ancount && count && validanswer != 1) {
|
||||
/*
|
||||
* Everything passed validation but we didn't get the
|
||||
* final answer. The response must have contained
|
||||
* a dangling CNAME. Force a restart of the query.
|
||||
*
|
||||
* Don't set restart if count==0, since this means
|
||||
* the response was truncated in the answer section,
|
||||
* causing us to set count to 0 which will cause
|
||||
* validanswer to be 0 as well even though the answer
|
||||
* section probably contained valid RRs (just not
|
||||
* a complete set).
|
||||
* XXX - this works right if we can just forward this
|
||||
* response to the client, but not if we found a CNAME
|
||||
* in a prior response and restarted the query.
|
||||
*/
|
||||
restart = 1;
|
||||
}
|
||||
|
||||
if (!restart && !qp->q_cmsglen && ancount > 1 && qtype == T_A)
|
||||
sort_response(tp, eom, ancount, &qp->q_from);
|
||||
|
||||
/*
|
||||
* An answer to a T_ANY query or a successful answer to a
|
||||
* regular query with no indirection, then just return answer.
|
||||
*/
|
||||
if (!restart && ancount && (qtype == T_ANY || !qp->q_cmsglen)) {
|
||||
ns_debug(ns_log_default, 3,
|
||||
"resp: got as much answer as there is");
|
||||
goto return_msg;
|
||||
}
|
||||
|
||||
/*
|
||||
* We might want to cache this negative answer.
|
||||
*
|
||||
@ -1289,11 +1263,20 @@ tcp_retry:
|
||||
goto servfail;
|
||||
}
|
||||
cp += n + QFIXEDSZ;
|
||||
buflen = sizeof(newmsg) - (cp - newmsg);
|
||||
|
||||
buflen = (qp->q_stream != NULL) ? NS_MAXMSG :
|
||||
MIN(EDNS_MESSAGE_SZ, qp->q_udpsize);
|
||||
buflen -= (cp - newmsg);
|
||||
/*
|
||||
* Reserve space for TSIG / EDNS
|
||||
*/
|
||||
if (qp->q_tsig != NULL)
|
||||
buflen -= qp->q_tsig->tsig_size;
|
||||
if ((qp->q_flags & Q_EDNS) != 0)
|
||||
buflen -= 11;
|
||||
cname = 0;
|
||||
|
||||
try_again:
|
||||
pass++;
|
||||
ns_debug(ns_log_default, 1, "resp: nlookup(%s) qtype=%d", dname,
|
||||
qtype);
|
||||
foundname = 0;
|
||||
@ -1316,7 +1299,7 @@ tcp_retry:
|
||||
(dp->d_class == (int)qclass)) {
|
||||
#ifdef RETURNSOA
|
||||
n = finddata(np, qclass, T_SOA, hp, &dname,
|
||||
&buflen, &count);
|
||||
&buflen, &count, pass, 1);
|
||||
if ( n != 0) {
|
||||
if (count) {
|
||||
cp += n;
|
||||
@ -1348,7 +1331,7 @@ tcp_retry:
|
||||
goto fetch_ns;
|
||||
}
|
||||
}
|
||||
n = finddata(np, qclass, qtype, hp, &dname, &buflen, &count);
|
||||
n = finddata(np, qclass, qtype, hp, &dname, &buflen, &count, pass, 1);
|
||||
if (n == 0)
|
||||
goto fetch_ns; /* NO data available */
|
||||
if (hp->rcode) {
|
||||
@ -1399,7 +1382,8 @@ tcp_retry:
|
||||
if (!foundname)
|
||||
hp->rcode = NXDOMAIN;
|
||||
if (qclass != C_ANY) {
|
||||
hp->aa = 1;
|
||||
if (!cname)
|
||||
hp->aa = 1;
|
||||
if (np && (!foundname || !founddata)) {
|
||||
n = doaddauth(hp, cp, buflen, np, nsp[0]);
|
||||
cp += n;
|
||||
@ -1553,7 +1537,8 @@ tcp_retry:
|
||||
|
||||
if (!qp->q_addr[0].noedns)
|
||||
smsglen += ns_add_opt(smsg, smsg + smsglen, smsgsize, 0, 0,
|
||||
EDNS_MESSAGE_SZ, 0, NULL, 0);
|
||||
server_options->edns_udp_size,
|
||||
0, NULL, 0);
|
||||
if (key != NULL) {
|
||||
n = ns_sign(smsg, &smsglen, smsgsize, NOERROR, key, NULL, 0,
|
||||
sig, &siglen, 0);
|
||||
@ -2239,7 +2224,7 @@ send_msg(u_char *msg, int msglen, struct qinfo *qp) {
|
||||
if (qp->q_flags & Q_SYSTEM)
|
||||
return (1);
|
||||
|
||||
trunc = (qp->q_stream != NULL) ? 65535 : qp->q_udpsize;
|
||||
trunc = (qp->q_stream != NULL) ? NS_MAXMSG : qp->q_udpsize;
|
||||
if (qp->q_tsig != NULL)
|
||||
adjust += qp->q_tsig->tsig_size;
|
||||
if ((qp->q_flags & Q_EDNS) != 0)
|
||||
@ -2283,8 +2268,9 @@ send_msg(u_char *msg, int msglen, struct qinfo *qp) {
|
||||
msgsize = msglen; /* silence compiler */
|
||||
|
||||
if ((qp->q_flags & Q_EDNS) != 0)
|
||||
msglen += ns_add_opt(msg, msg + msglen, msgsize, 0,
|
||||
hp->rcode, EDNS_MESSAGE_SZ, 0, NULL, 0);
|
||||
msglen += ns_add_opt(msg, msg + msglen, msgsize, 0, hp->rcode,
|
||||
server_options->edns_udp_size,
|
||||
0, NULL, 0);
|
||||
|
||||
if (qp->q_tsig != NULL) {
|
||||
u_char sig[TSIG_SIG_SIZE];
|
||||
@ -2492,6 +2478,7 @@ sysquery(const char *dname, int class, int type,
|
||||
qs->stime = tt;
|
||||
qs->forwarder = 0;
|
||||
qs->noedns = 1; /* XXXMPA */
|
||||
qs->lame = 0;
|
||||
qs->nretry = 0;
|
||||
}
|
||||
qp->q_naddr = nsc;
|
||||
@ -2581,7 +2568,8 @@ sysquery(const char *dname, int class, int type,
|
||||
|
||||
if (!qp->q_addr[0].noedns)
|
||||
smsglen += ns_add_opt(smsg, smsg + smsglen, smsgsize, 0, 0,
|
||||
EDNS_MESSAGE_SZ, 0, NULL, 0);
|
||||
server_options->edns_udp_size,
|
||||
0, NULL, 0);
|
||||
|
||||
if (key != NULL) {
|
||||
n = ns_sign(smsg, &smsglen, smsgsize, NOERROR, key, NULL, 0,
|
||||
@ -2908,7 +2896,8 @@ findns(struct namebuf **npp, int class,
|
||||
}
|
||||
ns_debug(ns_log_default, 1,
|
||||
"findns: No root nameservers for class %s?", p_class(class));
|
||||
if ((unsigned)class < MAXCLASS && norootlogged[class] == 0) {
|
||||
if (!NS_OPTION_P(OPTION_FORWARD_ONLY) &&
|
||||
(unsigned)class < MAXCLASS && norootlogged[class] == 0) {
|
||||
norootlogged[class] = 1;
|
||||
ns_info(ns_log_default, "No root nameservers for class %s",
|
||||
p_class(class));
|
||||
@ -2924,7 +2913,8 @@ findns(struct namebuf **npp, int class,
|
||||
*/
|
||||
int
|
||||
finddata(struct namebuf *np, int class, int type,
|
||||
HEADER *hp, char **dnamep, int *lenp, int *countp)
|
||||
HEADER *hp, char **dnamep, int *lenp, int *countp, int pass,
|
||||
int glueok)
|
||||
{
|
||||
struct databuf *dp;
|
||||
char *cp;
|
||||
@ -2962,18 +2952,8 @@ finddata(struct namebuf *np, int class, int type,
|
||||
cp = ((char *)hp) + *countp;
|
||||
foundcname = 0;
|
||||
for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
|
||||
if (!wanted(dp, class, type)) {
|
||||
if (type == T_CNAME && class == dp->d_class) {
|
||||
/* any data means no CNAME exists */
|
||||
if (dp->d_type != T_NXT &&
|
||||
dp->d_type != T_KEY &&
|
||||
dp->d_type != T_SIG) {
|
||||
ret = 0;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
if (!wanted(dp, class, type))
|
||||
continue;
|
||||
}
|
||||
if (dp->d_cred == DB_C_ADDITIONAL) {
|
||||
#ifdef NOADDITIONAL
|
||||
continue;
|
||||
@ -3003,7 +2983,7 @@ finddata(struct namebuf *np, int class, int type,
|
||||
*dnamep, type, class);
|
||||
continue;
|
||||
}
|
||||
if (type == T_ANY)
|
||||
if (type == T_ANY && dp->d_type != T_ANY)
|
||||
continue;
|
||||
hp->rcode = NOERROR_NODATA;
|
||||
if (dp->d_size == 0) { /* !RETURNSOA */
|
||||
@ -3038,6 +3018,10 @@ finddata(struct namebuf *np, int class, int type,
|
||||
(!((dp->d_type == T_SIG) || (dp->d_type == T_KEY))) )
|
||||
continue;
|
||||
|
||||
/* Don't return glue (NS/A/AAAA) */
|
||||
if (!glueok && findMyZone(np, class) == DB_Z_CACHE)
|
||||
continue;
|
||||
|
||||
if (!defer) {
|
||||
if (foundcname != 0 && dp->d_type == T_CNAME)
|
||||
continue;
|
||||
@ -3056,6 +3040,16 @@ finddata(struct namebuf *np, int class, int type,
|
||||
|
||||
if (dp->d_type == T_CNAME) {
|
||||
foundcname = 1;
|
||||
|
||||
#define SETAA(pass, class, dp) \
|
||||
(pass == 1 && class != C_ANY && dp->d_zone != DB_Z_CACHE && \
|
||||
(zones[dp->d_zone].z_type == z_master || \
|
||||
zones[dp->d_zone].z_type == z_slave) && \
|
||||
(zones[dp->d_zone].z_flags & Z_AUTH) != 0)
|
||||
|
||||
if (SETAA(pass, class, dp))
|
||||
hp->aa = 1;
|
||||
|
||||
#define FOLLOWCNAME(type) \
|
||||
(type != T_KEY) && (type != T_SIG) && (type != T_NXT) && (type != T_ANY)
|
||||
/* don't alias if querying for key, sig, nxt, or any */
|
||||
@ -3064,8 +3058,13 @@ finddata(struct namebuf *np, int class, int type,
|
||||
new_dnamep = (char *)dp->d_data;
|
||||
}
|
||||
} else {
|
||||
if (dp->d_type == T_CNAME)
|
||||
if (dp->d_type == T_CNAME) {
|
||||
foundcname = 1;
|
||||
|
||||
if (SETAA(pass, class, dp))
|
||||
hp->aa = 1;
|
||||
|
||||
}
|
||||
found[found_count++] = dp;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: ns_update.c,v 8.104 2002/05/18 01:02:59 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_update.c,v 8.106 2002/07/19 22:44:07 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -1211,7 +1211,7 @@ req_update_private(HEADER *hp, u_char *cp, u_char *eom, u_char *msg,
|
||||
*/
|
||||
|
||||
if (!ip_addr_or_key_allowed(zp->z_update_acl, from.sin_addr, in_key)) {
|
||||
ns_notice(ns_log_security,
|
||||
ns_notice(ns_log_update_security,
|
||||
"denied update from %s for \"%s\" %s",
|
||||
sin_ntoa(from), *dname ? dname : ".", p_class(class));
|
||||
nameserIncr(from.sin_addr, nssRcvdUUpd);
|
||||
@ -2638,8 +2638,10 @@ merge_logs(struct zoneinfo *zp, char *logname) {
|
||||
err++;
|
||||
break;
|
||||
}
|
||||
errno = 0;
|
||||
n = strtoul(buf, &cp, 10);
|
||||
if (n > 0xffff || *cp != '\0') {
|
||||
if (errno != 0 || n > 0xffff ||
|
||||
*cp != '\0') {
|
||||
err++;
|
||||
break;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: ndc.c,v 1.22 2002/06/24 07:28:55 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ndc.c,v 1.25 2003/04/03 05:42:10 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -88,7 +88,7 @@ static void start_named(const char *, int);
|
||||
static int fgetpid(const char *, pid_t *);
|
||||
static int get_sockaddr(const char *, sockaddr_t *);
|
||||
static size_t impute_addrlen(const struct sockaddr *);
|
||||
static void vtrace(const char *, va_list);
|
||||
static void vtrace(const char *, va_list) ISC_FORMAT_PRINTF(1, 0);
|
||||
static void trace(const char *, ...) ISC_FORMAT_PRINTF(1, 2);
|
||||
static void result(const char *, ...) ISC_FORMAT_PRINTF(1, 2);
|
||||
static void fatal(const char *, ...) ISC_FORMAT_PRINTF(1, 2);
|
||||
@ -283,7 +283,7 @@ getargs_closure(void *arg, const char *msg, int flags) {
|
||||
}
|
||||
len = 0;
|
||||
cp = msg + 4;
|
||||
while (*cp != NULL) {
|
||||
while (*cp != '\0') {
|
||||
c = *cp;
|
||||
if (c == '%') {
|
||||
cp2 = strchr(hexdigits, cp[1]);
|
||||
@ -325,7 +325,7 @@ getargs_closure(void *arg, const char *msg, int flags) {
|
||||
}
|
||||
cp = msg + 4;
|
||||
tp = argv->argv[i];
|
||||
while (*cp != NULL) {
|
||||
while (*cp != '\0') {
|
||||
c = *cp;
|
||||
if (c == '%') {
|
||||
cp2 = strchr(hexdigits, cp[1]);
|
||||
@ -374,6 +374,8 @@ get_args(char **restp) {
|
||||
len = 0;
|
||||
for (i = 1 ; i < argv.argc && argv.argv[i] != NULL; i++)
|
||||
len += strlen(argv.argv[i]) + 1;
|
||||
if (len == 0)
|
||||
len = 1;
|
||||
rest = malloc(len);
|
||||
if (rest == NULL) {
|
||||
result = 0;
|
||||
@ -386,7 +388,8 @@ get_args(char **restp) {
|
||||
*p++ = ' ';
|
||||
}
|
||||
if (p != rest)
|
||||
p[-1] = '\0';
|
||||
p--;
|
||||
p[0] = '\0';
|
||||
*restp = rest;
|
||||
|
||||
err:
|
||||
|
@ -53,7 +53,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)getinfo.c 5.26 (Berkeley) 3/21/91";
|
||||
static const char rcsid[] = "$Id: getinfo.c,v 8.27 2002/05/22 04:06:57 marka Exp $";
|
||||
static const char rcsid[] = "$Id: getinfo.c,v 8.29.8.2 2003/06/02 09:24:39 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -111,7 +111,7 @@ ServerTable server[MAXSERVERS];
|
||||
|
||||
typedef union {
|
||||
HEADER qb1;
|
||||
u_char qb2[64*1024];
|
||||
u_char qb2[NS_MAXMSG];
|
||||
} querybuf;
|
||||
|
||||
typedef union {
|
||||
@ -149,14 +149,14 @@ GetAnswer(union res_sockaddr_union *nsAddrPtr, int queryType,
|
||||
register const u_char *cp;
|
||||
querybuf answer;
|
||||
char **aliasPtr;
|
||||
u_char *eom, *bp;
|
||||
u_char *eom, *bp, *ep;
|
||||
char **addrPtr;
|
||||
int *lenPtr;
|
||||
int *typePtr;
|
||||
char *namePtr;
|
||||
char *dnamePtr;
|
||||
int type, class;
|
||||
int qdcount, ancount, arcount, nscount, buflen;
|
||||
int qdcount, ancount, arcount, nscount;
|
||||
int origClass = 0;
|
||||
int numAliases = 0;
|
||||
int numAddresses = 0;
|
||||
@ -211,9 +211,9 @@ GetAnswer(union res_sockaddr_union *nsAddrPtr, int queryType,
|
||||
}
|
||||
|
||||
|
||||
bp = hostbuf;
|
||||
buflen = sizeof(hostbuf);
|
||||
cp = (u_char *) &answer + HFIXEDSZ;
|
||||
bp = hostbuf;
|
||||
ep = hostbuf + sizeof(hostbuf);
|
||||
cp = (u_char *) &answer + HFIXEDSZ;
|
||||
|
||||
/* Skip over question section. */
|
||||
while (qdcount-- > 0) {
|
||||
@ -256,7 +256,7 @@ GetAnswer(union res_sockaddr_union *nsAddrPtr, int queryType,
|
||||
printedAnswers = TRUE;
|
||||
} else {
|
||||
while (--ancount >= 0 && cp < eom) {
|
||||
n = dn_expand(answer.qb2, eom, cp, (char *)bp, buflen);
|
||||
n = dn_expand(answer.qb2, eom, cp, (char *)bp, ep - bp);
|
||||
if (n < 0)
|
||||
return(ERROR);
|
||||
cp += n;
|
||||
@ -281,13 +281,12 @@ GetAnswer(union res_sockaddr_union *nsAddrPtr, int queryType,
|
||||
host_aliases_len[numAliases] = s;
|
||||
numAliases++;
|
||||
bp += s;
|
||||
buflen -= s;
|
||||
continue;
|
||||
} else if (type == T_PTR) {
|
||||
/*
|
||||
* Found a "pointer" to the real name.
|
||||
*/
|
||||
n = dn_expand(answer.qb2, eom, cp, (char *)bp, buflen);
|
||||
n = dn_expand(answer.qb2, eom, cp, (char *)bp, ep - bp);
|
||||
if (n < 0) {
|
||||
cp += n;
|
||||
continue;
|
||||
@ -327,7 +326,7 @@ GetAnswer(union res_sockaddr_union *nsAddrPtr, int queryType,
|
||||
memcpy(hostPtr->name, bp, s);
|
||||
}
|
||||
}
|
||||
bp += (((u_int32_t)bp) % sizeof(align));
|
||||
bp += (((size_t)bp) % sizeof(align));
|
||||
|
||||
if (bp + dlen >= &hostbuf[sizeof(hostbuf)]) {
|
||||
if (res.options & RES_DEBUG) {
|
||||
@ -467,7 +466,7 @@ GetAnswer(union res_sockaddr_union *nsAddrPtr, int queryType,
|
||||
* that serve the requested domain.
|
||||
*/
|
||||
|
||||
n = dn_expand(answer.qb2, eom, cp, (char *)bp, buflen);
|
||||
n = dn_expand(answer.qb2, eom, cp, (char *)bp, ep - bp);
|
||||
if (n < 0) {
|
||||
return(ERROR);
|
||||
}
|
||||
@ -490,7 +489,7 @@ GetAnswer(union res_sockaddr_union *nsAddrPtr, int queryType,
|
||||
} else {
|
||||
Boolean found;
|
||||
|
||||
n = dn_expand(answer.qb2, eom, cp, (char *)bp, buflen);
|
||||
n = dn_expand(answer.qb2, eom, cp, (char *)bp, ep - bp);
|
||||
if (n < 0) {
|
||||
return(ERROR);
|
||||
}
|
||||
@ -546,7 +545,7 @@ GetAnswer(union res_sockaddr_union *nsAddrPtr, int queryType,
|
||||
}
|
||||
} else {
|
||||
while (--arcount >= 0 && cp < eom) {
|
||||
n = dn_expand(answer.qb2, eom, cp, (char *)bp, buflen);
|
||||
n = dn_expand(answer.qb2, eom, cp, (char *)bp, ep - bp);
|
||||
if (n < 0) {
|
||||
break;
|
||||
}
|
||||
@ -944,7 +943,7 @@ GetHostInfoByAddr(union res_sockaddr_union *nsAddrPtr,
|
||||
p[9] & 0xf, (p[9] >> 4) & 0xf,
|
||||
p[8] & 0xf, (p[8] >> 4) & 0xf,
|
||||
p[7] & 0xf, (p[7] >> 4) & 0xf,
|
||||
p[6] & 0xf, (p[4] >> 4) & 0xf,
|
||||
p[6] & 0xf, (p[6] >> 4) & 0xf,
|
||||
p[5] & 0xf, (p[5] >> 4) & 0xf,
|
||||
p[4] & 0xf, (p[4] >> 4) & 0xf,
|
||||
p[3] & 0xf, (p[3] >> 4) & 0xf,
|
||||
@ -964,7 +963,7 @@ GetHostInfoByAddr(union res_sockaddr_union *nsAddrPtr,
|
||||
p[9] & 0xf, (p[9] >> 4) & 0xf,
|
||||
p[8] & 0xf, (p[8] >> 4) & 0xf,
|
||||
p[7] & 0xf, (p[7] >> 4) & 0xf,
|
||||
p[6] & 0xf, (p[4] >> 4) & 0xf,
|
||||
p[6] & 0xf, (p[6] >> 4) & 0xf,
|
||||
p[5] & 0xf, (p[5] >> 4) & 0xf,
|
||||
p[4] & 0xf, (p[4] >> 4) & 0xf,
|
||||
p[3] & 0xf, (p[3] >> 4) & 0xf,
|
||||
@ -1017,7 +1016,7 @@ GetHostInfoByAddr(union res_sockaddr_union *nsAddrPtr,
|
||||
n = GetAnswer(nsAddrPtr, T_PTR, (char *) &buf, n, 1, hostPtr, 1, 0);
|
||||
if (n == SUCCESS) {
|
||||
hostPtr->addrList = (AddrInfo **)Calloc(2, sizeof(AddrInfo *));
|
||||
hostPtr->addrList[0] = (AddrInfo *)Calloc(1, sizeof(AddrInfo *));
|
||||
hostPtr->addrList[0] = (AddrInfo *)Calloc(1, sizeof(AddrInfo));
|
||||
hostPtr->addrList[0]->addr = Calloc(16, sizeof(char));
|
||||
memcpy(hostPtr->addrList[0]->addr, p, 16);
|
||||
hostPtr->addrList[0]->addrType = AF_INET6;
|
||||
|
@ -77,7 +77,7 @@ char copyright[] =
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)main.c 5.42 (Berkeley) 3/3/91";
|
||||
static const char rcsid[] = "$Id: main.c,v 8.24 2002/05/26 03:12:20 marka Exp $";
|
||||
static const char rcsid[] = "$Id: main.c,v 8.25 2003/01/26 11:38:56 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -611,7 +611,7 @@ SetDefaultServer(string, local)
|
||||
UnionFromAddr(&servAddr, defaultPtr->addrList[0]->addrType,
|
||||
defaultPtr->addrList[0]->addr);
|
||||
} else {
|
||||
UnionFromAddr(&servAddr, defaultPtr->addrList[0]->addrType,
|
||||
UnionFromAddr(&servAddr, defaultPtr->servers[0]->addrList[0]->addrType,
|
||||
defaultPtr->servers[0]->addrList[0]->addr);
|
||||
}
|
||||
|
||||
|
@ -53,7 +53,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static const char sccsid[] = "@(#)send.c 5.18 (Berkeley) 3/2/91";
|
||||
static const char rcsid[] = "$Id: send.c,v 8.14 2002/05/10 04:35:09 marka Exp $";
|
||||
static const char rcsid[] = "$Id: send.c,v 8.14.10.1 2003/06/02 05:59:56 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -181,7 +181,7 @@ SendRequest(union res_sockaddr_union *nsAddrPtr, const u_char *buf,
|
||||
/*
|
||||
* Send length & message
|
||||
*/
|
||||
__putshort(buflen, (u_char *)&len);
|
||||
ns_put16(buflen, (u_char *)&len);
|
||||
iov[0].iov_base = (caddr_t)&len;
|
||||
iov[0].iov_len = INT16SZ;
|
||||
DE_CONST(buf, iov[1].iov_base);
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: nsupdate.c,v 8.27 2001/06/18 14:43:46 marka Exp $";
|
||||
static const char rcsid[] = "$Id: nsupdate.c,v 8.30 2003/04/03 05:51:07 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -155,9 +155,6 @@ main(int argc, char **argv) {
|
||||
struct map *mp;
|
||||
ns_updrec *rrecp;
|
||||
ns_updque listuprec;
|
||||
extern int getopt();
|
||||
extern char *optarg;
|
||||
extern int optind, opterr, optopt;
|
||||
ns_tsig_key key;
|
||||
char *keyfile=NULL, *keyname=NULL;
|
||||
|
||||
@ -398,11 +395,15 @@ main(int argc, char **argv) {
|
||||
(void) getword_str(buf2, sizeof buf2, &startp, endp);
|
||||
|
||||
if (isdigit(buf2[0])) { /* ttl */
|
||||
r_ttl = strtoul(buf2, 0, 10);
|
||||
if (errno == ERANGE && r_ttl == ULONG_MAX) {
|
||||
u_long tmp_ttl;
|
||||
errno = 0;
|
||||
tmp_ttl = strtoul(buf2, 0, 10);
|
||||
if ((errno == ERANGE && tmp_ttl == ULONG_MAX) ||
|
||||
tmp_ttl > 0x7fffffffUL) {
|
||||
fprintf(stderr, "oversized ttl: %s\n", buf2);
|
||||
exit (1);
|
||||
}
|
||||
r_ttl = tmp_ttl;
|
||||
(void) getword_str(buf2, sizeof buf2, &startp, endp);
|
||||
}
|
||||
|
||||
|
@ -70,6 +70,7 @@ options {
|
||||
[ <A HREF="#sortlist">sortlist</A> { <VAR>address_match_list</VAR> }; ]
|
||||
[ rrset-order { <VAR>order_spec</VAR> ; [ <VAR>order_spec</VAR> ; ... ] }; ]
|
||||
[ preferred-glue ( A | AAAA ); ]
|
||||
[ edns-udp-size <VAR>number</VAR>; ]
|
||||
};
|
||||
</PRE>
|
||||
<HR>
|
||||
@ -819,6 +820,16 @@ the answer to a priming query. This can be achieved by setting
|
||||
<CODE>preferred-glue A;</CODE> which will add A records before other types
|
||||
in the additional section.
|
||||
|
||||
<H4>EDNS</H4>
|
||||
|
||||
Some firewalls fail to pass EDNS/UDP messages that are larger than
|
||||
certain size, 512 or the UDP reassembly buffer. To allow EDNS to
|
||||
work across such firewalls it is necessary to advertise a EDNS
|
||||
buffer size that is small enough to not trigger failures.
|
||||
<CODE>edns-udp-size</CODE> can be use to adjust the advertised size.
|
||||
Values less than 512 will be increased to 512 and values greater than
|
||||
4096 will be truncated to 4096.
|
||||
|
||||
<H4>Tuning</H4>
|
||||
|
||||
<DL>
|
||||
@ -847,7 +858,7 @@ request for the root servers to be accepted. Default 2.
|
||||
|
||||
<HR>
|
||||
<ADDRESS>
|
||||
Last Updated: $Id: options.html,v 1.49 2002/09/09 00:19:17 marka Exp $
|
||||
Last Updated: $Id: options.html,v 1.49.6.1 2003/06/02 09:56:33 marka Exp $
|
||||
</ADDRESS>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
@ -1,4 +1,4 @@
|
||||
.\" $Id: dig.1,v 8.9 2002/06/18 01:53:43 marka Exp $
|
||||
.\" $Id: dig.1,v 8.11 2003/04/03 05:52:34 marka Exp $
|
||||
.\"
|
||||
.\" ++Copyright++ 1993
|
||||
.\" -
|
||||
@ -246,7 +246,7 @@ one can simply
|
||||
.It Fl x Ar IPv6-address
|
||||
Convenient form to specify inverse address mapping.
|
||||
Instead of
|
||||
.Dq Ic dig 1.0.0.0.0.0.0.0.0.0.0.0. 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa ,
|
||||
.Dq Ic dig 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa ,
|
||||
one can simply
|
||||
.Dq Ic dig -x ::1 .
|
||||
.It Fl f Ar file
|
||||
@ -684,7 +684,7 @@ authored by Andrew Cherenson.
|
||||
.Sh BUGS
|
||||
.Ic Dig
|
||||
has a serious case of "creeping featurism" -- the result of
|
||||
considering several potential uses during it's development. It would
|
||||
considering several potential uses during its development. It would
|
||||
probably benefit from a rigorous diet. Similarly, the print flags
|
||||
and granularity of the items they specify make evident their
|
||||
rather ad hoc genesis.
|
||||
|
@ -61,7 +61,7 @@
|
||||
.\" THE SOFTWARE IS PROVIDED "AS IS" AND CHECK POINT SOFTWARE TECHNOLOGIES
|
||||
.\" INCORPORATED DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
.\" INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
|
||||
.\" IN NO EVENT SHALL CHECK POINT SOFTWARE TECHNOLOGIES INCORPRATED
|
||||
.\" IN NO EVENT SHALL CHECK POINT SOFTWARE TECHNOLOGIES INCORPORATED
|
||||
.\" BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR
|
||||
.\" ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
|
||||
.\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
@ -87,7 +87,11 @@
|
||||
.Op Fl i Ar ixfr_file
|
||||
.Op Fl t Ar trace_file
|
||||
.Op Fl p Ar port#
|
||||
.Op Fl C Ar class
|
||||
.Op Fl S
|
||||
.Op Fl q
|
||||
.Op Fl x Ar src_address
|
||||
.Op Fl T Ar tsig_file
|
||||
.Ar nameserver
|
||||
.Op Sy axfr | ixfr
|
||||
.Sh DESCRIPTION
|
||||
@ -144,6 +148,9 @@ as returned by
|
||||
.Xr getservbyname @LIB_NETWORK_EXT@
|
||||
for the service
|
||||
.Dq Li domain .
|
||||
.It Fl C Ar class
|
||||
Defines which class to use.
|
||||
Defaults to 'IN'.
|
||||
.It Fl S
|
||||
Perform a restricted transfer of only the SOA, NS records and glue A records
|
||||
for the zone. The SOA record will not be loaded by
|
||||
@ -154,6 +161,26 @@ determine when to verify the NS records. See the
|
||||
directive in
|
||||
.Xr @INDOT@named @SYS_OPS_EXT@
|
||||
for more information.
|
||||
.It Fl q
|
||||
Tells @INDOT@named-xfer to be quiet.
|
||||
.It Fl x Ar src_address
|
||||
Specifies the source address to use for this query.
|
||||
.It Fl T Ar tsig_file
|
||||
Specifies a file to transfer TSIG information to @INDOT@named-xfer.
|
||||
Multiple entries of the following format:
|
||||
.Pp
|
||||
.Bl -hang -width "IP address" -compact
|
||||
.It IP address
|
||||
When connecting to this address use this TSIG key.
|
||||
.It key name
|
||||
.It algorithm
|
||||
157 (HMAC-MD5) is the only algorithm supported.
|
||||
.It key data
|
||||
base64
|
||||
.El
|
||||
.Pp
|
||||
@INDOT@named-xfer expects this file to be temporary in nature and
|
||||
will explicitly delete this file after its use.
|
||||
.El
|
||||
.Pp
|
||||
Additional arguments are taken as name server addresses in so-called
|
||||
|
@ -205,7 +205,7 @@ specified may be either a groupname or a numeric group id.
|
||||
.Pp
|
||||
.It Fl t Ar directory
|
||||
Specifies the directory the server should chroot() into as soon as it is
|
||||
finshed processing command line arguments.
|
||||
finished processing command line arguments.
|
||||
.Pp
|
||||
.It Fl w Ar directory
|
||||
Sets the working directory of the server. The
|
||||
|
@ -767,6 +767,7 @@ options {
|
||||
[ sortlist { \fIaddress_match_list\fR }; ]
|
||||
[ rrset-order { \fIorder_spec\fR ; [ \fIorder_spec\fR ; ... ] }; ]
|
||||
[ preferred-glue ( A | AAAA ); ]
|
||||
[ edns-udp-size \fInumber\fR; ]
|
||||
};
|
||||
.Ed
|
||||
.Ss Definition and Usage
|
||||
@ -954,7 +955,7 @@ with
|
||||
.Ic maintain-ixfr-base ,
|
||||
and
|
||||
.Ic rfc2308-type1
|
||||
is order dependant.
|
||||
is order dependent.
|
||||
.It Ic host-statistics
|
||||
If
|
||||
.Li yes ,
|
||||
@ -968,7 +969,7 @@ can consume huge amounts of memory.
|
||||
.It Ic maintain-ixfr-base
|
||||
If
|
||||
.Li yes ,
|
||||
a IXFR database file is kept for all dynamicaly updated zones.
|
||||
a IXFR database file is kept for all dynamically updated zones.
|
||||
This enables the server to answer IXFR queries which can speed up
|
||||
zone transfers enormously.
|
||||
The default is
|
||||
@ -1285,7 +1286,7 @@ address must appear in the remote end's
|
||||
.Nm allow-transfer
|
||||
option for the zones being transferred, if one is specified. This statement sets the
|
||||
.Nm transfer-source
|
||||
for all zones, but can be overriden on a per-zone basis by includinga
|
||||
for all zones, but can be overridden on a per-zone basis by including a
|
||||
.Nm transfer-source
|
||||
statement within the zone block in the configuration file.
|
||||
.El
|
||||
@ -1552,6 +1553,16 @@ in the answer to a priming query.
|
||||
This can be achieved by setting
|
||||
.Ic preferred-glue A;
|
||||
which will add A records before other types in the additional section.
|
||||
.Ss EDNS
|
||||
Some firewalls fail to pass EDNS/UDP messages that are larger than
|
||||
certain size, 512 or the UDP reassembly buffer.
|
||||
To allow EDNS to
|
||||
work across such firewalls it is necessary to advertise a EDNS
|
||||
buffer size that is small enough to not trigger failures.
|
||||
.Ic edns-udp-size
|
||||
can be use to adjust the advertised size.
|
||||
Values less than 512 will be increased to 512 and values greater than
|
||||
4096 will be truncated to 4096.
|
||||
.Ss Tuning
|
||||
.Bl -tag -width 0n
|
||||
.It Ic lame-ttl
|
||||
@ -1971,7 +1982,7 @@ statement, to be used for transaction security when talking to the
|
||||
remote server.
|
||||
The
|
||||
.Ic key
|
||||
statememnt must come before the
|
||||
statement must come before the
|
||||
.Ic server
|
||||
statement that references it.
|
||||
.Pp
|
||||
|
@ -16,7 +16,7 @@
|
||||
.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
.\"
|
||||
.\" @(#)resolver.3 6.5 (Berkeley) 6/23/90
|
||||
.\" $Id: resolver.3,v 8.17 2002/08/07 03:47:33 marka Exp $
|
||||
.\" $Id: resolver.3,v 8.17.6.1 2003/06/02 09:11:27 marka Exp $
|
||||
.\"
|
||||
.Dd July 4, 2000
|
||||
.Dt RESOLVER @LIB_NETWORK_EXT_U@
|
||||
@ -37,6 +37,8 @@
|
||||
.Nm res_nclose ,
|
||||
.Nm res_nsendsigned ,
|
||||
.Nm res_findzonecut ,
|
||||
.Nm res_getservers ,
|
||||
.Nm res_setservers ,
|
||||
.Nm dn_comp ,
|
||||
.Nm dn_expand ,
|
||||
.Nm hstrerror ,
|
||||
@ -59,16 +61,26 @@
|
||||
.Fd #include <netinet/in.h>
|
||||
.Fd #include <arpa/nameser.h>
|
||||
.Fd #include <resolv.h>
|
||||
.Fd #include <res_update.h>
|
||||
.Vt typedef struct __res_state *res_state ;
|
||||
.Pp
|
||||
.Ft int
|
||||
.Fn res_ninit "res_state statp"
|
||||
.Ft int
|
||||
.Fn res_ourserver_p "const res_state statp" "const struct sockaddr_in *addr"
|
||||
.Ft void
|
||||
.Fn fp_resstat "const res_state statp" "FILE *fp"
|
||||
.Ft "const char *"
|
||||
.Fn res_hostalias "const res_state statp" "const char *name" "char *buf" "size_t buflen"
|
||||
.Ft int
|
||||
.Fn res_pquery "const res_state statp" "const u_char *msg" "int msglen" "FILE *fp"
|
||||
.Ft int
|
||||
.Fn res_nquery "res_state statp" "const char *dname" "int class" "int type" "u_char *answer" "int anslen"
|
||||
.Ft int
|
||||
.Fn res_nsearch "res_state statp" "const char *dname" "int class" "int type" "u_char * answer" "int anslen"
|
||||
.Ft int
|
||||
.Fn res_nquerydomain "res_state statp" "const char *name" "const char *domain" "int class" "int type" "u_char *answer" "int anslen"
|
||||
.Ft int
|
||||
.Fo res_nmkquery
|
||||
.Fa "res_state statp"
|
||||
.Fa "int op"
|
||||
@ -81,28 +93,51 @@
|
||||
.Fa "u_char *buf"
|
||||
.Fa "int buflen"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fn res_nsend "res_state statp" "const u_char *msg" "int msglen" "u_char *answer" "int anslen"
|
||||
.Ft int
|
||||
.Fn res_nupdate "res_state statp" "ns_updrec *rrecp_in"
|
||||
.Ft int
|
||||
.Fn res_nmkupdate "res_state statp" "ns_updrec *rrecp_in" "u_char *buf" "int buflen"
|
||||
.Ft void
|
||||
.Fn res_nclose "res_state statp"
|
||||
.Ft int
|
||||
.Fn res_nsendsigned "res_state statp" "const u_char *msg" "int msglen" "ns_tsig_key *key" "u_char *answer" "int anslen"
|
||||
.Ft int
|
||||
.Fn res_findzonecut "res_state statp" "const char *dname" "ns_class class" "int options" "char *zname" "size_t zsize" "struct in_addr *addrs" "int naddrs"
|
||||
.Ft int
|
||||
.Fn res_getservers "res_state statp" "union res_sockaddr_union *set" "int cnt"
|
||||
.Ft void
|
||||
.Fn res_setservers "res_state statp" "const union res_sockaddr_union *set" "int cnt"
|
||||
.Ft int
|
||||
.Fn dn_comp "const char *exp_dn" "u_char *comp_dn" "int length" "u_char **dnptrs" "u_char **lastdnptr"
|
||||
.Ft int
|
||||
.Fn dn_expand "const u_char *msg" "const u_char *eomorig" "const u_char *comp_dn" "char *exp_dn" "int length"
|
||||
.Ft "const char *"
|
||||
.Fn hstrerror "int err"
|
||||
.Ss DEPRECATED
|
||||
.Fd #include <sys/types.h>
|
||||
.Fd #include <netinet/in.h>
|
||||
.Fd #include <arpa/nameser.h>
|
||||
.Fd #include <resolv.h>
|
||||
.Fd #include <res_update.h>
|
||||
.Ft int
|
||||
.Fn res_init "void"
|
||||
.Ft int
|
||||
.Fn res_isourserver "const struct sockaddr_in *addr"
|
||||
.Ft int
|
||||
.Fn fp_nquery "const u_char *msg" "int msglen" "FILE *fp"
|
||||
.Ft void
|
||||
.Fn p_query "const u_char *msg" "FILE *fp"
|
||||
.Ft "const char *"
|
||||
.Fn hostalias "const char *name"
|
||||
.Ft int
|
||||
.Fn res_query "const char *dname" "int class" "int type" "u_char *answer" "int anslen"
|
||||
.Ft int
|
||||
.Fn res_search "const char *dname" "int class" "int type" "u_char *answer" "int anslen"
|
||||
.Ft int
|
||||
.Fn res_querydomain "const char *name" "const char *domain" "int class" "int type" "u_char *answer" "int anslen"
|
||||
.Ft int
|
||||
.Fo res_mkquery
|
||||
.Fa "int op"
|
||||
.Fa "const char *dname"
|
||||
@ -114,9 +149,13 @@
|
||||
.Fa "u_char *buf"
|
||||
.Fa "int buflen"
|
||||
.Fc
|
||||
.Ft int
|
||||
.Fn res_send "const u_char *msg" "int msglen" "u_char *answer" "int anslen"
|
||||
.Ft int
|
||||
.Fn res_update "ns_updrec *rrecp_in"
|
||||
.Ft void
|
||||
.Fn res_close "void"
|
||||
.Ft void
|
||||
.Fn herror "const char *s"
|
||||
.Sh DESCRIPTION
|
||||
These routines are used for making, sending and interpreting
|
||||
@ -452,6 +491,12 @@ to store the result in,
|
||||
uses a static buffer.
|
||||
.Pp
|
||||
The functions
|
||||
.Fn res_getservers
|
||||
and
|
||||
.Fn res_setservers
|
||||
are used to get and set the list of server to be queried.
|
||||
.Pp
|
||||
The functions
|
||||
.Fn res_nupdate
|
||||
/
|
||||
.Fn res_update
|
||||
@ -605,4 +650,4 @@ See
|
||||
.Xr resolver @FORMAT_EXT@ ;
|
||||
RFC1032, RFC1033, RFC1034, RFC1035, RFC974;
|
||||
SMM:11,
|
||||
.Dq Name Server Operations Guide for Sy BIND
|
||||
.Dq Name Server Operations Guide for BIND
|
||||
|
@ -49,7 +49,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* $Id: nameser.h,v 8.47 2002/04/30 03:43:53 marka Exp $
|
||||
* $Id: nameser.h,v 8.48.8.2 2003/06/02 09:24:40 marka Exp $
|
||||
*/
|
||||
|
||||
#ifndef _ARPA_NAMESER_H_
|
||||
@ -78,8 +78,9 @@
|
||||
/*
|
||||
* Define constants based on RFC 883, RFC 1034, RFC 1035
|
||||
*/
|
||||
#define NS_PACKETSZ 512 /* maximum packet size */
|
||||
#define NS_PACKETSZ 512 /* default UDP packet size */
|
||||
#define NS_MAXDNAME 1025 /* maximum domain name */
|
||||
#define NS_MAXMSG 65535 /* maximum message size */
|
||||
#define NS_MAXCDNAME 255 /* maximum compressed domain name */
|
||||
#define NS_MAXLABEL 63 /* maximum length of domain label */
|
||||
#define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */
|
||||
@ -294,6 +295,7 @@ typedef enum __ns_type {
|
||||
ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */
|
||||
ns_t_sink = 40, /* Kitchen sink (experimentatl) */
|
||||
ns_t_opt = 41, /* EDNS0 option (meta-RR) */
|
||||
ns_t_apl = 42, /* Address prefix list (RFC 3123) */
|
||||
ns_t_tkey = 249, /* Transaction key */
|
||||
ns_t_tsig = 250, /* Transaction signature. */
|
||||
ns_t_ixfr = 251, /* Incremental zone transfer. */
|
||||
@ -398,7 +400,7 @@ typedef enum __ns_cert_types {
|
||||
|
||||
/* Signatures */
|
||||
#define NS_MD5RSA_MIN_BITS 512 /* Size of a mod or exp in bits */
|
||||
#define NS_MD5RSA_MAX_BITS 2552
|
||||
#define NS_MD5RSA_MAX_BITS 4096
|
||||
/* Total of binary mod and exp */
|
||||
#define NS_MD5RSA_MAX_BYTES ((NS_MD5RSA_MAX_BITS+7/8)*2+3)
|
||||
/* Max length of text sig block */
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
/*
|
||||
* from nameser.h 8.1 (Berkeley) 6/2/93
|
||||
* $Id: nameser_compat.h,v 8.14 2002/05/18 01:39:11 marka Exp $
|
||||
* $Id: nameser_compat.h,v 8.15 2002/07/17 07:01:02 marka Exp $
|
||||
*/
|
||||
|
||||
#ifndef _ARPA_NAMESER_COMPAT_
|
||||
@ -138,6 +138,7 @@ typedef struct {
|
||||
#define RRFIXEDSZ NS_RRFIXEDSZ
|
||||
#define INT32SZ NS_INT32SZ
|
||||
#define INT16SZ NS_INT16SZ
|
||||
#define INT8SZ NS_INT8SZ
|
||||
#define INADDRSZ NS_INADDRSZ
|
||||
#define IN6ADDRSZ NS_IN6ADDRSZ
|
||||
#define INDIR_MASK NS_CMPRSFLGS
|
||||
|
@ -20,21 +20,19 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* $Id: hesiod.h,v 1.7 1999/01/08 19:22:45 vixie Exp $
|
||||
* $Id: hesiod.h,v 1.7.20.1 2003/06/02 05:48:04 marka Exp $
|
||||
*/
|
||||
|
||||
#ifndef _HESIOD_H_INCLUDED
|
||||
#define _HESIOD_H_INCLUDED
|
||||
|
||||
int hesiod_init __P((void **context));
|
||||
void hesiod_end __P((void *context));
|
||||
char * hesiod_to_bind __P((void *context, const char *name,
|
||||
const char *type));
|
||||
char ** hesiod_resolve __P((void *context, const char *name,
|
||||
const char *type));
|
||||
void hesiod_free_list __P((void *context, char **list));
|
||||
struct __res_state * __hesiod_res_get __P((void *context));
|
||||
void __hesiod_res_set __P((void *context, struct __res_state *,
|
||||
int hesiod_init __P((void **));
|
||||
void hesiod_end __P((void *));
|
||||
char * hesiod_to_bind __P((void *, const char *, const char *));
|
||||
char ** hesiod_resolve __P((void *, const char *, const char *));
|
||||
void hesiod_free_list __P((void *, char **));
|
||||
struct __res_state * __hesiod_res_get __P((void *));
|
||||
void __hesiod_res_set __P((void *, struct __res_state *,
|
||||
void (*)(void *)));
|
||||
|
||||
#endif /*_HESIOD_H_INCLUDED*/
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* $Id: irp.h,v 8.1 1999/01/18 07:46:46 vixie Exp $
|
||||
* $Id: irp.h,v 8.1.20.3 2003/06/02 08:20:37 marka Exp $
|
||||
*/
|
||||
|
||||
#ifndef _IRP_H_INCLUDED
|
||||
@ -84,16 +84,20 @@
|
||||
|
||||
struct irp_p;
|
||||
|
||||
char *irs_irp_read_body(struct irp_p *pvt, size_t *size);
|
||||
int irs_irp_read_response(struct irp_p *pvt, char *text, size_t len);
|
||||
void irs_irp_disconnect(struct irp_p *pvt);
|
||||
int irs_irp_connect(struct irp_p *pvt);
|
||||
int irs_irp_is_connected(struct irp_p *pvt);
|
||||
int irs_irp_connection_setup(struct irp_p *cxndata, int *warned);
|
||||
int irs_irp_send_command(struct irp_p *pvt, const char *fmt, ...);
|
||||
int irs_irp_get_full_response(struct irp_p *pvt, int *code, char *text,
|
||||
size_t textlen, char **body,
|
||||
size_t *bodylen);
|
||||
int irs_irp_read_line(struct irp_p *pvt, char *buffer, int len);
|
||||
char *irs_irp_read_body(struct irp_p *, size_t *);
|
||||
int irs_irp_read_response(struct irp_p *, char *, size_t);
|
||||
void irs_irp_disconnect(struct irp_p *);
|
||||
int irs_irp_connect(struct irp_p *);
|
||||
int irs_irp_is_connected(struct irp_p *);
|
||||
int irs_irp_connection_setup(struct irp_p *, int *);
|
||||
#ifdef __GNUC__
|
||||
int irs_irp_send_command(struct irp_p *, const char *, ...)
|
||||
__attribute__((__format__(__printf__, 2, 3)));
|
||||
#else
|
||||
int irs_irp_send_command(struct irp_p *, const char *, ...);
|
||||
#endif
|
||||
int irs_irp_get_full_response(struct irp_p *, int *, char *, size_t,
|
||||
char **, size_t *);
|
||||
int irs_irp_read_line(struct irp_p *, char *, int);
|
||||
|
||||
#endif
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* $Id: irs.h,v 8.6 2001/05/29 05:47:00 marka Exp $
|
||||
* $Id: irs.h,v 8.7.6.2 2003/06/02 06:06:58 marka Exp $
|
||||
*/
|
||||
|
||||
#ifndef _IRS_H_INCLUDED
|
||||
@ -30,7 +30,6 @@
|
||||
#include <netdb.h>
|
||||
#include <resolv.h>
|
||||
#include <pwd.h>
|
||||
#include <netgroup.h>
|
||||
|
||||
/*
|
||||
* This is the group map class.
|
||||
@ -199,18 +198,58 @@ struct nwent {
|
||||
#define irs_dns_acc __irs_dns_acc
|
||||
#define irs_nis_acc __irs_nis_acc
|
||||
#define irs_irp_acc __irs_irp_acc
|
||||
#define irs_destroy __irs_destroy
|
||||
#define irs_dns_gr __irs_dns_gr
|
||||
#define irs_dns_ho __irs_dns_ho
|
||||
#define irs_dns_nw __irs_dns_nw
|
||||
#define irs_dns_pr __irs_dns_pr
|
||||
#define irs_dns_pw __irs_dns_pw
|
||||
#define irs_dns_sv __irs_dns_sv
|
||||
#define irs_gen_gr __irs_gen_gr
|
||||
#define irs_gen_ho __irs_gen_ho
|
||||
#define irs_gen_ng __irs_gen_ng
|
||||
#define irs_gen_nw __irs_gen_nw
|
||||
#define irs_gen_pr __irs_gen_pr
|
||||
#define irs_gen_pw __irs_gen_pw
|
||||
#define irs_gen_sv __irs_gen_sv
|
||||
#define irs_irp_get_full_response __irs_irp_get_full_response
|
||||
#define irs_irp_gr __irs_irp_gr
|
||||
#define irs_irp_ho __irs_irp_ho
|
||||
#define irs_irp_is_connected __irs_irp_is_connected
|
||||
#define irs_irp_ng __irs_irp_ng
|
||||
#define irs_irp_nw __irs_irp_nw
|
||||
#define irs_irp_pr __irs_irp_pr
|
||||
#define irs_irp_pw __irs_irp_pw
|
||||
#define irs_irp_read_line __irs_irp_read_line
|
||||
#define irs_irp_sv __irs_irp_sv
|
||||
#define irs_lcl_gr __irs_lcl_gr
|
||||
#define irs_lcl_ho __irs_lcl_ho
|
||||
#define irs_lcl_ng __irs_lcl_ng
|
||||
#define irs_lcl_nw __irs_lcl_nw
|
||||
#define irs_lcl_pr __irs_lcl_pr
|
||||
#define irs_lcl_pw __irs_lcl_pw
|
||||
#define irs_lcl_sv __irs_lcl_sv
|
||||
#define irs_nis_gr __irs_nis_gr
|
||||
#define irs_nis_ho __irs_nis_ho
|
||||
#define irs_nis_ng __irs_nis_ng
|
||||
#define irs_nis_nw __irs_nis_nw
|
||||
#define irs_nis_pr __irs_nis_pr
|
||||
#define irs_nis_pw __irs_nis_pw
|
||||
#define irs_nis_sv __irs_nis_sv
|
||||
#define net_data_create __net_data_create
|
||||
#define net_data_destroy __net_data_destroy
|
||||
#define net_data_minimize __net_data_minimize
|
||||
|
||||
/*
|
||||
* Externs.
|
||||
*/
|
||||
extern struct irs_acc * irs_gen_acc __P((const char *options,
|
||||
const char *conf_file));
|
||||
extern struct irs_acc * irs_lcl_acc __P((const char *options));
|
||||
extern struct irs_acc * irs_dns_acc __P((const char *options));
|
||||
extern struct irs_acc * irs_nis_acc __P((const char *options));
|
||||
extern struct irs_acc * irs_irp_acc __P((const char *options));
|
||||
extern struct irs_acc * irs_gen_acc __P((const char *, const char *));
|
||||
extern struct irs_acc * irs_lcl_acc __P((const char *));
|
||||
extern struct irs_acc * irs_dns_acc __P((const char *));
|
||||
extern struct irs_acc * irs_nis_acc __P((const char *));
|
||||
extern struct irs_acc * irs_irp_acc __P((const char *));
|
||||
|
||||
extern void irs_destroy(void);
|
||||
extern void irs_destroy __P((void));
|
||||
|
||||
/*
|
||||
* These forward declarations are for the semi-private functions in
|
||||
@ -229,102 +268,78 @@ struct net_data; /* forward */
|
||||
* the default interface will use net_data_create by default. Servers will
|
||||
* probably want net_data_init (one call per client)
|
||||
*/
|
||||
struct net_data *net_data_create(const char *conf_file);
|
||||
struct net_data *net_data_init(const char *conf_file);
|
||||
void net_data_destroy(void *p);
|
||||
struct net_data *net_data_create __P((const char *));
|
||||
struct net_data *net_data_init __P((const char *));
|
||||
void net_data_destroy __P((void *));
|
||||
|
||||
extern struct group *getgrent_p __P((struct net_data *net_data));
|
||||
extern struct group *getgrnam_p __P((const char *name,
|
||||
struct net_data *net_data));
|
||||
extern struct group *getgrgid_p __P((gid_t gid,
|
||||
struct net_data *net_data));
|
||||
extern int setgroupent_p __P((int stayopen,
|
||||
struct net_data *net_data));
|
||||
extern void endgrent_p __P((struct net_data *net_data));
|
||||
extern int getgrouplist_p __P((const char *name,
|
||||
gid_t basegid,
|
||||
gid_t *groups,
|
||||
int *ngroups,
|
||||
struct net_data *net_data));
|
||||
extern struct group *getgrent_p __P((struct net_data *));
|
||||
extern struct group *getgrnam_p __P((const char *, struct net_data *));
|
||||
extern struct group *getgrgid_p __P((gid_t, struct net_data *));
|
||||
extern int setgroupent_p __P((int, struct net_data *));
|
||||
extern void endgrent_p __P((struct net_data *));
|
||||
extern int getgrouplist_p __P((const char *, gid_t, gid_t *, int *,
|
||||
struct net_data *));
|
||||
|
||||
#ifdef SETGRENT_VOID
|
||||
extern void setgrent_p __P((struct net_data *net_data));
|
||||
extern void setgrent_p __P((struct net_data *));
|
||||
#else
|
||||
extern int setgrent_p __P((struct net_data *net_data));
|
||||
extern int setgrent_p __P((struct net_data *));
|
||||
#endif
|
||||
|
||||
extern struct hostent *gethostbyname_p __P((const char *name,
|
||||
struct net_data *net_data));
|
||||
extern struct hostent *gethostbyname2_p __P((const char *name, int af,
|
||||
struct net_data *net_data));
|
||||
extern struct hostent *gethostbyaddr_p __P((const char *addr, int len,
|
||||
int af,
|
||||
struct net_data *net_data));
|
||||
extern struct hostent *gethostent_p __P((struct net_data *net_data));
|
||||
extern void sethostent_p __P((int stayopen,
|
||||
struct net_data *net_data));
|
||||
extern void endhostent_p __P((struct net_data *net_data));
|
||||
extern struct hostent *getipnodebyname_p __P((const char *name, int af,
|
||||
int flags, int *errp,
|
||||
struct net_data *net_data));
|
||||
extern struct hostent *getipnodebyaddr_p __P((const void *addr, size_t len,
|
||||
int af, int *errp,
|
||||
struct net_data *net_data));
|
||||
extern struct hostent *gethostbyname_p __P((const char *,
|
||||
struct net_data *));
|
||||
extern struct hostent *gethostbyname2_p __P((const char *, int,
|
||||
struct net_data *));
|
||||
extern struct hostent *gethostbyaddr_p __P((const char *, int, int,
|
||||
struct net_data *));
|
||||
extern struct hostent *gethostent_p __P((struct net_data *));
|
||||
extern void sethostent_p __P((int, struct net_data *));
|
||||
extern void endhostent_p __P((struct net_data *));
|
||||
extern struct hostent *getipnodebyname_p __P((const char *, int, int, int *,
|
||||
struct net_data *));
|
||||
extern struct hostent *getipnodebyaddr_p __P((const void *, size_t,
|
||||
int, int *, struct net_data *));
|
||||
|
||||
extern struct netent *getnetent_p __P((struct net_data *net_data));
|
||||
extern struct netent *getnetbyname_p __P((const char *name,
|
||||
struct net_data *net_data));
|
||||
extern struct netent *getnetbyaddr_p __P((unsigned long net, int type,
|
||||
struct net_data *net_data));
|
||||
extern void setnetent_p __P((int stayopen,
|
||||
struct net_data *net_data));
|
||||
extern void endnetent_p __P((struct net_data *net_data));
|
||||
extern struct netent *getnetent_p __P((struct net_data *));
|
||||
extern struct netent *getnetbyname_p __P((const char *, struct net_data *));
|
||||
extern struct netent *getnetbyaddr_p __P((unsigned long, int,
|
||||
struct net_data *));
|
||||
extern void setnetent_p __P((int, struct net_data *));
|
||||
extern void endnetent_p __P((struct net_data *));
|
||||
|
||||
extern void setnetgrent_p __P((const char *netgroup,
|
||||
struct net_data *net_data));
|
||||
extern void endnetgrent_p __P((struct net_data *net_data));
|
||||
extern int innetgr_p __P((const char *netgroup,
|
||||
const char *host,
|
||||
const char *user,
|
||||
const char *domain,
|
||||
struct net_data *net_data));
|
||||
extern int getnetgrent_p __P((const char **host, const char **user,
|
||||
const char **domain,
|
||||
struct net_data *net_data));
|
||||
extern void setnetgrent_p __P((const char *, struct net_data *));
|
||||
extern void endnetgrent_p __P((struct net_data *));
|
||||
extern int innetgr_p __P((const char *, const char *, const char *,
|
||||
const char *, struct net_data *));
|
||||
extern int getnetgrent_p __P((const char **, const char **,
|
||||
const char **, struct net_data *));
|
||||
|
||||
extern struct protoent *getprotoent_p __P((struct net_data *net_data));
|
||||
extern struct protoent *getprotobyname_p __P((const char *name,
|
||||
struct net_data *net_data));
|
||||
extern struct protoent *getprotobynumber_p __P((int proto,
|
||||
struct net_data *net_data));
|
||||
extern void setprotoent_p __P((int stayopen,
|
||||
struct net_data *net_data));
|
||||
extern void endprotoent_p __P((struct net_data *net_data));
|
||||
extern struct protoent *getprotoent_p __P((struct net_data *));
|
||||
extern struct protoent *getprotobyname_p __P((const char *,
|
||||
struct net_data *));
|
||||
extern struct protoent *getprotobynumber_p __P((int, struct net_data *));
|
||||
extern void setprotoent_p __P((int, struct net_data *));
|
||||
extern void endprotoent_p __P((struct net_data *));
|
||||
|
||||
|
||||
extern struct passwd *getpwent_p __P((struct net_data *net_data));
|
||||
extern struct passwd *getpwnam_p __P((const char *name,
|
||||
struct net_data *net_data));
|
||||
extern struct passwd *getpwuid_p __P((uid_t uid,
|
||||
struct net_data *net_data));
|
||||
extern int setpassent_p __P((int stayopen,
|
||||
struct net_data *net_data));
|
||||
extern void endpwent_p __P((struct net_data *net_data));
|
||||
extern struct passwd *getpwent_p __P((struct net_data *));
|
||||
extern struct passwd *getpwnam_p __P((const char *, struct net_data *));
|
||||
extern struct passwd *getpwuid_p __P((uid_t, struct net_data *));
|
||||
extern int setpassent_p __P((int, struct net_data *));
|
||||
extern void endpwent_p __P((struct net_data *));
|
||||
|
||||
#ifdef SETPWENT_VOID
|
||||
extern void setpwent_p __P((struct net_data *net_data));
|
||||
extern void setpwent_p __P((struct net_data *));
|
||||
#else
|
||||
extern int setpwent_p __P((struct net_data *net_data));
|
||||
extern int setpwent_p __P((struct net_data *));
|
||||
#endif
|
||||
|
||||
extern struct servent *getservent_p __P((struct net_data *net_data));
|
||||
extern struct servent *getservbyname_p __P((const char *name,
|
||||
const char *proto,
|
||||
struct net_data *net_data));
|
||||
extern struct servent *getservbyport_p __P((int port, const char *proto,
|
||||
struct net_data *net_data));
|
||||
extern void setservent_p __P((int stayopen,
|
||||
struct net_data *net_data));
|
||||
extern void endservent_p __P((struct net_data *net_data));
|
||||
extern struct servent *getservent_p __P((struct net_data *));
|
||||
extern struct servent *getservbyname_p __P((const char *, const char *,
|
||||
struct net_data *));
|
||||
extern struct servent *getservbyport_p __P((int, const char *,
|
||||
struct net_data *));
|
||||
extern void setservent_p __P((int, struct net_data *));
|
||||
extern void endservent_p __P((struct net_data *));
|
||||
|
||||
#endif /*_IRS_H_INCLUDED*/
|
||||
|
@ -19,7 +19,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* $Id: ctl.h,v 8.11 2001/08/10 02:40:49 marka Exp $
|
||||
* $Id: ctl.h,v 8.11.10.1 2003/06/02 06:04:03 marka Exp $
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -42,11 +42,11 @@ struct ctl_verb;
|
||||
|
||||
enum ctl_severity { ctl_debug, ctl_warning, ctl_error };
|
||||
|
||||
typedef void (*ctl_logfunc)(enum ctl_severity, const char *fmt, ...);
|
||||
typedef void (*ctl_logfunc)(enum ctl_severity, const char *, ...);
|
||||
|
||||
typedef void (*ctl_verbfunc)(struct ctl_sctx *, struct ctl_sess *,
|
||||
const struct ctl_verb *, const char *rest,
|
||||
u_int respflags, const void *respctx, void *uctx);
|
||||
const struct ctl_verb *, const char *,
|
||||
u_int, const void *, void *);
|
||||
|
||||
typedef void (*ctl_srvrdone)(struct ctl_sctx *, struct ctl_sess *, void *);
|
||||
|
||||
|
@ -12,82 +12,124 @@ typedef struct dst_key {
|
||||
} DST_KEY;
|
||||
#endif /* HAS_DST_KEY */
|
||||
|
||||
/*
|
||||
* do not taint namespace
|
||||
*/
|
||||
#define dst_bsafe_init __dst_bsafe_init
|
||||
#define dst_buffer_to_key __dst_buffer_to_key
|
||||
#define dst_check_algorithm __dst_check_algorithm
|
||||
#define dst_compare_keys __dst_compare_keys
|
||||
#define dst_cylink_init __dst_cylink_init
|
||||
#define dst_dnskey_to_key __dst_dnskey_to_key
|
||||
#define dst_eay_dss_init __dst_eay_dss_init
|
||||
#define dst_free_key __dst_free_key
|
||||
#define dst_generate_key __dst_generate_key
|
||||
#define dst_hmac_md5_init __dst_hmac_md5_init
|
||||
#define dst_init __dst_init
|
||||
#define dst_key_to_buffer __dst_key_to_buffer
|
||||
#define dst_key_to_dnskey __dst_key_to_dnskey
|
||||
#define dst_random __dst_random
|
||||
#define dst_read_key __dst_read_key
|
||||
#define dst_rsaref_init __dst_rsaref_init
|
||||
#define dst_s_build_filename __dst_s_build_filename
|
||||
#define dst_s_calculate_bits __dst_s_calculate_bits
|
||||
#define dst_s_conv_bignum_b64_to_u8 __dst_s_conv_bignum_b64_to_u8
|
||||
#define dst_s_conv_bignum_u8_to_b64 __dst_s_conv_bignum_u8_to_b64
|
||||
#define dst_s_dns_key_id __dst_s_dns_key_id
|
||||
#define dst_s_dump __dst_s_dump
|
||||
#define dst_s_filename_length __dst_s_filename_length
|
||||
#define dst_s_fopen __dst_s_fopen
|
||||
#define dst_s_get_int16 __dst_s_get_int16
|
||||
#define dst_s_get_int32 __dst_s_get_int32
|
||||
#define dst_s_id_calc __dst_s_id_calc
|
||||
#define dst_s_put_int16 __dst_s_put_int16
|
||||
#define dst_s_put_int32 __dst_s_put_int32
|
||||
#define dst_s_quick_random __dst_s_quick_random
|
||||
#define dst_s_quick_random_set __dst_s_quick_random_set
|
||||
#define dst_s_random __dst_s_random
|
||||
#define dst_s_semi_random __dst_s_semi_random
|
||||
#define dst_s_verify_str __dst_s_verify_str
|
||||
#define dst_sig_size __dst_sig_size
|
||||
#define dst_sign_data __dst_sign_data
|
||||
#define dst_verify_data __dst_verify_data
|
||||
#define dst_write_key __dst_write_key
|
||||
|
||||
/*
|
||||
* DST Crypto API defintions
|
||||
*/
|
||||
void dst_init(void);
|
||||
int dst_check_algorithm(const int);
|
||||
|
||||
int dst_sign_data(const int mode, /* specifies INIT/UPDATE/FINAL/ALL */
|
||||
DST_KEY *in_key, /* the key to use */
|
||||
void **context, /* pointer to state structure */
|
||||
const u_char *data, /* data to be signed */
|
||||
const int len, /* length of input data */
|
||||
u_char *signature, /* buffer to write signature to */
|
||||
const int sig_len); /* size of output buffer */
|
||||
int dst_sign_data(const int, /* specifies INIT/UPDATE/FINAL/ALL */
|
||||
DST_KEY *, /* the key to use */
|
||||
void **, /* pointer to state structure */
|
||||
const u_char *, /* data to be signed */
|
||||
const int, /* length of input data */
|
||||
u_char *, /* buffer to write signature to */
|
||||
const int); /* size of output buffer */
|
||||
|
||||
int dst_verify_data(const int mode, /* specifies INIT/UPDATE/FINAL/ALL */
|
||||
DST_KEY *in_key, /* the key to use */
|
||||
void **context, /* pointer to state structure */
|
||||
const u_char *data, /* data to be verified */
|
||||
const int len, /* length of input data */
|
||||
const u_char *signature,/* buffer containing signature */
|
||||
const int sig_len); /* length of signature */
|
||||
int dst_verify_data(const int, /* specifies INIT/UPDATE/FINAL/ALL */
|
||||
DST_KEY *, /* the key to use */
|
||||
void **, /* pointer to state structure */
|
||||
const u_char *, /* data to be verified */
|
||||
const int, /* length of input data */
|
||||
const u_char *, /* buffer containing signature */
|
||||
const int); /* length of signature */
|
||||
|
||||
|
||||
DST_KEY *dst_read_key(const char *in_name, /* name of key */
|
||||
const u_int16_t in_id, /* key tag identifier */
|
||||
const int in_alg, /* key algorithm */
|
||||
const int key_type); /* Private/PublicKey wanted*/
|
||||
DST_KEY *dst_read_key(const char *, /* name of key */
|
||||
const u_int16_t, /* key tag identifier */
|
||||
const int, /* key algorithm */
|
||||
const int); /* Private/PublicKey wanted*/
|
||||
|
||||
int dst_write_key(const DST_KEY *key, /* key to write out */
|
||||
const int key_type); /* Public/Private */
|
||||
int dst_write_key(const DST_KEY *, /* key to write out */
|
||||
const int); /* Public/Private */
|
||||
|
||||
DST_KEY *dst_dnskey_to_key(const char *in_name, /* KEY record name */
|
||||
const u_char *key, /* KEY RDATA */
|
||||
const int len); /* size of input buffer*/
|
||||
DST_KEY *dst_dnskey_to_key(const char *, /* KEY record name */
|
||||
const u_char *, /* KEY RDATA */
|
||||
const int); /* size of input buffer*/
|
||||
|
||||
|
||||
int dst_key_to_dnskey(const DST_KEY *key, /* key to translate */
|
||||
u_char *out_storage, /* output buffer */
|
||||
const int out_len); /* size of out_storage*/
|
||||
int dst_key_to_dnskey(const DST_KEY *, /* key to translate */
|
||||
u_char *, /* output buffer */
|
||||
const int); /* size of out_storage*/
|
||||
|
||||
|
||||
DST_KEY *dst_buffer_to_key(const char *key_name, /* name of the key */
|
||||
const int alg, /* algorithm */
|
||||
const int flags, /* dns flags */
|
||||
const int protocol, /* dns protocol */
|
||||
const u_char *key_buf, /* key in dns wire fmt */
|
||||
const int key_len); /* size of key */
|
||||
DST_KEY *dst_buffer_to_key(const char *, /* name of the key */
|
||||
const int, /* algorithm */
|
||||
const int, /* dns flags */
|
||||
const int, /* dns protocol */
|
||||
const u_char *, /* key in dns wire fmt */
|
||||
const int); /* size of key */
|
||||
|
||||
|
||||
int dst_key_to_buffer(DST_KEY *key, u_char *out_buff, int buf_len);
|
||||
int dst_key_to_buffer(DST_KEY *, u_char *, int);
|
||||
|
||||
DST_KEY *dst_generate_key(const char *name, /* name of new key */
|
||||
const int alg, /* key algorithm to generate */
|
||||
const int bits, /* size of new key */
|
||||
const int exp, /* alg dependent parameter*/
|
||||
const int flags, /* key DNS flags */
|
||||
const int protocol); /* key DNS protocol */
|
||||
DST_KEY *dst_generate_key(const char *, /* name of new key */
|
||||
const int, /* key algorithm to generate */
|
||||
const int, /* size of new key */
|
||||
const int, /* alg dependent parameter*/
|
||||
const int, /* key DNS flags */
|
||||
const int); /* key DNS protocol */
|
||||
|
||||
DST_KEY *dst_free_key(DST_KEY *f_key);
|
||||
int dst_compare_keys(const DST_KEY *key1, const DST_KEY *key2);
|
||||
DST_KEY *dst_free_key(DST_KEY *);
|
||||
int dst_compare_keys(const DST_KEY *, const DST_KEY *);
|
||||
|
||||
int dst_sig_size(DST_KEY *key);
|
||||
int dst_sig_size(DST_KEY *);
|
||||
|
||||
int dst_random(const int mode, int wanted, u_char *outran);
|
||||
int dst_random(const int, int wanted, u_char *);
|
||||
|
||||
|
||||
/* support for dns key tags/ids */
|
||||
u_int16_t dst_s_dns_key_id(const u_char *dns_key_rdata, const int rdata_len);
|
||||
u_int16_t dst_s_id_calc(const u_char *key_data, const int key_len);
|
||||
u_int16_t dst_s_dns_key_id(const u_char *, const int);
|
||||
u_int16_t dst_s_id_calc(const u_char *, const int);
|
||||
|
||||
/* Used by callers as well as by the library. */
|
||||
#define RAW_KEY_SIZE 8192 /* large enough to store any key */
|
||||
|
||||
/* DST_API control flags */
|
||||
/* These are used used in functions dst_sign_data and dst_verify_data */
|
||||
#define SIG_MODE_INIT 1 /* initalize digest */
|
||||
#define SIG_MODE_INIT 1 /* initialize digest */
|
||||
#define SIG_MODE_UPDATE 2 /* add data to digest */
|
||||
#define SIG_MODE_FINAL 4 /* generate/verify signature */
|
||||
#define SIG_MODE_ALL (SIG_MODE_INIT|SIG_MODE_UPDATE|SIG_MODE_FINAL)
|
||||
|
@ -18,7 +18,7 @@
|
||||
/* eventlib.h - exported interfaces for eventlib
|
||||
* vix 09sep95 [initial]
|
||||
*
|
||||
* $Id: eventlib.h,v 1.23 2001/05/29 05:47:09 marka Exp $
|
||||
* $Id: eventlib.h,v 1.23.10.1 2003/06/02 06:04:03 marka Exp $
|
||||
*/
|
||||
|
||||
#ifndef _EVENTLIB_H
|
||||
@ -50,14 +50,13 @@ typedef struct { void *opaque; } evEvent;
|
||||
#define evInitID(id) ((id)->opaque = NULL)
|
||||
#define evTestID(id) ((id).opaque != NULL)
|
||||
|
||||
typedef void (*evConnFunc)__P((evContext ctx, void *uap, int fd,
|
||||
const void *la, int lalen,
|
||||
const void *ra, int ralen));
|
||||
typedef void (*evFileFunc)__P((evContext ctx, void *uap, int fd, int evmask));
|
||||
typedef void (*evStreamFunc)__P((evContext ctx, void *uap, int fd, int bytes));
|
||||
typedef void (*evTimerFunc)__P((evContext ctx, void *uap,
|
||||
struct timespec due, struct timespec inter));
|
||||
typedef void (*evWaitFunc)__P((evContext ctx, void *uap, const void *tag));
|
||||
typedef void (*evConnFunc)__P((evContext, void *, int, const void *, int,
|
||||
const void *, int));
|
||||
typedef void (*evFileFunc)__P((evContext, void *, int, int));
|
||||
typedef void (*evStreamFunc)__P((evContext, void *, int, int));
|
||||
typedef void (*evTimerFunc)__P((evContext, void *,
|
||||
struct timespec, struct timespec));
|
||||
typedef void (*evWaitFunc)__P((evContext, void *, const void *));
|
||||
|
||||
typedef struct { unsigned char mask[256/8]; } evByteMask;
|
||||
#define EV_BYTEMASK_BYTE(b) ((b) / 8)
|
||||
@ -87,14 +86,14 @@ typedef struct { unsigned char mask[256/8]; } evByteMask;
|
||||
#define evMainLoop __evMainLoop
|
||||
#define evHighestFD __evHighestFD
|
||||
|
||||
int evCreate __P((evContext *ctx));
|
||||
void evSetDebug __P((evContext ctx, int lev, FILE *out));
|
||||
int evDestroy __P((evContext ctx));
|
||||
int evGetNext __P((evContext ctx, evEvent *ev, int options));
|
||||
int evDispatch __P((evContext ctx, evEvent ev));
|
||||
void evDrop __P((evContext ctx, evEvent ev));
|
||||
int evMainLoop __P((evContext ctx));
|
||||
int evHighestFD __P((evContext ctx));
|
||||
int evCreate __P((evContext *));
|
||||
void evSetDebug __P((evContext, int, FILE *));
|
||||
int evDestroy __P((evContext));
|
||||
int evGetNext __P((evContext, evEvent *, int));
|
||||
int evDispatch __P((evContext, evEvent));
|
||||
void evDrop __P((evContext, evEvent));
|
||||
int evMainLoop __P((evContext));
|
||||
int evHighestFD __P((evContext));
|
||||
|
||||
/* ev_connects.c */
|
||||
#define evListen __evListen
|
||||
@ -104,11 +103,10 @@ int evHighestFD __P((evContext ctx));
|
||||
#define evUnhold __evUnhold
|
||||
#define evTryAccept __evTryAccept
|
||||
|
||||
int evListen __P((evContext ctx, int fd, int maxconn,
|
||||
evConnFunc func, void *uap, evConnID *id));
|
||||
int evConnect __P((evContext ctx, int fd, const void *ra, int ralen,
|
||||
evConnFunc func, void *uap, evConnID *id));
|
||||
int evCancelConn __P((evContext ctx, evConnID id));
|
||||
int evListen __P((evContext, int, int, evConnFunc, void *, evConnID *));
|
||||
int evConnect __P((evContext, int, const void *, int,
|
||||
evConnFunc, void *, evConnID *));
|
||||
int evCancelConn __P((evContext, evConnID));
|
||||
int evHold __P((evContext, evConnID));
|
||||
int evUnhold __P((evContext, evConnID));
|
||||
int evTryAccept __P((evContext, evConnID, int *));
|
||||
@ -117,9 +115,8 @@ int evTryAccept __P((evContext, evConnID, int *));
|
||||
#define evSelectFD __evSelectFD
|
||||
#define evDeselectFD __evDeselectFD
|
||||
|
||||
int evSelectFD __P((evContext ctx, int fd, int eventmask,
|
||||
evFileFunc func, void *uap, evFileID *id));
|
||||
int evDeselectFD __P((evContext ctx, evFileID id));
|
||||
int evSelectFD __P((evContext, int, int, evFileFunc, void *, evFileID *));
|
||||
int evDeselectFD __P((evContext, evFileID));
|
||||
|
||||
/* ev_streams.c */
|
||||
#define evConsIovec __evConsIovec
|
||||
@ -129,14 +126,14 @@ int evDeselectFD __P((evContext ctx, evFileID id));
|
||||
#define evUntimeRW __evUntimeRW
|
||||
#define evCancelRW __evCancelRW
|
||||
|
||||
struct iovec evConsIovec __P((void *buf, size_t cnt));
|
||||
int evWrite __P((evContext ctx, int fd, const struct iovec *iov, int cnt,
|
||||
evStreamFunc func, void *uap, evStreamID *id));
|
||||
int evRead __P((evContext ctx, int fd, const struct iovec *iov, int cnt,
|
||||
evStreamFunc func, void *uap, evStreamID *id));
|
||||
int evTimeRW __P((evContext ctx, evStreamID id, evTimerID timer));
|
||||
int evUntimeRW __P((evContext ctx, evStreamID id));
|
||||
int evCancelRW __P((evContext ctx, evStreamID id));
|
||||
struct iovec evConsIovec __P((void *, size_t));
|
||||
int evWrite __P((evContext, int, const struct iovec *, int,
|
||||
evStreamFunc func, void *, evStreamID *));
|
||||
int evRead __P((evContext, int, const struct iovec *, int,
|
||||
evStreamFunc func, void *, evStreamID *));
|
||||
int evTimeRW __P((evContext, evStreamID, evTimerID timer));
|
||||
int evUntimeRW __P((evContext, evStreamID));
|
||||
int evCancelRW __P((evContext, evStreamID));
|
||||
|
||||
/* ev_timers.c */
|
||||
#define evConsTime __evConsTime
|
||||
@ -157,17 +154,16 @@ int evCancelRW __P((evContext ctx, evStreamID id));
|
||||
#define evTouchIdleTimer __evTouchIdleTimer
|
||||
|
||||
struct timespec evConsTime __P((time_t sec, long nsec));
|
||||
struct timespec evAddTime __P((struct timespec add1, struct timespec add2));
|
||||
struct timespec evSubTime __P((struct timespec minu, struct timespec subtra));
|
||||
struct timespec evAddTime __P((struct timespec, struct timespec));
|
||||
struct timespec evSubTime __P((struct timespec, struct timespec));
|
||||
struct timespec evNowTime __P((void));
|
||||
struct timespec evLastEventTime __P((evContext));
|
||||
struct timespec evTimeSpec __P((struct timeval));
|
||||
struct timeval evTimeVal __P((struct timespec));
|
||||
int evCmpTime __P((struct timespec a, struct timespec b));
|
||||
int evSetTimer __P((evContext ctx, evTimerFunc func, void *uap,
|
||||
struct timespec due, struct timespec inter,
|
||||
evTimerID *id));
|
||||
int evClearTimer __P((evContext ctx, evTimerID id));
|
||||
int evCmpTime __P((struct timespec, struct timespec));
|
||||
int evSetTimer __P((evContext, evTimerFunc, void *, struct timespec,
|
||||
struct timespec, evTimerID *));
|
||||
int evClearTimer __P((evContext, evTimerID));
|
||||
int evResetTimer __P((evContext, evTimerID, evTimerFunc, void *,
|
||||
struct timespec, struct timespec));
|
||||
int evSetIdleTimer __P((evContext, evTimerFunc, void *, struct timespec,
|
||||
@ -183,10 +179,9 @@ int evTouchIdleTimer __P((evContext, evTimerID));
|
||||
#define evUnwait __evUnwait
|
||||
#define evDefer __evDefer
|
||||
|
||||
int evWaitFor __P((evContext ctx, const void *tag, evWaitFunc func, void *uap,
|
||||
evWaitID *id));
|
||||
int evDo __P((evContext ctx, const void *tag));
|
||||
int evUnwait __P((evContext ctx, evWaitID id));
|
||||
int evWaitFor __P((evContext, const void *, evWaitFunc, void *, evWaitID *));
|
||||
int evDo __P((evContext, const void *));
|
||||
int evUnwait __P((evContext, evWaitID));
|
||||
int evDefer __P((evContext, evWaitFunc, void *));
|
||||
|
||||
#ifdef __EVENTLIB_P_DEFINED
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* $Id: irpmarshall.h,v 8.2 2001/05/29 05:47:10 marka Exp $
|
||||
* $Id: irpmarshall.h,v 8.2.10.1 2003/06/02 06:04:03 marka Exp $
|
||||
*/
|
||||
|
||||
#ifndef _IRPMARSHALL_H_INCLUDED
|
||||
@ -45,24 +45,23 @@
|
||||
(x == AF_INET6 ? "AF_INET6" : "UNKNOWN"))
|
||||
|
||||
/* See comment below on usage */
|
||||
int irp_marshall_pw(const struct passwd *pw, char **buffer, size_t *len);
|
||||
int irp_unmarshall_pw(struct passwd *pw, char *buffer);
|
||||
int irp_marshall_gr(const struct group *gr, char **buffer, size_t *len);
|
||||
int irp_unmarshall_gr(struct group *gr, char *buffer);
|
||||
int irp_marshall_sv(const struct servent *sv, char **buffer, size_t *len);
|
||||
int irp_unmarshall_sv(struct servent *sv, char *buffer);
|
||||
int irp_marshall_pr(struct protoent *pr, char **buffer, size_t *len);
|
||||
int irp_unmarshall_pr(struct protoent *pr, char *buffer);
|
||||
int irp_marshall_ho(struct hostent *ho, char **buffer, size_t *len);
|
||||
int irp_unmarshall_ho(struct hostent *ho, char *buffer);
|
||||
int irp_marshall_ng(const char *host, const char *user, const char *domain,
|
||||
char **buffer, size_t *len);
|
||||
int irp_unmarshall_ng(const char **host, const char **user,
|
||||
const char **domain, char *buffer);
|
||||
int irp_marshall_nw(struct nwent *ne, char **buffer, size_t *len);
|
||||
int irp_unmarshall_nw(struct nwent *ne, char *buffer);
|
||||
int irp_marshall_ne(struct netent *ne, char **buffer, size_t *len);
|
||||
int irp_unmarshall_ne(struct netent *ne, char *buffer);
|
||||
int irp_marshall_pw(const struct passwd *, char **, size_t *);
|
||||
int irp_unmarshall_pw(struct passwd *, char *);
|
||||
int irp_marshall_gr(const struct group *, char **, size_t *);
|
||||
int irp_unmarshall_gr(struct group *, char *);
|
||||
int irp_marshall_sv(const struct servent *, char **, size_t *);
|
||||
int irp_unmarshall_sv(struct servent *, char *);
|
||||
int irp_marshall_pr(struct protoent *, char **, size_t *);
|
||||
int irp_unmarshall_pr(struct protoent *, char *);
|
||||
int irp_marshall_ho(struct hostent *, char **, size_t *);
|
||||
int irp_unmarshall_ho(struct hostent *, char *);
|
||||
int irp_marshall_ng(const char *, const char *, const char *,
|
||||
char **, size_t *);
|
||||
int irp_unmarshall_ng(const char **, const char **, const char **, char *);
|
||||
int irp_marshall_nw(struct nwent *, char **, size_t *);
|
||||
int irp_unmarshall_nw(struct nwent *, char *);
|
||||
int irp_marshall_ne(struct netent *, char **, size_t *);
|
||||
int irp_unmarshall_ne(struct netent *, char *);
|
||||
|
||||
/*
|
||||
* Functions to marshall and unmarshall various system data structures. We
|
||||
|
@ -80,12 +80,15 @@ FILE * log_get_stream(log_channel);
|
||||
char * log_get_filename(log_channel);
|
||||
int log_check_channel(log_context, int, log_channel);
|
||||
int log_check(log_context, int, int);
|
||||
void log_vwrite(log_context, int, int, const char *,
|
||||
va_list args);
|
||||
#ifdef __GNUC__
|
||||
void log_vwrite(log_context, int, int, const char *,
|
||||
va_list args)
|
||||
__attribute__((__format__(__printf__, 4, 0)));
|
||||
void log_write(log_context, int, int, const char *, ...)
|
||||
__attribute__((__format__(__printf__, 4, 5)));
|
||||
#else
|
||||
void log_vwrite(log_context, int, int, const char *,
|
||||
va_list args);
|
||||
void log_write(log_context, int, int, const char *, ...);
|
||||
#endif
|
||||
int log_new_context(int, char **, log_context *);
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* $Id: misc.h,v 8.5 2001/06/18 06:40:43 marka Exp $
|
||||
* $Id: misc.h,v 8.5.10.1 2003/06/02 06:04:03 marka Exp $
|
||||
*/
|
||||
|
||||
#ifndef _ISC_MISC_H
|
||||
@ -27,7 +27,7 @@
|
||||
#define bitncmp __bitncmp
|
||||
/*#define isc_movefile __isc_movefile */
|
||||
|
||||
extern int bitncmp(const void *l, const void *r, int n);
|
||||
extern int bitncmp(const void *, const void *, int);
|
||||
extern int isc_movefile(const char *, const char *);
|
||||
|
||||
extern int isc_gethexstring(unsigned char *, size_t, int, FILE *,
|
||||
|
@ -3,7 +3,7 @@
|
||||
* vix 22jan93 [revisited; uses RCS, ANSI, POSIX; has bug fixes]
|
||||
* vix 27jun86 [broken out of tree.c]
|
||||
*
|
||||
* $Id: tree.h,v 8.2 1996/10/25 18:11:03 vixie Exp $
|
||||
* $Id: tree.h,v 8.3 2002/12/03 05:26:48 marka Exp $
|
||||
*/
|
||||
|
||||
|
||||
@ -28,6 +28,16 @@ typedef void *tree_t;
|
||||
typedef char *tree_t;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Do not taint namespace
|
||||
*/
|
||||
#define tree_add __tree_add
|
||||
#define tree_delete __tree_delete
|
||||
#define tree_init __tree_init
|
||||
#define tree_mung __tree_mung
|
||||
#define tree_srch __tree_srch
|
||||
#define tree_trav __tree_trav
|
||||
|
||||
|
||||
typedef struct tree_s {
|
||||
tree_t data;
|
||||
|
@ -1,17 +1,19 @@
|
||||
#ifndef netgroup_h
|
||||
#define netgroup_h
|
||||
|
||||
int getnetgrent(const char **machinep, const char **userp,
|
||||
const char **domainp);
|
||||
/*
|
||||
* The standard is crazy. These values "belong" to getnetgrent() and
|
||||
* shouldn't be altered by the caller.
|
||||
*/
|
||||
int getnetgrent __P((/* const */ char **, /* const */ char **,
|
||||
/* const */ char **));
|
||||
|
||||
int getnetgrent_r(char **machinep, char **userp, char **domainp,
|
||||
char *buffer, int buflen);
|
||||
int getnetgrent_r __P((char **, char **, char **, char *, int));
|
||||
|
||||
void setnetgrent(const char *netgroup);
|
||||
void setnetgrent __P((const char *));
|
||||
|
||||
void endnetgrent(void);
|
||||
void endnetgrent __P((void));
|
||||
|
||||
int innetgr(const char *netgroup, const char *machine,
|
||||
const char *user, const char *domain);
|
||||
int innetgr __P((const char *, const char *, const char *, const char *));
|
||||
|
||||
#endif
|
||||
|
@ -50,7 +50,7 @@
|
||||
|
||||
/*
|
||||
* @(#)resolv.h 8.1 (Berkeley) 6/2/93
|
||||
* $Id: resolv.h,v 8.48 2002/05/31 06:05:29 marka Exp $
|
||||
* $Id: resolv.h,v 8.50.6.2 2003/06/02 06:01:16 marka Exp $
|
||||
*/
|
||||
|
||||
#ifndef _RESOLV_H_
|
||||
@ -75,7 +75,7 @@
|
||||
* is new enough to contain a certain feature.
|
||||
*/
|
||||
|
||||
#define __RES 19991006
|
||||
#define __RES 20030124
|
||||
|
||||
/*
|
||||
* This used to be defined in res_query.c, now it's in herror.c.
|
||||
@ -105,7 +105,7 @@ __END_DECLS
|
||||
/*
|
||||
* Resolver configuration file.
|
||||
* Normally not present, but may contain the address of the
|
||||
* inital name server(s) to query and the domain search list.
|
||||
* initial name server(s) to query and the domain search list.
|
||||
*/
|
||||
|
||||
#ifndef _PATH_RESCONF
|
||||
@ -115,19 +115,13 @@ __END_DECLS
|
||||
typedef enum { res_goahead, res_nextns, res_modified, res_done, res_error }
|
||||
res_sendhookact;
|
||||
|
||||
typedef res_sendhookact (*res_send_qhook)__P((struct sockaddr * const *ns,
|
||||
const u_char **query,
|
||||
int *querylen,
|
||||
u_char *ans,
|
||||
int anssiz,
|
||||
int *resplen));
|
||||
typedef res_sendhookact (*res_send_qhook)__P((struct sockaddr * const *,
|
||||
const u_char **, int *,
|
||||
u_char *, int, int *));
|
||||
|
||||
typedef res_sendhookact (*res_send_rhook)__P((const struct sockaddr *ns,
|
||||
const u_char *query,
|
||||
int querylen,
|
||||
u_char *ans,
|
||||
int anssiz,
|
||||
int *resplen));
|
||||
typedef res_sendhookact (*res_send_rhook)__P((const struct sockaddr *,
|
||||
const u_char *, int, u_char *,
|
||||
int, int *));
|
||||
|
||||
struct res_sym {
|
||||
int number; /* Identifying number, like T_MX */
|
||||
@ -154,7 +148,7 @@ struct res_sym {
|
||||
struct __res_state_ext;
|
||||
|
||||
struct __res_state {
|
||||
int retrans; /* retransmition time interval */
|
||||
int retrans; /* retransmission time interval */
|
||||
int retry; /* number of times to retransmit */
|
||||
#ifdef sun
|
||||
u_int options; /* option flags - see below. */
|
||||
@ -219,6 +213,10 @@ union res_sockaddr_union {
|
||||
#define RES_F_VC 0x00000001 /* socket is TCP */
|
||||
#define RES_F_CONN 0x00000002 /* socket is connected */
|
||||
#define RES_F_EDNS0ERR 0x00000004 /* EDNS0 caused errors */
|
||||
#define RES_F__UNUSED 0x00000008 /* (unused) */
|
||||
#define RES_F_LASTMASK 0x000000F0 /* ordinal server of last res_nsend */
|
||||
#define RES_F_LASTSHIFT 4 /* bit position of LASTMASK "flag" */
|
||||
#define RES_GETLAST(res) (((res)._flags & RES_F_LASTMASK) >> RES_F_LASTSHIFT)
|
||||
|
||||
/* res_findzonecut2() options */
|
||||
#define RES_EXHAUSTIVE 0x00000001 /* always do all queries */
|
||||
@ -246,13 +244,10 @@ union res_sockaddr_union {
|
||||
#define RES_NOCHECKNAME 0x00008000 /* do not check names for sanity. */
|
||||
#define RES_KEEPTSIG 0x00010000 /* do not strip TSIG records */
|
||||
#define RES_BLAST 0x00020000 /* blast all recursive servers */
|
||||
#define RES_NO_NIBBLE 0x00040000 /* disable IPv6 nibble mode reverse */
|
||||
#define RES_NO_BITSTRING 0x00080000 /* disable IPv6 bitstring mode reverse */
|
||||
#define RES_NOTLDQUERY 0x00100000 /* don't unqualified name as a tld */
|
||||
#define RES_USE_DNSSEC 0x00200000 /* use DNSSEC using OK bit in OPT */
|
||||
/* KAME extensions: use higher bit to avoid conflict with ISC use */
|
||||
#define RES_USE_DNAME 0x10000000 /* use DNAME */
|
||||
#define RES_USE_A6 0x20000000 /* use A6 */
|
||||
#define RES_USE_EDNS0 0x40000000 /* use EDNS0 if configured */
|
||||
#define RES_NO_NIBBLE2 0x80000000 /* disable alternate nibble lookup */
|
||||
|
||||
@ -361,6 +356,7 @@ extern const struct res_sym __p_rcode_syms[];
|
||||
#define p_time __p_time
|
||||
#define p_type __p_type
|
||||
#define p_rcode __p_rcode
|
||||
#define p_sockun __p_sockun
|
||||
#define putlong __putlong
|
||||
#define putshort __putshort
|
||||
#define res_dnok __res_dnok
|
||||
@ -392,6 +388,18 @@ extern const struct res_sym __p_rcode_syms[];
|
||||
#define res_nametotype __res_nametotype
|
||||
#define res_setservers __res_setservers
|
||||
#define res_getservers __res_getservers
|
||||
#define res_buildprotolist __res_buildprotolist
|
||||
#define res_destroyprotolist __res_destroyprotolist
|
||||
#define res_destroyservicelist __res_destroyservicelist
|
||||
#define res_get_nibblesuffix __res_get_nibblesuffix
|
||||
#define res_get_nibblesuffix2 __res_get_nibblesuffix2
|
||||
#define res_ourserver_p __res_ourserver_p
|
||||
#define res_protocolname __res_protocolname
|
||||
#define res_protocolnumber __res_protocolnumber
|
||||
#define res_send_setqhook __res_send_setqhook
|
||||
#define res_send_setrhook __res_send_setrhook
|
||||
#define res_servicename __res_servicename
|
||||
#define res_servicenumber __res_servicenumber
|
||||
__BEGIN_DECLS
|
||||
int res_hnok __P((const char *));
|
||||
int res_ownok __P((const char *));
|
||||
@ -402,25 +410,26 @@ const char * sym_ntos __P((const struct res_sym *, int, int *));
|
||||
const char * sym_ntop __P((const struct res_sym *, int, int *));
|
||||
int b64_ntop __P((u_char const *, size_t, char *, size_t));
|
||||
int b64_pton __P((char const *, u_char *, size_t));
|
||||
int loc_aton __P((const char *ascii, u_char *binary));
|
||||
const char * loc_ntoa __P((const u_char *binary, char *ascii));
|
||||
int loc_aton __P((const char *, u_char *));
|
||||
const char * loc_ntoa __P((const u_char *, char *));
|
||||
int dn_skipname __P((const u_char *, const u_char *));
|
||||
void putlong __P((u_int32_t, u_char *));
|
||||
void putshort __P((u_int16_t, u_char *));
|
||||
#ifndef __ultrix__
|
||||
u_int16_t _getshort __P((const u_char *src));
|
||||
u_int32_t _getlong __P((const u_char *src));
|
||||
u_int16_t _getshort __P((const u_char *));
|
||||
u_int32_t _getlong __P((const u_char *));
|
||||
#endif
|
||||
const char * p_class __P((int));
|
||||
const char * p_time __P((u_int32_t));
|
||||
const char * p_type __P((int));
|
||||
const char * p_rcode __P((int));
|
||||
const char * p_sockun __P((union res_sockaddr_union, char *, size_t));
|
||||
const u_char * p_cdnname __P((const u_char *, const u_char *, int, FILE *));
|
||||
const u_char * p_cdname __P((const u_char *, const u_char *, FILE *));
|
||||
const u_char * p_fqnname __P((const u_char *cp, const u_char *msg,
|
||||
const u_char * p_fqnname __P((const u_char *, const u_char *,
|
||||
int, char *, int));
|
||||
const u_char * p_fqname __P((const u_char *, const u_char *, FILE *));
|
||||
const char * p_option __P((u_long option));
|
||||
const char * p_option __P((u_long));
|
||||
char * p_secstodate __P((u_long));
|
||||
int dn_count_labels __P((const char *));
|
||||
int dn_comp __P((const char *, u_char *, int,
|
||||
@ -428,11 +437,11 @@ int dn_comp __P((const char *, u_char *, int,
|
||||
int dn_expand __P((const u_char *, const u_char *, const u_char *,
|
||||
char *, int));
|
||||
u_int res_randomid __P((void));
|
||||
int res_nameinquery __P((const char *, int, int,
|
||||
const u_char *, const u_char *));
|
||||
int res_nameinquery __P((const char *, int, int, const u_char *,
|
||||
const u_char *));
|
||||
int res_queriesmatch __P((const u_char *, const u_char *,
|
||||
const u_char *, const u_char *));
|
||||
const char * p_section __P((int section, int opcode));
|
||||
const char * p_section __P((int, int));
|
||||
/* Things involving a resolver context. */
|
||||
int res_ninit __P((res_state));
|
||||
int res_nisourserver __P((const res_state,
|
||||
@ -441,16 +450,15 @@ void fp_resstat __P((const res_state, FILE *));
|
||||
void res_pquery __P((const res_state, const u_char *, int, FILE *));
|
||||
const char * res_hostalias __P((const res_state, const char *,
|
||||
char *, size_t));
|
||||
int res_nquery __P((res_state,
|
||||
const char *, int, int, u_char *, int));
|
||||
int res_nsearch __P((res_state, const char *, int,
|
||||
int, u_char *, int));
|
||||
int res_nquerydomain __P((res_state,
|
||||
const char *, const char *, int, int,
|
||||
u_char *, int));
|
||||
int res_nmkquery __P((res_state,
|
||||
int, const char *, int, int, const u_char *,
|
||||
int, const u_char *, u_char *, int));
|
||||
int res_nquery __P((res_state, const char *, int, int,
|
||||
u_char *, int));
|
||||
int res_nsearch __P((res_state, const char *, int, int, u_char *,
|
||||
int));
|
||||
int res_nquerydomain __P((res_state, const char *, const char *,
|
||||
int, int, u_char *, int));
|
||||
int res_nmkquery __P((res_state, int, const char *, int, int,
|
||||
const u_char *, int, const u_char *,
|
||||
u_char *, int));
|
||||
int res_nsend __P((res_state, const u_char *, int, u_char *, int));
|
||||
int res_nsendsigned __P((res_state, const u_char *, int,
|
||||
ns_tsig_key *, u_char *, int));
|
||||
@ -461,20 +469,19 @@ int res_findzonecut2 __P((res_state, const char *, ns_class, int,
|
||||
union res_sockaddr_union *, int));
|
||||
void res_nclose __P((res_state));
|
||||
int res_nopt __P((res_state, int, u_char *, int, int));
|
||||
void res_send_setqhook __P((res_send_qhook hook));
|
||||
void res_send_setrhook __P((res_send_rhook hook));
|
||||
void res_send_setqhook __P((res_send_qhook));
|
||||
void res_send_setrhook __P((res_send_rhook));
|
||||
int __res_vinit __P((res_state, int));
|
||||
void res_destroyservicelist __P((void));
|
||||
const char * res_servicename __P((u_int16_t port, const char *proto));
|
||||
const char * res_protocolname __P((int num));
|
||||
const char * res_servicename __P((u_int16_t, const char *));
|
||||
const char * res_protocolname __P((int));
|
||||
void res_destroyprotolist __P((void));
|
||||
void res_buildprotolist __P((void));
|
||||
const char * res_get_nibblesuffix __P((res_state));
|
||||
const char * res_get_nibblesuffix2 __P((res_state));
|
||||
const char * res_get_bitstringsuffix __P((res_state));
|
||||
void res_ndestroy __P((res_state));
|
||||
u_int16_t res_nametoclass __P((const char *buf, int *success));
|
||||
u_int16_t res_nametotype __P((const char *buf, int *success));
|
||||
u_int16_t res_nametoclass __P((const char *, int *));
|
||||
u_int16_t res_nametotype __P((const char *, int *));
|
||||
void res_setservers __P((res_state,
|
||||
const union res_sockaddr_union *, int));
|
||||
int res_getservers __P((res_state,
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if defined(BSAFE) || defined(DNSSAFE)
|
||||
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/bsafe_link.c,v 1.15 2001/09/25 04:50:28 marka Exp $";
|
||||
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/bsafe_link.c,v 1.16 2002/12/03 05:26:49 marka Exp $";
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
|
||||
@ -1113,6 +1113,8 @@ T_realloc(POINTER block, unsigned int len)
|
||||
}
|
||||
|
||||
#else /* BSAFE NOT available */
|
||||
#define dst_bsafe_init __dst_bsafe_init
|
||||
|
||||
int
|
||||
dst_bsafe_init()
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifdef CYLINK_DSS
|
||||
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/cylink_link.c,v 1.9 2001/05/29 05:48:05 marka Exp $";
|
||||
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/cylink_link.c,v 1.10 2002/12/03 05:26:49 marka Exp $";
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
|
||||
@ -662,6 +662,8 @@ memcpyend(void *dest, const void *src, size_t n, size_t size) {
|
||||
}
|
||||
|
||||
#else
|
||||
#define dst_cylink_init __dst_cylink_init
|
||||
|
||||
int
|
||||
dst_cylink_init()
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef LINT
|
||||
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/dst_api.c,v 1.20 2001/07/26 01:20:08 marka Exp $";
|
||||
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/dst_api.c,v 1.21 2002/06/28 06:58:19 marka Exp $";
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -217,7 +217,6 @@ dst_compare_keys(const DST_KEY *key1, const DST_KEY *key2)
|
||||
* Then data is hashed (SIG_MODE_UPDATE). Finally the signature
|
||||
* itself is created (SIG_MODE_FINAL). This function can be called
|
||||
* once with INIT, UPDATE and FINAL modes all set, or it can be
|
||||
|
||||
* called separately with a different mode set for each step. The
|
||||
* UPDATE step can be repeated.
|
||||
* Parameters
|
||||
@ -457,7 +456,7 @@ dst_s_write_private_key(const DST_KEY *key)
|
||||
* filename of the key file to be read.
|
||||
* Returns
|
||||
* NULL If the key does not exist or no name is supplied.
|
||||
* NON-NULL Initalized key structure if the key exists.
|
||||
* NON-NULL Initialized key structure if the key exists.
|
||||
*/
|
||||
|
||||
static DST_KEY *
|
||||
|
@ -1,6 +1,6 @@
|
||||
#ifdef HMAC_MD5
|
||||
#ifndef LINT
|
||||
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/hmac_link.c,v 1.9 2001/05/29 05:48:10 marka Exp $";
|
||||
static const char rcsid[] = "$Header: /proj/cvs/isc/bind8/src/lib/dst/hmac_link.c,v 1.10 2002/12/03 05:26:49 marka Exp $";
|
||||
#endif
|
||||
/*
|
||||
* Portions Copyright (c) 1995-1998 by Trusted Information Systems, Inc.
|
||||
@ -481,15 +481,10 @@ dst_hmac_md5_init()
|
||||
}
|
||||
|
||||
#else
|
||||
#define dst_hmac_md5_init __dst_hmac_md5_init
|
||||
|
||||
int
|
||||
dst_hmac_md5_init(){
|
||||
return (0);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char rcsid[] = "$Id: dns_gr.c,v 1.20 2001/05/29 05:48:27 marka Exp $";
|
||||
static const char rcsid[] = "$Id: dns_gr.c,v 1.21 2002/07/08 06:26:09 marka Exp $";
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -226,7 +226,7 @@ get_hes_group(struct irs_gr *this, const char *name, const char *type) {
|
||||
goto cleanup;
|
||||
*cp++ = '\0';
|
||||
|
||||
errno = -1;
|
||||
errno = 0;
|
||||
t = strtoul(cp, NULL, 10);
|
||||
if (errno == ERANGE)
|
||||
goto cleanup;
|
||||
|
@ -52,7 +52,7 @@
|
||||
/* BIND Id: gethnamaddr.c,v 8.15 1996/05/22 04:56:30 vixie Exp $ */
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char rcsid[] = "$Id: dns_ho.c,v 1.39 2002/06/27 03:56:32 marka Exp $";
|
||||
static const char rcsid[] = "$Id: dns_ho.c,v 1.42.6.1 2003/06/02 09:24:40 marka Exp $";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
/* Imports. */
|
||||
@ -95,7 +95,7 @@ static const char rcsid[] = "$Id: dns_ho.c,v 1.39 2002/06/27 03:56:32 marka Exp
|
||||
#define MAXALIASES 35
|
||||
#define MAXADDRS 35
|
||||
|
||||
#define MAXPACKET (1024*64)
|
||||
#define MAXPACKET (65535) /* Maximum TCP message size */
|
||||
|
||||
#define BOUNDS_CHECK(ptr, count) \
|
||||
if ((ptr) + (count) > eom) { \
|
||||
@ -172,15 +172,6 @@ static struct hostent * gethostans(struct irs_ho *this,
|
||||
const struct addrinfo *pai);
|
||||
static int add_hostent(struct pvt *pvt, char *bp, char **hap,
|
||||
struct addrinfo *ai);
|
||||
static const u_char * ar_head(const u_char *, int, const u_char *,
|
||||
const u_char *, struct pvt *,
|
||||
int (*)(const char *));
|
||||
static struct addrinfo * a6_expand(const u_char *, const u_char *, int,
|
||||
const u_char *, const u_char *,
|
||||
const struct in6_addr *, int,
|
||||
const struct addrinfo *,
|
||||
struct pvt *, int (*)(const char *), int *);
|
||||
static const char *dname_subst(const char *, const char *, const char *);
|
||||
static int init(struct irs_ho *this);
|
||||
|
||||
/* Exports. */
|
||||
@ -257,21 +248,19 @@ ho_byname2(struct irs_ho *this, const char *name, int af)
|
||||
char tmp[NS_MAXDNAME];
|
||||
const char *cp;
|
||||
struct addrinfo ai;
|
||||
struct dns_res_target *q, *q2, *p;
|
||||
struct dns_res_target *q, *p;
|
||||
int querystate = RESQRY_FAIL;
|
||||
|
||||
if (init(this) == -1)
|
||||
return (NULL);
|
||||
|
||||
q = memget(sizeof(*q));
|
||||
q2 = memget(sizeof(*q2));
|
||||
if (q == NULL || q2 == NULL) {
|
||||
if (q == NULL) {
|
||||
RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL);
|
||||
errno = ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
memset(q, 0, sizeof(q));
|
||||
memset(q2, 0, sizeof(q2));
|
||||
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
@ -285,21 +274,10 @@ ho_byname2(struct irs_ho *this, const char *name, int af)
|
||||
case AF_INET6:
|
||||
size = IN6ADDRSZ;
|
||||
q->qclass = C_IN;
|
||||
q->qtype = ns_t_a6;
|
||||
q->qtype = T_AAAA;
|
||||
q->answer = q->qbuf.buf;
|
||||
q->anslen = sizeof(q->qbuf);
|
||||
q->next = q2;
|
||||
#ifdef RES_USE_A6
|
||||
if ((pvt->res->options & RES_USE_A6) == 0)
|
||||
q->action = RESTGT_IGNORE;
|
||||
else
|
||||
#endif
|
||||
q->action = RESTGT_DOALWAYS;
|
||||
q2->qclass = C_IN;
|
||||
q2->qtype = T_AAAA;
|
||||
q2->answer = q2->qbuf.buf;
|
||||
q2->anslen = sizeof(q2->qbuf);
|
||||
q2->action = RESTGT_AFTERFAILURE;
|
||||
q->action = RESTGT_DOALWAYS;
|
||||
break;
|
||||
default:
|
||||
RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL);
|
||||
@ -349,8 +327,6 @@ ho_byname2(struct irs_ho *this, const char *name, int af)
|
||||
cleanup:
|
||||
if (q != NULL)
|
||||
memput(q, sizeof(*q));
|
||||
if (q2 != NULL)
|
||||
memput(q2, sizeof(*q2));
|
||||
return(hp);
|
||||
}
|
||||
|
||||
@ -363,7 +339,7 @@ ho_byaddr(struct irs_ho *this, const void *addr, int len, int af)
|
||||
struct hostent *hp = NULL;
|
||||
struct addrinfo ai;
|
||||
struct dns_res_target *q, *q2, *p;
|
||||
int n, size;
|
||||
int n, size, i;
|
||||
int querystate = RESQRY_FAIL;
|
||||
|
||||
if (init(this) == -1)
|
||||
@ -440,20 +416,36 @@ ho_byaddr(struct irs_ho *this, const void *addr, int len, int af)
|
||||
if (q->action != RESTGT_IGNORE) {
|
||||
qp = q->qname;
|
||||
for (n = IN6ADDRSZ - 1; n >= 0; n--) {
|
||||
qp += SPRINTF((qp, "%x.%x.",
|
||||
i = SPRINTF((qp, "%x.%x.",
|
||||
uaddr[n] & 0xf,
|
||||
(uaddr[n] >> 4) & 0xf));
|
||||
if (i < 0)
|
||||
abort();
|
||||
qp += i;
|
||||
}
|
||||
#ifdef HAVE_STRLCAT
|
||||
strlcat(q->qname, res_get_nibblesuffix(pvt->res),
|
||||
sizeof(q->qname));
|
||||
#else
|
||||
strcpy(qp, res_get_nibblesuffix(pvt->res));
|
||||
#endif
|
||||
}
|
||||
if (q2->action != RESTGT_IGNORE) {
|
||||
qp = q2->qname;
|
||||
for (n = IN6ADDRSZ - 1; n >= 0; n--) {
|
||||
qp += SPRINTF((qp, "%x.%x.",
|
||||
i = SPRINTF((qp, "%x.%x.",
|
||||
uaddr[n] & 0xf,
|
||||
(uaddr[n] >> 4) & 0xf));
|
||||
if (i < 0)
|
||||
abort();
|
||||
qp += i;
|
||||
}
|
||||
#ifdef HAVE_STRLCAT
|
||||
strlcat(q->qname, res_get_nibblesuffix2(pvt->res),
|
||||
sizeof(q->qname));
|
||||
#else
|
||||
strcpy(qp, res_get_nibblesuffix2(pvt->res));
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -563,7 +555,7 @@ ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai)
|
||||
int n;
|
||||
char tmp[NS_MAXDNAME];
|
||||
const char *cp;
|
||||
struct dns_res_target *q, *q2, *q3, *p;
|
||||
struct dns_res_target *q, *q2, *p;
|
||||
struct addrinfo sentinel, *cur;
|
||||
int querystate = RESQRY_FAIL;
|
||||
|
||||
@ -575,42 +567,28 @@ ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai)
|
||||
|
||||
q = memget(sizeof(*q));
|
||||
q2 = memget(sizeof(*q2));
|
||||
q3 = memget(sizeof(*q3));
|
||||
if (q == NULL || q2 == NULL || q3 == NULL) {
|
||||
if (q == NULL || q2 == NULL) {
|
||||
RES_SET_H_ERRNO(pvt->res, NETDB_INTERNAL);
|
||||
errno = ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
memset(q, 0, sizeof(q2));
|
||||
memset(q2, 0, sizeof(q2));
|
||||
memset(q3, 0, sizeof(q3));
|
||||
|
||||
switch (pai->ai_family) {
|
||||
case AF_UNSPEC:
|
||||
/* prefer IPv6 */
|
||||
q->qclass = C_IN;
|
||||
q->qtype = ns_t_a6;
|
||||
q->qtype = T_AAAA;
|
||||
q->answer = q->qbuf.buf;
|
||||
q->anslen = sizeof(q->qbuf);
|
||||
q->next = q2;
|
||||
#ifdef RES_USE_A6
|
||||
if ((pvt->res->options & RES_USE_A6) == 0)
|
||||
q->action = RESTGT_IGNORE;
|
||||
else
|
||||
#endif
|
||||
q->action = RESTGT_DOALWAYS;
|
||||
q->action = RESTGT_DOALWAYS;
|
||||
q2->qclass = C_IN;
|
||||
q2->qtype = T_AAAA;
|
||||
q2->qtype = T_A;
|
||||
q2->answer = q2->qbuf.buf;
|
||||
q2->anslen = sizeof(q2->qbuf);
|
||||
q2->next = q3;
|
||||
/* try AAAA only when A6 query fails */
|
||||
q2->action = RESTGT_AFTERFAILURE;
|
||||
q3->qclass = C_IN;
|
||||
q3->qtype = T_A;
|
||||
q3->answer = q3->qbuf.buf;
|
||||
q3->anslen = sizeof(q3->qbuf);
|
||||
q3->action = RESTGT_DOALWAYS;
|
||||
q2->action = RESTGT_DOALWAYS;
|
||||
break;
|
||||
case AF_INET:
|
||||
q->qclass = C_IN;
|
||||
@ -621,21 +599,10 @@ ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai)
|
||||
break;
|
||||
case AF_INET6:
|
||||
q->qclass = C_IN;
|
||||
q->qtype = ns_t_a6;
|
||||
q->qtype = T_AAAA;
|
||||
q->answer = q->qbuf.buf;
|
||||
q->anslen = sizeof(q->qbuf);
|
||||
q->next = q2;
|
||||
#ifdef RES_USE_A6
|
||||
if ((pvt->res->options & RES_USE_A6) == 0)
|
||||
q->action = RESTGT_IGNORE;
|
||||
else
|
||||
#endif
|
||||
q->action = RESTGT_DOALWAYS;
|
||||
q2->qclass = C_IN;
|
||||
q2->qtype = T_AAAA;
|
||||
q2->answer = q2->qbuf.buf;
|
||||
q2->anslen = sizeof(q2->qbuf);
|
||||
q2->action = RESTGT_AFTERFAILURE;
|
||||
q->action = RESTGT_DOALWAYS;
|
||||
break;
|
||||
default:
|
||||
RES_SET_H_ERRNO(pvt->res, NO_RECOVERY); /* better error? */
|
||||
@ -688,375 +655,9 @@ ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai)
|
||||
memput(q, sizeof(*q));
|
||||
if (q2 != NULL)
|
||||
memput(q2, sizeof(*q2));
|
||||
if (q3 != NULL)
|
||||
memput(q3, sizeof(*q3));
|
||||
return(sentinel.ai_next);
|
||||
}
|
||||
|
||||
static const u_char *
|
||||
ar_head(cp, count, msg, eom, pvt, name_ok)
|
||||
const u_char *cp, *msg, *eom;
|
||||
int count;
|
||||
struct pvt *pvt;
|
||||
int (*name_ok)(const char *);
|
||||
{
|
||||
int n;
|
||||
char buf[1024]; /* XXX */
|
||||
|
||||
while (count-- > 0 && cp < eom) {
|
||||
n = dn_expand(msg, eom, cp, buf, sizeof(buf));
|
||||
if (n < 0 || !maybe_ok(pvt->res, buf, name_ok))
|
||||
goto end;
|
||||
cp += n; /* name */
|
||||
if (cp + 3 * INT16SZ + INT32SZ >= eom)
|
||||
goto end;
|
||||
cp += INT16SZ; /* type */
|
||||
cp += INT16SZ + INT32SZ; /* class, TTL */
|
||||
n = ns_get16(cp);
|
||||
cp += n + INT16SZ; /* len */
|
||||
}
|
||||
return(cp);
|
||||
|
||||
end:
|
||||
return(eom); /* XXX */
|
||||
}
|
||||
|
||||
/* XXX: too many arguments */
|
||||
static struct addrinfo *
|
||||
a6_expand(const u_char *ansbuf, const u_char *a6p,
|
||||
int a6len, const u_char *arp, const u_char *eom,
|
||||
const struct in6_addr *in6, int plen, const struct addrinfo *pai,
|
||||
struct pvt *pvt, int (*name_ok)(const char *), int *errorp)
|
||||
{
|
||||
struct in6_addr a;
|
||||
int n, pbyte, plen1, pbyte1, error = 0;
|
||||
const u_char *cp;
|
||||
struct addrinfo sentinel, *cur;
|
||||
char pname[1024], buf[1024]; /* XXX */
|
||||
|
||||
*errorp = NETDB_SUCCESS;
|
||||
memset(&sentinel, 0, sizeof(sentinel));
|
||||
cur = &sentinel;
|
||||
|
||||
/*
|
||||
* Validate A6 parameters.
|
||||
*/
|
||||
if (a6len == 0) { /* an A6 record must contain at least 1 byte. */
|
||||
error = NO_RECOVERY;
|
||||
goto bad;
|
||||
}
|
||||
/* prefix length check. */
|
||||
if ((plen1 = *a6p) > 128) {
|
||||
error = NO_RECOVERY;
|
||||
goto bad;
|
||||
}
|
||||
if (plen1 > plen) {
|
||||
/*
|
||||
* New length must not be greater than old one.
|
||||
* Ignore the record as specified in RFC 2874
|
||||
* Section 3.1.2.
|
||||
*/
|
||||
return(NULL); /* just ignore. */
|
||||
}
|
||||
/* boundary check for new plen and prefix addr */
|
||||
pbyte1 = (plen1 & ~7) / 8;
|
||||
if ((int)sizeof(struct in6_addr) - pbyte1 > a6len - 1) {
|
||||
error = NO_RECOVERY;
|
||||
goto bad;
|
||||
}
|
||||
|
||||
/*
|
||||
* merge the new prefix portion.
|
||||
* <--- plen(bits) --->
|
||||
* <--- pbyte ---><-b->
|
||||
* 000000000000000pppppxxxxxxxxxxx(= in6, 0: unknown, x: known, p: pad)
|
||||
* PP++++++++(+ should be merged. P: padding, must be 0)
|
||||
* <-- plen1-->
|
||||
* <-pbyte1->
|
||||
* ^a6p+1
|
||||
* The result should be:
|
||||
* 0000000000PP++++++++xxxxxxxxxxx(= a)
|
||||
*/
|
||||
pbyte = (plen & ~7) / 8;
|
||||
a = *in6;
|
||||
if (pbyte > pbyte1) {
|
||||
/* N.B. the case of "pbyte1 == 128" is implicitly excluded. */
|
||||
int b = plen % 8; /* = the length of "pp..." above */
|
||||
u_char c_hi, c_lo;
|
||||
|
||||
memcpy(&a.s6_addr[pbyte1], a6p + 1, pbyte - pbyte1);
|
||||
if (b > 0) {
|
||||
c_hi = a6p[pbyte - pbyte1 + 1];
|
||||
c_lo = in6->s6_addr[pbyte];
|
||||
a.s6_addr[pbyte] =
|
||||
(c_hi & (0xff << (8 - b))) |
|
||||
((0x00ff >> b) & c_lo);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0 /* for debug */
|
||||
if ((pvt->res->options & RES_DEBUG) != 0) {
|
||||
u_char ntopbuf[INET6_ADDRSTRLEN];
|
||||
|
||||
inet_ntop(AF_INET6, &a, ntopbuf, sizeof(ntopbuf));
|
||||
printf("a6_expand: %s\\%d\n", ntopbuf, plen1);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (plen1 == 0) {
|
||||
/* Here is the end of A6 chain. make addrinfo, then return. */
|
||||
return(addr2addrinfo(pai, (const char *)&a));
|
||||
}
|
||||
|
||||
/*
|
||||
* Expand the new prefix name. Since the prefix name must not be
|
||||
* compressed (RFC 2874 Section 3.1.1), we could use ns_name_ntop()
|
||||
* here if it had a stricter boundary check.
|
||||
*/
|
||||
cp = a6p + 1 + (sizeof(*in6) - pbyte1);
|
||||
n = dn_expand(ansbuf, eom, cp, pname, sizeof(pname));
|
||||
if (n < 0 || !maybe_ok(pvt->res, pname, name_ok)) {
|
||||
error = NO_RECOVERY;
|
||||
goto bad;
|
||||
}
|
||||
if (cp + n != a6p + a6len) { /* length mismatch */
|
||||
error = NO_RECOVERY;
|
||||
goto bad;
|
||||
}
|
||||
|
||||
/*
|
||||
* we need (more) additional section records, but no one is
|
||||
* available, which possibly means a malformed answer.
|
||||
*/
|
||||
if (arp == NULL) {
|
||||
error = NO_RECOVERY; /* we can't resolve the chain. */
|
||||
goto bad;
|
||||
}
|
||||
|
||||
/*
|
||||
* Loop thru the rest of the buffer, searching for the next A6 record
|
||||
* that has the same owner name as the prefix name. If found, then
|
||||
* recursively call this function to expand the whole A6 chain.
|
||||
*/
|
||||
plen = plen1;
|
||||
for (cp = arp; cp != NULL && cp < eom; cp += n) {
|
||||
int class, type;
|
||||
|
||||
n = dn_expand(ansbuf, eom, cp, buf, sizeof(buf));
|
||||
if (n < 0 || !maybe_ok(pvt->res, buf, name_ok)) {
|
||||
error = NO_RECOVERY;
|
||||
goto bad;
|
||||
}
|
||||
cp += n; /* name */
|
||||
if (cp + 3 * INT16SZ + INT32SZ > eom) {
|
||||
error = NO_RECOVERY;
|
||||
goto bad;
|
||||
}
|
||||
type = ns_get16(cp);
|
||||
cp += INT16SZ; /* type */
|
||||
class = ns_get16(cp);
|
||||
cp += INT16SZ + INT32SZ; /* class, TTL */
|
||||
n = ns_get16(cp);
|
||||
cp += INT16SZ; /* len */
|
||||
if (cp + n > eom) {
|
||||
error = NO_RECOVERY;
|
||||
goto bad;
|
||||
}
|
||||
if (class != C_IN || type != ns_t_a6) {
|
||||
/* we are only interested in A6 records. skip others */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ns_samename(buf, pname) != 1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Proceed to the next record in the chain. */
|
||||
cur->ai_next = a6_expand(ansbuf, cp, n, cp + n, eom,
|
||||
(const struct in6_addr *)&a,
|
||||
plen, pai, pvt, name_ok, &error);
|
||||
if (error != NETDB_SUCCESS)
|
||||
goto bad;
|
||||
while (cur && cur->ai_next)
|
||||
cur = cur->ai_next;
|
||||
}
|
||||
|
||||
return(sentinel.ai_next);
|
||||
|
||||
bad:
|
||||
*errorp = error;
|
||||
if (sentinel.ai_next)
|
||||
freeaddrinfo(sentinel.ai_next);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
static const char *
|
||||
dname_subst(const char *qname0, const char *owner0, const char *target) {
|
||||
char owner[MAXDNAME];
|
||||
static char qname[MAXDNAME];
|
||||
const char blabelhead[] = "\\[x"; /* we can assume hex strings */
|
||||
int qlen, olen;
|
||||
int bufsiz = sizeof(qname);
|
||||
|
||||
/* make local copies, which are canonicalized. */
|
||||
if (ns_makecanon(qname0, qname, sizeof(qname)) < 0 ||
|
||||
ns_makecanon(owner0, owner, sizeof(owner)) < 0)
|
||||
return(NULL);
|
||||
qlen = strlen(qname);
|
||||
olen = strlen(owner);
|
||||
/* from now on, do not refer to qname0 nor owner0. */
|
||||
|
||||
/*
|
||||
* check if QNAME is a subdomain of OWNER.
|
||||
* XXX: currently, we only handle the following two cases:
|
||||
* (A) none of the labels are bitlabels, or
|
||||
* (B) both of the head labels are bitlabels (and the following
|
||||
* labels are NOT bitlabels).
|
||||
* If we pass the check, then subtract the remaining part from QNAME.
|
||||
* ex. (A) qname=www.foo.com,owner=foo.com => new qname=www.
|
||||
* (B) qname=\[x3ffe0501/32].foo.com,owner=\[x3ffe/16].foo.com
|
||||
* => new qname=\[x0501/16].
|
||||
*/
|
||||
if (ns_samedomain(qname, owner)) { /* check (A) */
|
||||
/* at this point, qlen must not be smaller than olen */
|
||||
qname[qlen - olen] = 0;
|
||||
bufsiz -= (qlen - olen);
|
||||
} else { /* check (B) */
|
||||
char *parent0, *parent1;
|
||||
/* the following 3 have enough size to store 1 bitlabel */
|
||||
u_char qlabel[64], olabel[64], newlabel[64];
|
||||
int qlabellen, olabellen;
|
||||
|
||||
if (strncmp(qname, blabelhead, 3) != 0 ||
|
||||
strncmp(owner, blabelhead, 3) != 0)
|
||||
return(NULL);
|
||||
/*
|
||||
* Both two begin with bitlabels. The succeeding parts
|
||||
* must exact match.
|
||||
*/
|
||||
if ((parent0 = strchr(qname, '.')) == NULL ||
|
||||
(parent1 = strchr(owner, '.')) == NULL)
|
||||
return(NULL);
|
||||
|
||||
/* ns_samename allows names to begin with '.' */
|
||||
if (ns_samename(parent0, parent1) != 1)
|
||||
return(NULL);
|
||||
|
||||
/* cut the upper domain parts off. */
|
||||
*(parent0 + 1) = 0;
|
||||
*(parent1 + 1) = 0;
|
||||
/* convert the textual form into binary one. */
|
||||
if (ns_name_pton(qname, qlabel, sizeof(qlabel)) < 0 ||
|
||||
ns_name_pton(owner, olabel, sizeof(olabel)) < 0)
|
||||
return(NULL);
|
||||
if ((qlabellen = *(qlabel + 1)) == 0)
|
||||
qlabellen = 256;
|
||||
if ((olabellen = *(olabel + 1)) == 0)
|
||||
olabellen = 256;
|
||||
if (olabellen > qlabellen)
|
||||
return(NULL); /* owner does not contain qname. */
|
||||
else {
|
||||
int qplen = (qlabellen + 7) / 8;
|
||||
int oplen = (olabellen + 7) / 8;
|
||||
int sft = olabellen % 8;
|
||||
int nllen, n;
|
||||
u_char *qp, *op, *np;
|
||||
|
||||
/* skip ELT and Count. */
|
||||
qp = qlabel + 2;
|
||||
op = olabel + 2;
|
||||
|
||||
/* check if olabel is a "subdomain" of qlabel. */
|
||||
if (memcmp(qp, op, oplen - 1) != 0)
|
||||
return(NULL);
|
||||
if (sft > 0) {
|
||||
/* compare trailing bits (between 1 and 7) */
|
||||
if ((qp[qplen - 1] & (0xff << sft)) !=
|
||||
op[qplen - 1])
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/* OK, get remaining bits from qlabel. */
|
||||
np = newlabel;
|
||||
if (olabellen == qlabellen) {
|
||||
/*
|
||||
* Two names (including bitlabels) are exactly
|
||||
* same. Discard the whole names.
|
||||
* XXX: ns_samename() above should exclude
|
||||
* this case...
|
||||
*/
|
||||
qname[0] = 0;
|
||||
goto maketarget;
|
||||
}
|
||||
*np++ = 0x41; /* XXX hardcoding */
|
||||
*np++ = nllen = (qlabellen - olabellen);
|
||||
if (sft == 0) {
|
||||
/*
|
||||
* No alignment issue. can just use memcpy.
|
||||
* Note that the "else" part below contains
|
||||
* this case. We separate the two cases just
|
||||
* for efficiency.
|
||||
* We assume that ns_name_pton above ensures
|
||||
* QP does not contain trailing garbages.
|
||||
*/
|
||||
memcpy(np, qp + oplen, qplen - oplen);
|
||||
np += qplen - oplen;
|
||||
*np = 0;
|
||||
} else {
|
||||
/*
|
||||
* copy the lower (8-SFT) bits of QP to the
|
||||
* upper (8-SFT) bits of NP, then copy the
|
||||
* upper SFT bits of QP+1 to the lower SFT bits
|
||||
* of NP, and so on...
|
||||
* if QP is xxxyyyyy zzzwww..., then
|
||||
* NP would be yyyyyzzz ...
|
||||
* Again, we assume QP does not contain
|
||||
* trailing garbages.
|
||||
*/
|
||||
qp += (oplen - 1);
|
||||
while (nllen > 0) {
|
||||
*np = (*qp << sft) & 0xff;
|
||||
if ((nllen -= (8 - sft)) <= 0)
|
||||
break; /* done */
|
||||
qp++;
|
||||
*np |= ((*qp >> sft) & 0xff);
|
||||
np++;
|
||||
nllen -= sft;
|
||||
}
|
||||
*++np = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* make a new bitlabel with the remaining bits.
|
||||
* Note that there's no buffer boundary issue, since
|
||||
* qlabel, olabel, and newlabel all have the same size.
|
||||
* ns_name_ntop() must not return 0, since we have
|
||||
* a non-empty bitlabel.
|
||||
*/
|
||||
if ((n = ns_name_ntop(newlabel, qname, sizeof(qname)))
|
||||
<= 0)
|
||||
return(NULL);
|
||||
bufsiz -= n;
|
||||
if (qname[n - 1] != '.') { /* XXX no trailing dot */
|
||||
qname[n - 1] = '.';
|
||||
qname[n] = 0;
|
||||
bufsiz--;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
maketarget:
|
||||
/*
|
||||
* Finally, append the remaining part (maybe empty) to the new target.
|
||||
*/
|
||||
if (bufsiz < (int)strlen(target)) /* bufsiz takes care of the \0. */
|
||||
return(NULL);
|
||||
strcat(qname, target);
|
||||
|
||||
return((const char *)qname);
|
||||
}
|
||||
|
||||
static void
|
||||
ho_res_set(struct irs_ho *this, struct __res_state *res,
|
||||
void (*free_res)(void *)) {
|
||||
@ -1092,7 +693,6 @@ gethostans(struct irs_ho *this,
|
||||
char *bp, *ep, **ap, **hap;
|
||||
char tbuf[MAXDNAME+1];
|
||||
struct addrinfo sentinel, *cur, ai;
|
||||
const u_char *arp = NULL;
|
||||
|
||||
if (pai == NULL) abort();
|
||||
if (ret_aip != NULL)
|
||||
@ -1103,7 +703,6 @@ gethostans(struct irs_ho *this,
|
||||
tname = qname;
|
||||
eom = ansbuf + anslen;
|
||||
switch (qtype) {
|
||||
case ns_t_a6:
|
||||
case T_A:
|
||||
case T_AAAA:
|
||||
case T_ANY: /* use T_ANY only for T_A/T_AAAA lookup */
|
||||
@ -1148,8 +747,7 @@ gethostans(struct irs_ho *this,
|
||||
RES_SET_H_ERRNO(pvt->res, NO_RECOVERY);
|
||||
return (NULL);
|
||||
}
|
||||
if (qtype == T_A || qtype == T_AAAA ||
|
||||
qtype == ns_t_a6 || qtype == T_ANY) {
|
||||
if (qtype == T_A || qtype == T_AAAA || qtype == T_ANY) {
|
||||
/* res_nsend() has already verified that the query name is the
|
||||
* same as the one we sent; this just gets the expanded name
|
||||
* (i.e., with the succeeding search-domain tacked on).
|
||||
@ -1193,8 +791,8 @@ gethostans(struct irs_ho *this,
|
||||
continue;
|
||||
}
|
||||
eor = cp + n;
|
||||
if ((qtype == T_A || qtype == T_AAAA || qtype == ns_t_a6 ||
|
||||
qtype == T_ANY) && type == T_CNAME) {
|
||||
if ((qtype == T_A || qtype == T_AAAA || qtype == T_ANY) &&
|
||||
type == T_CNAME) {
|
||||
if (haveanswer) {
|
||||
int level = LOG_CRIT;
|
||||
#ifdef LOG_SECURITY
|
||||
@ -1222,58 +820,16 @@ gethostans(struct irs_ho *this,
|
||||
had_error++;
|
||||
continue;
|
||||
}
|
||||
#ifdef HAVE_STRLCPY
|
||||
strlcpy(bp, tbuf, ep - bp);
|
||||
#else
|
||||
strcpy(bp, tbuf);
|
||||
#endif
|
||||
pvt->host.h_name = bp;
|
||||
hname = bp;
|
||||
bp += n;
|
||||
continue;
|
||||
}
|
||||
if (type == ns_t_dname) {
|
||||
const char *t0, *t;
|
||||
|
||||
/*
|
||||
* just replace the query target; do not update the
|
||||
* alias list. (Or should we?)
|
||||
*/
|
||||
t0 = (qtype == T_PTR) ? tname : hname;
|
||||
|
||||
n = dn_expand(ansbuf, eor, cp, tbuf, sizeof(tbuf));
|
||||
if (n < 0 || !maybe_dnok(pvt->res, tbuf)) {
|
||||
had_error++;
|
||||
continue;
|
||||
}
|
||||
#ifdef RES_USE_DNAME
|
||||
if ((pvt ->res->options & RES_USE_DNAME) == 0) {
|
||||
cp += n;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
if ((t = dname_subst(t0, bp, tbuf)) == NULL) {
|
||||
cp += n;
|
||||
continue;
|
||||
}
|
||||
#if 0 /* for debug */
|
||||
if ((pvt->res->options & RES_DEBUG) != 0) {
|
||||
printf("DNAME owner=%s, target=%s, next=%s\n",
|
||||
bp, tbuf, t);
|
||||
}
|
||||
#endif
|
||||
cp += n;
|
||||
|
||||
n = strlen(t) + 1; /* for the \0 */
|
||||
if (n > (ep - bp)) {
|
||||
had_error++;
|
||||
continue;
|
||||
}
|
||||
strcpy(bp, t);
|
||||
if (qtype == T_PTR)
|
||||
tname = bp;
|
||||
else
|
||||
hname = bp;
|
||||
bp += n;
|
||||
|
||||
continue;
|
||||
}
|
||||
if (qtype == T_PTR && type == T_CNAME) {
|
||||
n = dn_expand(ansbuf, eor, cp, tbuf, sizeof tbuf);
|
||||
if (n < 0 || !maybe_dnok(pvt->res, tbuf)) {
|
||||
@ -1300,14 +856,17 @@ gethostans(struct irs_ho *this,
|
||||
had_error++;
|
||||
continue;
|
||||
}
|
||||
#ifdef HAVE_STRLCPY
|
||||
strlcpy(bp, tbuf, ep - bp);
|
||||
#else
|
||||
strcpy(bp, tbuf);
|
||||
#endif
|
||||
tname = bp;
|
||||
bp += n;
|
||||
continue;
|
||||
}
|
||||
if (qtype == T_ANY) {
|
||||
if (!(type == T_A || type == T_AAAA ||
|
||||
type == ns_t_a6)) {
|
||||
if (!(type == T_A || type == T_AAAA)) {
|
||||
cp += n;
|
||||
continue;
|
||||
}
|
||||
@ -1346,66 +905,6 @@ gethostans(struct irs_ho *this,
|
||||
bp += n;
|
||||
}
|
||||
break;
|
||||
case ns_t_a6: {
|
||||
struct in6_addr in6;
|
||||
struct addrinfo ai;
|
||||
|
||||
#ifdef RES_USE_A6
|
||||
if ((pvt->res->options & RES_USE_A6) == 0) {
|
||||
cp += n;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ns_samename(hname, bp) != 1) {
|
||||
cp += n;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* search for the top of the additional section.
|
||||
* once found, keep it for the case where we have
|
||||
* more than one A6 record.
|
||||
* XXX: however, we may not need this part.
|
||||
*/
|
||||
if (arp == NULL && arcount > 0) {
|
||||
int nscount = ntohs(hp->nscount);
|
||||
|
||||
arp = ar_head(cp + n, nscount + ancount - 1,
|
||||
ansbuf, eom, pvt, name_ok);
|
||||
}
|
||||
|
||||
/* recursively collect the whole A6 chain */
|
||||
ai = *pai; /* XXX: we can't override constant pai */
|
||||
ai.ai_family = AF_INET6;
|
||||
memset(&in6, 0, sizeof(in6)); /* just for safety */
|
||||
cur->ai_next = a6_expand(ansbuf, cp, n, arp, eom,
|
||||
&in6, 128,
|
||||
(const struct addrinfo *)&ai,
|
||||
pvt, name_ok, &error);
|
||||
if (error != NETDB_SUCCESS) {
|
||||
#ifdef DEBUG
|
||||
/* in this case, cur->ai_next must be NULL. */
|
||||
if (cur->ai_next != NULL)
|
||||
abort();
|
||||
#endif
|
||||
had_error++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* We don't bother even if cur->ai_next is NULL unless
|
||||
* the expansion failed by a fatal error. The list
|
||||
* can be NULL if the given A6 is incomplete, but we
|
||||
* may have another complete A6 chain in this answer.
|
||||
* See the last paragraph of RFC 2874 Section 3.1.4.
|
||||
*/
|
||||
if (cur->ai_next == NULL) {
|
||||
cp += n;
|
||||
continue; /* no error, no answer */
|
||||
}
|
||||
goto convertinfo;
|
||||
} /* FALLTHROUGH */
|
||||
case T_A:
|
||||
case T_AAAA:
|
||||
if (ns_samename(hname, bp) != 1) {
|
||||
@ -1430,7 +929,6 @@ gethostans(struct irs_ho *this,
|
||||
if (cur->ai_next == NULL)
|
||||
had_error++;
|
||||
|
||||
convertinfo: /* convert addrinfo into hostent form */
|
||||
if (!haveanswer) {
|
||||
int nn;
|
||||
|
||||
@ -1471,7 +969,7 @@ gethostans(struct irs_ho *this,
|
||||
continue;
|
||||
if (hap < &pvt->h_addr_ptrs[MAXADDRS-1])
|
||||
hap++;
|
||||
|
||||
*hap = NULL;
|
||||
bp += m;
|
||||
}
|
||||
|
||||
@ -1498,7 +996,11 @@ gethostans(struct irs_ho *this,
|
||||
n = strlen(qname) + 1; /* for the \0 */
|
||||
if (n > (ep - bp) || n >= MAXHOSTNAMELEN)
|
||||
goto no_recovery;
|
||||
#ifdef HAVE_STRLCPY
|
||||
strlcpy(bp, qname, ep - bp);
|
||||
#else
|
||||
strcpy(bp, qname);
|
||||
#endif
|
||||
pvt->host.h_name = bp;
|
||||
bp += n;
|
||||
}
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char rcsid[] = "$Id: dns_nw.c,v 1.23 2002/06/26 07:42:06 marka Exp $";
|
||||
static const char rcsid[] = "$Id: dns_nw.c,v 1.25 2002/07/18 02:07:43 marka Exp $";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
/* Imports. */
|
||||
@ -349,7 +349,12 @@ get1101answer(struct irs_nw *this,
|
||||
RES_SET_H_ERRNO(pvt->res, NO_RECOVERY);
|
||||
return (NULL);
|
||||
}
|
||||
#ifdef HAVE_STRLCPY
|
||||
strlcpy(bp, name, ep - bp);
|
||||
pvt->net.n_name = bp;
|
||||
#else
|
||||
pvt->net.n_name = strcpy(bp, name);
|
||||
#endif
|
||||
bp += n;
|
||||
}
|
||||
break;
|
||||
@ -522,37 +527,37 @@ get1101mask(struct irs_nw *this, struct nwent *nwent) {
|
||||
static int
|
||||
make1101inaddr(const u_char *net, int bits, char *name, int size) {
|
||||
int n, m;
|
||||
char *ep;
|
||||
|
||||
ep = name + size;
|
||||
|
||||
/* Zero fill any whole bytes left out of the prefix. */
|
||||
for (n = (32 - bits) / 8; n > 0; n--) {
|
||||
if (size < (int)(sizeof "0."))
|
||||
if (ep - name < (int)(sizeof "0."))
|
||||
goto emsgsize;
|
||||
m = SPRINTF((name, "0."));
|
||||
name += m;
|
||||
size -= m;
|
||||
}
|
||||
|
||||
/* Format the partial byte, if any, within the prefix. */
|
||||
if ((n = bits % 8) != 0) {
|
||||
if (size < (int)(sizeof "255."))
|
||||
if (ep - name < (int)(sizeof "255."))
|
||||
goto emsgsize;
|
||||
m = SPRINTF((name, "%u.",
|
||||
net[bits / 8] & ~((1 << (8 - n)) - 1)));
|
||||
name += m;
|
||||
size -= m;
|
||||
}
|
||||
|
||||
/* Format the whole bytes within the prefix. */
|
||||
for (n = bits / 8; n > 0; n--) {
|
||||
if (size < (int)(sizeof "255."))
|
||||
if (ep - name < (int)(sizeof "255."))
|
||||
goto emsgsize;
|
||||
m = SPRINTF((name, "%u.", net[n - 1]));
|
||||
name += m;
|
||||
size -= m;
|
||||
}
|
||||
|
||||
/* Add the static text. */
|
||||
if (size < (int)(sizeof "in-addr.arpa"))
|
||||
if (ep - name < (int)(sizeof "in-addr.arpa"))
|
||||
goto emsgsize;
|
||||
(void) SPRINTF((name, "in-addr.arpa"));
|
||||
return (0);
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#if !defined(LINT) && !defined(CODECENTER)
|
||||
static const char rcsid[] = "$Id: gen_gr.c,v 1.25 2001/06/07 02:12:26 marka Exp $";
|
||||
static const char rcsid[] = "$Id: gen_gr.c,v 1.26 2002/07/18 02:07:44 marka Exp $";
|
||||
#endif
|
||||
|
||||
/* Imports */
|
||||
@ -324,7 +324,7 @@ gr_res_set(struct irs_gr *this, struct __res_state *res,
|
||||
static void
|
||||
grmerge(struct irs_gr *this, const struct group *src, int preserve) {
|
||||
struct pvt *pvt = (struct pvt *)this->private;
|
||||
char *cp, **m, **p, *oldmembuf;
|
||||
char *cp, **m, **p, *oldmembuf, *ep;
|
||||
int n, ndst, nnew;
|
||||
size_t used;
|
||||
|
||||
@ -379,6 +379,7 @@ grmerge(struct irs_gr *this, const struct group *src, int preserve) {
|
||||
/* No harm done, no work done. */
|
||||
return;
|
||||
}
|
||||
ep = cp + used + n;
|
||||
if (used != 0)
|
||||
memcpy(cp, pvt->membuf, used);
|
||||
oldmembuf = pvt->membuf;
|
||||
@ -400,7 +401,11 @@ grmerge(struct irs_gr *this, const struct group *src, int preserve) {
|
||||
if (isnew(pvt->group.gr_mem, *m)) {
|
||||
*p++ = cp;
|
||||
*p = NULL;
|
||||
#ifdef HAVE_STRLCPY
|
||||
strlcpy(cp, *m, ep - cp);
|
||||
#else
|
||||
strcpy(cp, *m);
|
||||
#endif
|
||||
cp += strlen(cp) + 1;
|
||||
}
|
||||
if (preserve) {
|
||||
@ -410,10 +415,18 @@ grmerge(struct irs_gr *this, const struct group *src, int preserve) {
|
||||
(pvt->group.gr_passwd - oldmembuf);
|
||||
} else {
|
||||
pvt->group.gr_name = cp;
|
||||
#ifdef HAVE_STRLCPY
|
||||
strlcpy(cp, src->gr_name, ep - cp);
|
||||
#else
|
||||
strcpy(cp, src->gr_name);
|
||||
#endif
|
||||
cp += strlen(src->gr_name) + 1;
|
||||
pvt->group.gr_passwd = cp;
|
||||
#ifdef HAVE_STRLCPY
|
||||
strlcpy(cp, src->gr_passwd, ep - cp);
|
||||
#else
|
||||
strcpy(cp, src->gr_passwd);
|
||||
#endif
|
||||
cp += strlen(src->gr_passwd) + 1;
|
||||
}
|
||||
if (oldmembuf != NULL)
|
||||
|
@ -101,17 +101,12 @@
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <irs.h>
|
||||
#include <isc/assertions.h>
|
||||
|
||||
#include "port_after.h"
|
||||
|
||||
#include "irs_data.h"
|
||||
|
||||
/*
|
||||
* if we enable it, we will see duplicated addrinfo entries on reply if both
|
||||
* AAAA and A6 records are found. disable it for default installation.
|
||||
*/
|
||||
#undef T_A6
|
||||
|
||||
#define SUCCESS 0
|
||||
#define ANY 0
|
||||
#define YES 1
|
||||
@ -192,7 +187,8 @@ static int get_portmatch __P((const struct addrinfo *, const char *));
|
||||
static int get_port __P((const struct addrinfo *, const char *, int));
|
||||
static const struct afd *find_afd __P((int));
|
||||
static int addrconfig __P((int));
|
||||
static int ip6_str2scopeid __P((char *, struct sockaddr_in6 *));
|
||||
static int ip6_str2scopeid __P((char *, struct sockaddr_in6 *,
|
||||
u_int32_t *scopeidp));
|
||||
static struct net_data *init __P((void));
|
||||
|
||||
struct addrinfo *hostent2addrinfo __P((struct hostent *,
|
||||
@ -297,8 +293,9 @@ str_isnumber(p)
|
||||
if (*p == '\0')
|
||||
return NO;
|
||||
ep = NULL;
|
||||
errno = 0;
|
||||
(void)strtoul(p, &ep, 10);
|
||||
if (ep && *ep == '\0')
|
||||
if (errno == 0 && ep && *ep == '\0')
|
||||
return YES;
|
||||
else
|
||||
return NO;
|
||||
@ -595,7 +592,7 @@ explore_fqdn(pai, hostname, servname, res)
|
||||
char tmp[NS_MAXDNAME];
|
||||
const char *cp;
|
||||
|
||||
result = NULL;
|
||||
INSIST(res != NULL && *res == NULL);
|
||||
|
||||
/*
|
||||
* if the servname does not match socktype/protocol, ignore it.
|
||||
@ -854,13 +851,13 @@ explore_numeric_scope(pai, hostname, servname, res)
|
||||
|
||||
error = explore_numeric(pai, addr, servname, res);
|
||||
if (error == 0) {
|
||||
int scopeid;
|
||||
u_int32_t scopeid = 0;
|
||||
|
||||
for (cur = *res; cur; cur = cur->ai_next) {
|
||||
if (cur->ai_family != AF_INET6)
|
||||
continue;
|
||||
sin6 = (struct sockaddr_in6 *)(void *)cur->ai_addr;
|
||||
if ((scopeid = ip6_str2scopeid(scope, sin6)) == -1) {
|
||||
if (!ip6_str2scopeid(scope, sin6, &scopeid)) {
|
||||
free(hostname2);
|
||||
return(EAI_NONAME); /* XXX: is return OK? */
|
||||
}
|
||||
@ -990,7 +987,17 @@ get_port(const struct addrinfo *ai, const char *servname, int matchonly) {
|
||||
allownumeric = 1;
|
||||
break;
|
||||
case ANY:
|
||||
allownumeric = 0;
|
||||
switch (ai->ai_family) {
|
||||
case AF_INET:
|
||||
#ifdef AF_INET6
|
||||
case AF_INET6:
|
||||
#endif
|
||||
allownumeric = 1;
|
||||
break;
|
||||
default:
|
||||
allownumeric = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return EAI_SOCKTYPE;
|
||||
@ -999,9 +1006,10 @@ get_port(const struct addrinfo *ai, const char *servname, int matchonly) {
|
||||
if (str_isnumber(servname)) {
|
||||
if (!allownumeric)
|
||||
return EAI_SERVICE;
|
||||
port = htons(atoi(servname));
|
||||
port = atoi(servname);
|
||||
if (port < 0 || port > 65535)
|
||||
return EAI_SERVICE;
|
||||
port = htons(port);
|
||||
} else {
|
||||
switch (ai->ai_socktype) {
|
||||
case SOCK_DGRAM:
|
||||
@ -1075,17 +1083,17 @@ addrconfig(af)
|
||||
|
||||
/* convert a string to a scope identifier. XXX: IPv6 specific */
|
||||
static int
|
||||
ip6_str2scopeid(scope, sin6)
|
||||
char *scope;
|
||||
struct sockaddr_in6 *sin6;
|
||||
ip6_str2scopeid(char *scope, struct sockaddr_in6 *sin6,
|
||||
u_int32_t *scopeidp)
|
||||
{
|
||||
int scopeid;
|
||||
u_int32_t scopeid;
|
||||
u_long lscopeid;
|
||||
struct in6_addr *a6 = &sin6->sin6_addr;
|
||||
char *ep;
|
||||
|
||||
|
||||
/* empty scopeid portion is invalid */
|
||||
if (*scope == '\0')
|
||||
return -1;
|
||||
return (0);
|
||||
|
||||
#ifdef USE_IFNAMELINKID
|
||||
if (IN6_IS_ADDR_LINKLOCAL(a6) || IN6_IS_ADDR_MC_LINKLOCAL(a6)) {
|
||||
@ -1096,8 +1104,8 @@ ip6_str2scopeid(scope, sin6)
|
||||
*/
|
||||
scopeid = if_nametoindex(scope);
|
||||
if (scopeid == 0)
|
||||
goto trynumeric;
|
||||
return(scopeid);
|
||||
*scopeidp = scopeid;
|
||||
return (1);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1111,11 +1119,14 @@ ip6_str2scopeid(scope, sin6)
|
||||
|
||||
/* try to convert to a numeric id as a last resort */
|
||||
trynumeric:
|
||||
scopeid = (int)strtoul(scope, &ep, 10);
|
||||
if (*ep == '\0')
|
||||
return scopeid;
|
||||
else
|
||||
return -1;
|
||||
errno = 0;
|
||||
lscopeid = strtoul(scope, &ep, 10);
|
||||
scopeid = lscopeid & 0xffffffff;
|
||||
if (errno == 0 && ep && *ep == '\0' && scopeid == lscopeid) {
|
||||
*scopeidp = scopeid;
|
||||
return (1);
|
||||
} else
|
||||
return (0);
|
||||
}
|
||||
|
||||
struct addrinfo *
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#if !defined(LINT) && !defined(CODECENTER)
|
||||
static const char rcsid[] = "$Id: gethostent.c,v 1.32 2002/05/27 06:50:55 marka Exp $";
|
||||
static const char rcsid[] = "$Id: gethostent.c,v 1.32.10.2 2003/06/04 01:09:43 marka Exp $";
|
||||
#endif
|
||||
|
||||
/* Imports */
|
||||
@ -482,7 +482,7 @@ freehostent(struct hostent *he) {
|
||||
#define LIFREQ lifreq
|
||||
#endif
|
||||
|
||||
static int
|
||||
static void
|
||||
scan_interfaces6(int *have_v4, int *have_v6) {
|
||||
struct LIFCONF lifc;
|
||||
struct LIFREQ lifreq;
|
||||
@ -492,12 +492,9 @@ scan_interfaces6(int *have_v4, int *have_v6) {
|
||||
static unsigned int bufsiz = 4095;
|
||||
int s, cpsize, n;
|
||||
|
||||
/* Set to zero. Used as loop terminators below. */
|
||||
*have_v4 = *have_v6 = 0;
|
||||
|
||||
/* Get interface list from system. */
|
||||
if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) == -1)
|
||||
goto err_ret;
|
||||
goto cleanup;
|
||||
|
||||
/*
|
||||
* Grow buffer until large enough to contain all interface
|
||||
@ -506,7 +503,7 @@ scan_interfaces6(int *have_v4, int *have_v6) {
|
||||
for (;;) {
|
||||
buf = memget(bufsiz);
|
||||
if (buf == NULL)
|
||||
goto err_ret;
|
||||
goto cleanup;
|
||||
#ifdef SETFAMILYFLAGS
|
||||
lifc.lifc_family = AF_UNSPEC; /* request all families */
|
||||
lifc.lifc_flags = 0;
|
||||
@ -526,10 +523,10 @@ scan_interfaces6(int *have_v4, int *have_v6) {
|
||||
break;
|
||||
}
|
||||
if ((n == -1) && errno != EINVAL)
|
||||
goto err_ret;
|
||||
goto cleanup;
|
||||
|
||||
if (bufsiz > 1000000)
|
||||
goto err_ret;
|
||||
goto cleanup;
|
||||
|
||||
memput(buf, bufsiz);
|
||||
bufsiz += 4096;
|
||||
@ -600,16 +597,42 @@ scan_interfaces6(int *have_v4, int *have_v6) {
|
||||
memput(buf, bufsiz);
|
||||
close(s);
|
||||
/* printf("scan interface -> 4=%d 6=%d\n", *have_v4, *have_v6); */
|
||||
return (0);
|
||||
err_ret:
|
||||
return;
|
||||
cleanup:
|
||||
if (buf != NULL)
|
||||
memput(buf, bufsiz);
|
||||
if (s != -1)
|
||||
close(s);
|
||||
/* printf("scan interface -> 4=%d 6=%d\n", *have_v4, *have_v6); */
|
||||
return (-1);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __linux
|
||||
#ifndef IF_NAMESIZE
|
||||
# ifdef IFNAMSIZ
|
||||
# define IF_NAMESIZE IFNAMSIZ
|
||||
# else
|
||||
# define IF_NAMESIZE 16
|
||||
# endif
|
||||
#endif
|
||||
static void
|
||||
scan_linux6(int *have_v6) {
|
||||
FILE *proc = NULL;
|
||||
char address[33];
|
||||
char name[IF_NAMESIZE+1];
|
||||
int ifindex, prefix, flag3, flag4;
|
||||
|
||||
proc = fopen("/proc/net/if_inet6", "r");
|
||||
if (proc == NULL)
|
||||
return;
|
||||
|
||||
if (fscanf(proc, "%32[a-f0-9] %x %x %x %x %16s\n",
|
||||
address, &ifindex, &prefix, &flag3, &flag4, name) == 6)
|
||||
*have_v6 = 1;
|
||||
fclose(proc);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
@ -626,17 +649,21 @@ scan_interfaces(int *have_v4, int *have_v6) {
|
||||
int s, n;
|
||||
size_t cpsize;
|
||||
|
||||
/* Set to zero. Used as loop terminators below. */
|
||||
*have_v4 = *have_v6 = 0;
|
||||
|
||||
#if defined(SIOCGLIFCONF) && defined(SIOCGLIFADDR) && \
|
||||
!defined(IRIX_EMUL_IOCTL_SIOCGIFCONF)
|
||||
/*
|
||||
* Try to scan the interfaces using IPv6 ioctls().
|
||||
*/
|
||||
if (!scan_interfaces6(have_v4, have_v6))
|
||||
scan_interfaces6(have_v4, have_v6);
|
||||
if (*have_v4 != 0 && *have_v6 != 0)
|
||||
return (0);
|
||||
#endif
|
||||
|
||||
/* Set to zero. Used as loop terminators below. */
|
||||
*have_v4 = *have_v6 = 0;
|
||||
#ifdef __linux
|
||||
scan_linux6(have_v6);
|
||||
#endif
|
||||
|
||||
/* Get interface list from system. */
|
||||
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
|
||||
|
@ -44,6 +44,7 @@
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/nameser.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#include <netdb.h>
|
||||
#include <resolv.h>
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char rcsid[] = "$Id: getnetgrent.c,v 1.15 2001/05/29 05:48:49 marka Exp $";
|
||||
static const char rcsid[] = "$Id: getnetgrent.c,v 1.16.6.1 2003/06/02 06:06:58 marka Exp $";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
/* Imports */
|
||||
@ -47,8 +47,11 @@ static struct net_data *init(void);
|
||||
|
||||
/* Public */
|
||||
|
||||
#ifndef SETNETGRENT_ARGS
|
||||
#define SETNETGRENT_ARGS const char *netgroup
|
||||
#endif
|
||||
void
|
||||
setnetgrent(const char *netgroup) {
|
||||
setnetgrent(SETNETGRENT_ARGS) {
|
||||
struct net_data *net_data = init();
|
||||
|
||||
setnetgrent_p(netgroup, net_data);
|
||||
@ -61,19 +64,31 @@ endnetgrent(void) {
|
||||
endnetgrent_p(net_data);
|
||||
}
|
||||
|
||||
#ifndef INNETGR_ARGS
|
||||
#define INNETGR_ARGS const char *netgroup, const char *host, \
|
||||
const char *user, const char *domain
|
||||
#endif
|
||||
int
|
||||
innetgr(const char *netgroup, const char *host,
|
||||
const char *user, const char *domain) {
|
||||
innetgr(INNETGR_ARGS) {
|
||||
struct net_data *net_data = init();
|
||||
|
||||
return (innetgr_p(netgroup, host, user, domain, net_data));
|
||||
}
|
||||
|
||||
int
|
||||
getnetgrent(const char **host, const char **user, const char **domain) {
|
||||
getnetgrent(char **host, char **user, char **domain) {
|
||||
struct net_data *net_data = init();
|
||||
const char *ch, *cu, *cd;
|
||||
int ret;
|
||||
|
||||
return (getnetgrent_p(host, user, domain, net_data));
|
||||
ret = getnetgrent_p(&ch, &cu, &cd, net_data);
|
||||
if (ret != 1)
|
||||
return (ret);
|
||||
|
||||
DE_CONST(ch, *host);
|
||||
DE_CONST(cu, *user);
|
||||
DE_CONST(cd, *domain);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/* Shared private. */
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char rcsid[] = "$Id: getnetgrent_r.c,v 8.6 2001/11/01 08:02:12 marka Exp $";
|
||||
static const char rcsid[] = "$Id: getnetgrent_r.c,v 8.6.10.1 2003/06/02 06:06:58 marka Exp $";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <port_before.h>
|
||||
@ -41,9 +41,15 @@ copy_protoent(char **, char **, char **, const char *, const char *,
|
||||
|
||||
NGR_R_RETURN
|
||||
innetgr_r(const char *netgroup, const char *host, const char *user,
|
||||
const char *domain) {
|
||||
const char *domain) {
|
||||
char *ng, *ho, *us, *dom;
|
||||
|
||||
return (innetgr(netgroup, host, user, domain));
|
||||
DE_CONST(netgroup, ng);
|
||||
DE_CONST(host, ho);
|
||||
DE_CONST(user, us);
|
||||
DE_CONST(domain, dom);
|
||||
|
||||
return (innetgr(ng, ho, us, dom));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -54,7 +60,7 @@ innetgr_r(const char *netgroup, const char *host, const char *user,
|
||||
|
||||
NGR_R_RETURN
|
||||
getnetgrent_r(char **machinep, char **userp, char **domainp, NGR_R_ARGS) {
|
||||
const char *mp, *up, *dp;
|
||||
char *mp, *up, *dp;
|
||||
int res = getnetgrent(&mp, &up, &dp);
|
||||
|
||||
if (res != 1)
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char rcsid[] = "$Id: hesiod.c,v 1.22 2001/05/29 05:48:55 marka Exp $";
|
||||
static const char rcsid[] = "$Id: hesiod.c,v 1.23 2002/07/18 02:07:45 marka Exp $";
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -98,8 +98,13 @@ hesiod_init(void **context) {
|
||||
errno = ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
#ifdef HAVE_STRLCPY
|
||||
strlcpy(ctx->LHS, DEF_LHS, strlen(DEF_LHS) + 1);
|
||||
strlcpy(ctx->RHS, DEF_RHS, strlen(DEF_RHS) + 1);
|
||||
#else
|
||||
strcpy(ctx->LHS, DEF_LHS);
|
||||
strcpy(ctx->RHS, DEF_RHS);
|
||||
#endif
|
||||
#else
|
||||
goto cleanup;
|
||||
#endif
|
||||
@ -109,18 +114,31 @@ hesiod_init(void **context) {
|
||||
* variable.
|
||||
*/
|
||||
if ((cp = getenv("HES_DOMAIN")) != NULL) {
|
||||
size_t RHSlen = strlen(cp) + 2;
|
||||
if (ctx->RHS)
|
||||
free(ctx->RHS);
|
||||
ctx->RHS = malloc(strlen(cp)+2);
|
||||
ctx->RHS = malloc(RHSlen);
|
||||
if (!ctx->RHS) {
|
||||
errno = ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
if (cp[0] == '.')
|
||||
if (cp[0] == '.') {
|
||||
#ifdef HAVE_STRLCPY
|
||||
strlcpy(ctx->RHS, cp, RHSlen);
|
||||
#else
|
||||
strcpy(ctx->RHS, cp);
|
||||
else {
|
||||
#endif
|
||||
} else {
|
||||
#ifdef HAVE_STRLCPY
|
||||
strlcpy(ctx->RHS, ".", RHSlen);
|
||||
#else
|
||||
strcpy(ctx->RHS, ".");
|
||||
#endif
|
||||
#ifdef HAVE_STRLCAT
|
||||
strlcat(ctx->RHS, cp, RHSlen);
|
||||
#else
|
||||
strcat(ctx->RHS, cp);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* $Id: irp_p.h,v 8.2 2001/08/10 02:40:52 marka Exp $
|
||||
* $Id: irp_p.h,v 8.2.10.1 2003/06/02 05:55:14 marka Exp $
|
||||
*/
|
||||
|
||||
#ifndef _IRP_P_H_INCLUDED
|
||||
@ -53,8 +53,6 @@ char *irs_irp_read_body(struct irp_p *pvt, size_t *size);
|
||||
int irs_irp_get_full_response(struct irp_p *pvt, int *code,
|
||||
char *text, size_t textlen,
|
||||
char **body, size_t *bodylen);
|
||||
int irs_irp_send_command(struct irp_p *pvt, const char *fmt, ...) ISC_FORMAT_PRINTF(2, 3);
|
||||
|
||||
|
||||
extern int irp_log_errors;
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#if !defined(LINT) && !defined(CODECENTER)
|
||||
static const char rcsid[] = "$Id: irs_data.c,v 1.19 2001/08/20 07:08:41 marka Exp $";
|
||||
static const char rcsid[] = "$Id: irs_data.c,v 1.20.2.1 2003/06/02 10:09:48 marka Exp $";
|
||||
#endif
|
||||
|
||||
#include "port_before.h"
|
||||
@ -38,6 +38,7 @@ static const char rcsid[] = "$Id: irs_data.c,v 1.19 2001/08/20 07:08:41 marka Ex
|
||||
#endif
|
||||
|
||||
#include <irs.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "port_after.h"
|
||||
|
||||
@ -97,6 +98,14 @@ net_data_destroy(void *p) {
|
||||
(*net_data->ng->close)(net_data->ng);
|
||||
net_data->ng = NULL;
|
||||
}
|
||||
if (net_data->ho_data != NULL) {
|
||||
free(net_data->ho_data);
|
||||
net_data->ho_data = NULL;
|
||||
}
|
||||
if (net_data->nw_data != NULL) {
|
||||
free(net_data->nw_data);
|
||||
net_data->nw_data = NULL;
|
||||
}
|
||||
|
||||
(*net_data->irs->close)(net_data->irs);
|
||||
memput(net_data, sizeof *net_data);
|
||||
@ -143,19 +152,27 @@ net_data_create(const char *conf_file) {
|
||||
return (NULL);
|
||||
memset(net_data, 0, sizeof (struct net_data));
|
||||
|
||||
if ((net_data->irs = irs_gen_acc("", conf_file)) == NULL)
|
||||
if ((net_data->irs = irs_gen_acc("", conf_file)) == NULL) {
|
||||
memput(net_data, sizeof (struct net_data));
|
||||
return (NULL);
|
||||
}
|
||||
#ifndef DO_PTHREADS
|
||||
(*net_data->irs->res_set)(net_data->irs, &_res, NULL);
|
||||
#endif
|
||||
|
||||
net_data->res = (*net_data->irs->res_get)(net_data->irs);
|
||||
if (net_data->res == NULL)
|
||||
if (net_data->res == NULL) {
|
||||
(*net_data->irs->close)(net_data->irs);
|
||||
memput(net_data, sizeof (struct net_data));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if ((net_data->res->options & RES_INIT) == 0 &&
|
||||
res_ninit(net_data->res) == -1)
|
||||
res_ninit(net_data->res) == -1) {
|
||||
(*net_data->irs->close)(net_data->irs);
|
||||
memput(net_data, sizeof (struct net_data));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
return (net_data);
|
||||
}
|
||||
|
@ -49,7 +49,7 @@
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char rcsid[] = "$Id: nis_gr.c,v 1.21 2001/05/29 05:49:12 marka Exp $";
|
||||
static const char rcsid[] = "$Id: nis_gr.c,v 1.22 2002/07/08 06:26:11 marka Exp $";
|
||||
/* from getgrent.c 8.2 (Berkeley) 3/21/94"; */
|
||||
/* from BSDI Id: getgrent.c,v 2.8 1996/05/28 18:15:14 bostic Exp $ */
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
@ -286,7 +286,7 @@ makegroupent(struct irs_gr *this) {
|
||||
goto cleanup;
|
||||
*cp++ = '\0';
|
||||
|
||||
errno = -1;
|
||||
errno = 0;
|
||||
t = strtoul(cp, NULL, 10);
|
||||
if (errno == ERANGE)
|
||||
goto cleanup;
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char rcsid[] = "$Id: nis_ho.c,v 1.18 2001/06/18 14:44:00 marka Exp $";
|
||||
static const char rcsid[] = "$Id: nis_ho.c,v 1.18.10.1 2003/06/02 05:50:57 marka Exp $";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
/* Imports */
|
||||
@ -87,6 +87,9 @@ static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff };
|
||||
static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 };
|
||||
static /*const*/ char hosts_byname[] = "hosts.byname";
|
||||
static /*const*/ char hosts_byaddr[] = "hosts.byaddr";
|
||||
static /*const*/ char ipnode_byname[] = "ipnode.byname";
|
||||
static /*const*/ char ipnode_byaddr[] = "ipnode.byaddr";
|
||||
static /*const*/ char yp_multi[] = "YP_MULTI_";
|
||||
|
||||
/* Forwards */
|
||||
|
||||
@ -186,9 +189,32 @@ ho_byname2(struct irs_ho *this, const char *name, int af) {
|
||||
return (NULL);
|
||||
|
||||
nisfree(pvt, do_val);
|
||||
DE_CONST(name, tmp);
|
||||
r = yp_match(pvt->nis_domain, hosts_byname, tmp,
|
||||
|
||||
strcpy(pvt->hostbuf, yp_multi);
|
||||
strncat(pvt->hostbuf, name, sizeof(pvt->hostbuf) - sizeof(yp_multi));
|
||||
pvt->hostbuf[sizeof(pvt->hostbuf) - 1] = '\0';
|
||||
for (r = sizeof(yp_multi) - 1; pvt->hostbuf[r] != '\0'; r++)
|
||||
if (isupper((unsigned char)pvt->hostbuf[r]))
|
||||
tolower(pvt->hostbuf[r]);
|
||||
|
||||
tmp = pvt->hostbuf;
|
||||
r = yp_match(pvt->nis_domain, ipnode_byname, tmp,
|
||||
strlen(tmp), &pvt->curval_data, &pvt->curval_len);
|
||||
if (r != 0) {
|
||||
tmp = pvt->hostbuf + sizeof(yp_multi) - 1;
|
||||
r = yp_match(pvt->nis_domain, ipnode_byname, tmp,
|
||||
strlen(tmp), &pvt->curval_data, &pvt->curval_len);
|
||||
}
|
||||
if (r != 0) {
|
||||
tmp = pvt->hostbuf;
|
||||
r = yp_match(pvt->nis_domain, hosts_byname, tmp,
|
||||
strlen(tmp), &pvt->curval_data, &pvt->curval_len);
|
||||
}
|
||||
if (r != 0) {
|
||||
tmp = pvt->hostbuf + sizeof(yp_multi) - 1;
|
||||
r = yp_match(pvt->nis_domain, hosts_byname, tmp,
|
||||
strlen(tmp), &pvt->curval_data, &pvt->curval_len);
|
||||
}
|
||||
if (r != 0) {
|
||||
RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND);
|
||||
return (NULL);
|
||||
@ -220,8 +246,11 @@ ho_byaddr(struct irs_ho *this, const void *addr, int len, int af) {
|
||||
return (NULL);
|
||||
}
|
||||
nisfree(pvt, do_val);
|
||||
r = yp_match(pvt->nis_domain, hosts_byaddr, tmp, strlen(tmp),
|
||||
r = yp_match(pvt->nis_domain, ipnode_byaddr, tmp, strlen(tmp),
|
||||
&pvt->curval_data, &pvt->curval_len);
|
||||
if (r != 0)
|
||||
r = yp_match(pvt->nis_domain, hosts_byaddr, tmp, strlen(tmp),
|
||||
&pvt->curval_data, &pvt->curval_len);
|
||||
if (r != 0) {
|
||||
RES_SET_H_ERRNO(pvt->res, HOST_NOT_FOUND);
|
||||
return (NULL);
|
||||
@ -382,12 +411,35 @@ ho_addrinfo(struct irs_ho *this, const char *name, const struct addrinfo *pai)
|
||||
|
||||
/* Private */
|
||||
|
||||
/*
|
||||
ipnodes:
|
||||
::1 localhost
|
||||
127.0.0.1 localhost
|
||||
1.2.3.4 FOO bar
|
||||
1.2.6.4 FOO bar
|
||||
1.2.6.5 host
|
||||
|
||||
ipnodes.byname:
|
||||
YP_MULTI_localhost ::1,127.0.0.1 localhost
|
||||
YP_MULTI_foo 1.2.3.4,1.2.6.4 FOO bar
|
||||
YP_MULTI_bar 1.2.3.4,1.2.6.4 FOO bar
|
||||
host 1.2.6.5 host
|
||||
|
||||
hosts.byname:
|
||||
localhost 127.0.0.1 localhost
|
||||
host 1.2.6.5 host
|
||||
YP_MULTI_foo 1.2.3.4,1.2.6.4 FOO bar
|
||||
YP_MULTI_bar 1.2.3.4,1.2.6.4 FOO bar
|
||||
*/
|
||||
|
||||
static struct hostent *
|
||||
makehostent(struct irs_ho *this) {
|
||||
struct pvt *pvt = (struct pvt *)this->private;
|
||||
static const char spaces[] = " \t";
|
||||
char *cp, **q, *p;
|
||||
int af, len;
|
||||
char *cp, **q, *p, *comma, *ap;
|
||||
int af = 0, len = 0;
|
||||
int multi = 0;
|
||||
int addr = 0;
|
||||
|
||||
p = pvt->curval_data;
|
||||
if ((cp = strpbrk(p, "#\n")) != NULL)
|
||||
@ -395,25 +447,40 @@ makehostent(struct irs_ho *this) {
|
||||
if (!(cp = strpbrk(p, spaces)))
|
||||
return (NULL);
|
||||
*cp++ = '\0';
|
||||
if ((pvt->res->options & RES_USE_INET6) &&
|
||||
inet_pton(AF_INET6, p, pvt->host_addr) > 0) {
|
||||
af = AF_INET6;
|
||||
len = IN6ADDRSZ;
|
||||
} else if (inet_pton(AF_INET, p, pvt->host_addr) > 0) {
|
||||
if (pvt->res->options & RES_USE_INET6) {
|
||||
map_v4v6_address((char*)pvt->host_addr,
|
||||
(char*)pvt->host_addr);
|
||||
ap = pvt->hostbuf;
|
||||
do {
|
||||
if ((comma = strchr(p, ',')) != NULL) {
|
||||
*comma++ = '\0';
|
||||
multi = 1;
|
||||
}
|
||||
if ((ap + IN6ADDRSZ) > (pvt->hostbuf + sizeof(pvt->hostbuf)))
|
||||
break;
|
||||
if ((pvt->res->options & RES_USE_INET6) &&
|
||||
inet_pton(AF_INET6, p, ap) > 0) {
|
||||
af = AF_INET6;
|
||||
len = IN6ADDRSZ;
|
||||
} else if (inet_pton(AF_INET, p, pvt->host_addr) > 0) {
|
||||
if (pvt->res->options & RES_USE_INET6) {
|
||||
map_v4v6_address((char*)pvt->host_addr, ap);
|
||||
af = AF_INET6;
|
||||
len = IN6ADDRSZ;
|
||||
} else {
|
||||
af = AF_INET;
|
||||
len = INADDRSZ;
|
||||
}
|
||||
} else {
|
||||
af = AF_INET;
|
||||
len = INADDRSZ;
|
||||
if (!multi)
|
||||
return (NULL);
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (addr < MAXADDRS) {
|
||||
pvt->h_addr_ptrs[addr++] = ap;
|
||||
pvt->h_addr_ptrs[addr] = NULL;
|
||||
ap += len;
|
||||
}
|
||||
} while ((p = comma) != NULL);
|
||||
if (ap == pvt->hostbuf)
|
||||
return (NULL);
|
||||
}
|
||||
pvt->h_addr_ptrs[0] = (char *)pvt->host_addr;
|
||||
pvt->h_addr_ptrs[1] = NULL;
|
||||
pvt->host.h_addr_list = pvt->h_addr_ptrs;
|
||||
pvt->host.h_length = len;
|
||||
pvt->host.h_addrtype = af;
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: ctl_clnt.c,v 8.17 2001/06/06 00:33:35 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ctl_clnt.c,v 8.18 2002/07/08 05:10:23 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -185,7 +185,7 @@ ctl_client(evContext lev, const struct sockaddr *cap, size_t cap_len,
|
||||
if (evConnect(lev, ctx->sock, (const struct sockaddr *)sap, sap_len,
|
||||
conn_done, ctx, &ctx->coID) < 0) {
|
||||
(*ctx->logger)(ctl_error, "%s: evConnect(fd %d): %s",
|
||||
me, (void *)ctx->sock, strerror(errno));
|
||||
me, ctx->sock, strerror(errno));
|
||||
fatal:
|
||||
if (ctx != NULL) {
|
||||
if (ctx->sock >= 0)
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: ctl_srvr.c,v 8.25 2001/05/29 05:49:27 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ctl_srvr.c,v 8.26 2002/07/08 05:10:25 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -252,7 +252,7 @@ ctl_server(evContext lev, const struct sockaddr *sap, size_t sap_len,
|
||||
&ctx->acID) < 0) {
|
||||
save_errno = errno;
|
||||
(*ctx->logger)(ctl_error, "%s: evListen(fd %d): %s",
|
||||
me, (void *)ctx->sock, strerror(errno));
|
||||
me, ctx->sock, strerror(errno));
|
||||
close(ctx->sock);
|
||||
memput(ctx, sizeof *ctx);
|
||||
errno = save_errno;
|
||||
|
@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#if !defined(LINT) && !defined(CODECENTER)
|
||||
static const char rcsid[] = "$Id: ev_files.c,v 1.21 2001/11/01 05:35:46 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ev_files.c,v 1.22 2002/07/08 05:50:07 marka Exp $";
|
||||
#endif
|
||||
|
||||
#include "port_before.h"
|
||||
@ -54,7 +54,7 @@ evSelectFD(evContext opaqueCtx,
|
||||
int mode;
|
||||
|
||||
evPrintf(ctx, 1,
|
||||
"evSelectFD(ctx %#x, fd %d, mask 0x%x, func %#x, uap %#x)\n",
|
||||
"evSelectFD(ctx %p, fd %d, mask 0x%x, func %p, uap %p)\n",
|
||||
ctx, fd, eventmask, func, uap);
|
||||
if (eventmask == 0 || (eventmask & ~EV_MASK_ALL) != 0)
|
||||
EV_ERR(EINVAL);
|
||||
|
@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#if !defined(LINT) && !defined(CODECENTER)
|
||||
static const char rcsid[] = "$Id: ev_timers.c,v 1.32 2001/11/01 05:35:47 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ev_timers.c,v 1.33 2002/07/08 05:50:09 marka Exp $";
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
@ -152,10 +152,10 @@ evSetTimer(evContext opaqueCtx,
|
||||
evTimer *id;
|
||||
|
||||
evPrintf(ctx, 1,
|
||||
"evSetTimer(ctx %#x, func %#x, uap %#x, due %d.%09ld, inter %d.%09ld)\n",
|
||||
"evSetTimer(ctx %p, func %p, uap %p, due %ld.%09ld, inter %ld.%09ld)\n",
|
||||
ctx, func, uap,
|
||||
due.tv_sec, due.tv_nsec,
|
||||
inter.tv_sec, inter.tv_nsec);
|
||||
(long)due.tv_sec, due.tv_nsec,
|
||||
(long)inter.tv_sec, inter.tv_nsec);
|
||||
|
||||
/* due={0,0} is a magic cookie meaning "now." */
|
||||
if (due.tv_sec == 0 && due.tv_nsec == 0L)
|
||||
@ -379,10 +379,10 @@ print_timer(void *what, void *uap) {
|
||||
|
||||
cur = what;
|
||||
evPrintf(ctx, 7,
|
||||
" func %p, uap %p, due %d.%09ld, inter %d.%09ld\n",
|
||||
" func %p, uap %p, due %ld.%09ld, inter %ld.%09ld\n",
|
||||
cur->func, cur->uap,
|
||||
cur->due.tv_sec, cur->due.tv_nsec,
|
||||
cur->inter.tv_sec, cur->inter.tv_nsec);
|
||||
(long)cur->due.tv_sec, cur->due.tv_nsec,
|
||||
(long)cur->inter.tv_sec, cur->inter.tv_nsec);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#if !defined(LINT) && !defined(CODECENTER)
|
||||
static const char rcsid[] = "$Id: ev_waits.c,v 8.11 2000/07/20 18:17:52 vixie Exp $";
|
||||
static const char rcsid[] = "$Id: ev_waits.c,v 8.12 2002/07/08 05:50:10 marka Exp $";
|
||||
#endif
|
||||
|
||||
#include "port_before.h"
|
||||
@ -190,14 +190,14 @@ print_waits(evContext_p *ctx) {
|
||||
evPrintf(ctx, 9, "wait waiting:\n");
|
||||
for (wl = ctx->waitLists; wl != NULL; wl = wl->next) {
|
||||
INSIST(wl->first != NULL);
|
||||
evPrintf(ctx, 9, " tag %#x:", wl->first->tag);
|
||||
evPrintf(ctx, 9, " tag %p:", wl->first->tag);
|
||||
for (this = wl->first; this != NULL; this = this->next)
|
||||
evPrintf(ctx, 9, " %#x", this);
|
||||
evPrintf(ctx, 9, " %p", this);
|
||||
evPrintf(ctx, 9, "\n");
|
||||
}
|
||||
evPrintf(ctx, 9, "wait done:");
|
||||
for (this = ctx->waitDone.first; this != NULL; this = this->next)
|
||||
evPrintf(ctx, 9, " %#x", this);
|
||||
evPrintf(ctx, 9, " %p", this);
|
||||
evPrintf(ctx, 9, "\n");
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#if !defined(LINT) && !defined(CODECENTER)
|
||||
static const char rcsid[] = "$Id: eventlib.c,v 1.46 2001/11/01 05:35:48 marka Exp $";
|
||||
static const char rcsid[] = "$Id: eventlib.c,v 1.48 2002/07/17 07:37:34 marka Exp $";
|
||||
#endif
|
||||
|
||||
#include "port_before.h"
|
||||
@ -291,12 +291,12 @@ evGetNext(evContext opaqueCtx, evEvent *opaqueEv, int options) {
|
||||
}
|
||||
|
||||
evPrintf(ctx, 4,
|
||||
"pselect(%d, 0x%lx, 0x%lx, 0x%lx, %d.%09ld)\n",
|
||||
"pselect(%d, 0x%lx, 0x%lx, 0x%lx, %ld.%09ld)\n",
|
||||
ctx->fdMax+1,
|
||||
(u_long)ctx->rdLast.fds_bits[0],
|
||||
(u_long)ctx->wrLast.fds_bits[0],
|
||||
(u_long)ctx->exLast.fds_bits[0],
|
||||
tp ? tp->tv_sec : -1,
|
||||
tp ? (long)tp->tv_sec : -1L,
|
||||
tp ? tp->tv_nsec : -1);
|
||||
|
||||
/* XXX should predict system's earliness and adjust. */
|
||||
@ -463,7 +463,7 @@ evDispatch(evContext opaqueCtx, evEvent opaqueEv) {
|
||||
evAccept *this = ev->u.accept.this;
|
||||
|
||||
evPrintf(ctx, 5,
|
||||
"Dispatch.Accept: fd %d -> %d, func %#x, uap %#x\n",
|
||||
"Dispatch.Accept: fd %d -> %d, func %p, uap %p\n",
|
||||
this->conn->fd, this->fd,
|
||||
this->conn->func, this->conn->uap);
|
||||
errno = this->ioErrno;
|
||||
@ -480,7 +480,7 @@ evDispatch(evContext opaqueCtx, evEvent opaqueEv) {
|
||||
int eventmask = ev->u.file.eventmask;
|
||||
|
||||
evPrintf(ctx, 5,
|
||||
"Dispatch.File: fd %d, mask 0x%x, func %#x, uap %#x\n",
|
||||
"Dispatch.File: fd %d, mask 0x%x, func %p, uap %p\n",
|
||||
this->fd, this->eventmask, this->func, this->uap);
|
||||
(this->func)(opaqueCtx, this->uap, this->fd, eventmask);
|
||||
#ifdef EVENTLIB_TIME_CHECKS
|
||||
@ -492,7 +492,7 @@ evDispatch(evContext opaqueCtx, evEvent opaqueEv) {
|
||||
evStream *this = ev->u.stream.this;
|
||||
|
||||
evPrintf(ctx, 5,
|
||||
"Dispatch.Stream: fd %d, func %#x, uap %#x\n",
|
||||
"Dispatch.Stream: fd %d, func %p, uap %p\n",
|
||||
this->fd, this->func, this->uap);
|
||||
errno = this->ioErrno;
|
||||
(this->func)(opaqueCtx, this->uap, this->fd, this->ioDone);
|
||||
@ -504,7 +504,7 @@ evDispatch(evContext opaqueCtx, evEvent opaqueEv) {
|
||||
case Timer: {
|
||||
evTimer *this = ev->u.timer.this;
|
||||
|
||||
evPrintf(ctx, 5, "Dispatch.Timer: func %#x, uap %#x\n",
|
||||
evPrintf(ctx, 5, "Dispatch.Timer: func %p, uap %p\n",
|
||||
this->func, this->uap);
|
||||
(this->func)(opaqueCtx, this->uap, this->due, this->inter);
|
||||
#ifdef EVENTLIB_TIME_CHECKS
|
||||
@ -516,7 +516,7 @@ evDispatch(evContext opaqueCtx, evEvent opaqueEv) {
|
||||
evWait *this = ev->u.wait.this;
|
||||
|
||||
evPrintf(ctx, 5,
|
||||
"Dispatch.Wait: tag %#x, func %#x, uap %#x\n",
|
||||
"Dispatch.Wait: tag %p, func %p, uap %p\n",
|
||||
this->tag, this->func, this->uap);
|
||||
(this->func)(opaqueCtx, this->uap, this->tag);
|
||||
#ifdef EVENTLIB_TIME_CHECKS
|
||||
|
@ -18,7 +18,7 @@
|
||||
/* eventlib_p.h - private interfaces for eventlib
|
||||
* vix 09sep95 [initial]
|
||||
*
|
||||
* $Id: eventlib_p.h,v 1.30 2001/11/01 05:35:50 marka Exp $
|
||||
* $Id: eventlib_p.h,v 1.31 2003/04/03 05:37:56 marka Exp $
|
||||
*/
|
||||
|
||||
#ifndef _EVENTLIB_P_H
|
||||
@ -198,7 +198,8 @@ typedef struct {
|
||||
|
||||
/* eventlib.c */
|
||||
#define evPrintf __evPrintf
|
||||
void evPrintf(const evContext_p *ctx, int level, const char *fmt, ...);
|
||||
void evPrintf(const evContext_p *ctx, int level, const char *fmt, ...)
|
||||
ISC_FORMAT_PRINTF(3, 4);
|
||||
|
||||
/* ev_timers.c */
|
||||
#define evCreateTimers __evCreateTimers
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#if !defined(LINT) && !defined(CODECENTER)
|
||||
static const char rcsid[] = "$Id: logging.c,v 8.31 2001/06/18 14:44:03 marka Exp $";
|
||||
static const char rcsid[] = "$Id: logging.c,v 8.32 2003/01/02 00:35:42 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "port_before.h"
|
||||
@ -282,6 +282,10 @@ log_vwrite(log_context lc, int category, int level, const char *format,
|
||||
log_channel chan;
|
||||
struct timeval tv;
|
||||
struct tm *local_tm;
|
||||
#ifdef HAVE_TIME_R
|
||||
struct tm tm_tmp;
|
||||
#endif
|
||||
time_t tt;
|
||||
const char *category_name;
|
||||
const char *level_str;
|
||||
char time_buf[256];
|
||||
@ -313,10 +317,11 @@ log_vwrite(log_context lc, int category, int level, const char *format,
|
||||
if (gettimeofday(&tv, NULL) < 0) {
|
||||
syslog(LOG_INFO, "gettimeofday failed in log_vwrite()");
|
||||
} else {
|
||||
tt = tv.tv_sec;
|
||||
#ifdef HAVE_TIME_R
|
||||
localtime_r((time_t *)&tv.tv_sec, &local_tm);
|
||||
local_tm = localtime_r(&tt, &tm_tmp);
|
||||
#else
|
||||
local_tm = localtime((time_t *)&tv.tv_sec);
|
||||
local_tm = localtime(&tt);
|
||||
#endif
|
||||
if (local_tm != NULL) {
|
||||
sprintf(time_buf, "%02d-%s-%4d %02d:%02d:%02d.%03ld ",
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] = "$Id: ns_name.c,v 8.18.4.1 2002/11/14 13:32:08 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_name.c,v 8.20 2003/04/03 06:00:07 marka Exp $";
|
||||
#endif
|
||||
|
||||
#include "port_before.h"
|
||||
@ -792,7 +792,7 @@ decode_bitstring(const char **cpp, char *dn, const char *eom)
|
||||
{
|
||||
const char *cp = *cpp;
|
||||
char *beg = dn, tc;
|
||||
int b, blen, plen;
|
||||
int b, blen, plen, i;
|
||||
|
||||
if ((blen = (*cp & 0xff)) == 0)
|
||||
blen = 256;
|
||||
@ -802,18 +802,34 @@ decode_bitstring(const char **cpp, char *dn, const char *eom)
|
||||
return(-1);
|
||||
|
||||
cp++;
|
||||
dn += SPRINTF((dn, "\\[x"));
|
||||
for (b = blen; b > 7; b -= 8, cp++)
|
||||
dn += SPRINTF((dn, "%02x", *cp & 0xff));
|
||||
i = SPRINTF((dn, "\\[x"));
|
||||
if (i < 0)
|
||||
return (-1);
|
||||
dn += i;
|
||||
for (b = blen; b > 7; b -= 8, cp++) {
|
||||
i = SPRINTF((dn, "%02x", *cp & 0xff));
|
||||
if (i < 0)
|
||||
return (-1);
|
||||
dn += i;
|
||||
}
|
||||
if (b > 4) {
|
||||
tc = *cp++;
|
||||
dn += SPRINTF((dn, "%02x", tc & (0xff << (8 - b))));
|
||||
i = SPRINTF((dn, "%02x", tc & (0xff << (8 - b))));
|
||||
if (i < 0)
|
||||
return (-1);
|
||||
dn += i;
|
||||
} else if (b > 0) {
|
||||
tc = *cp++;
|
||||
dn += SPRINTF((dn, "%1x",
|
||||
i = SPRINTF((dn, "%1x",
|
||||
((tc >> 4) & 0x0f) & (0x0f << (4 - b))));
|
||||
if (i < 0)
|
||||
return (-1);
|
||||
dn += i;
|
||||
}
|
||||
dn += SPRINTF((dn, "/%d]", blen));
|
||||
i = SPRINTF((dn, "/%d]", blen));
|
||||
if (i < 0)
|
||||
return (-1);
|
||||
dn += i;
|
||||
|
||||
*cpp = cp;
|
||||
return(dn - beg);
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] = "$Id: ns_parse.c,v 8.17 2001/06/20 02:50:49 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_parse.c,v 8.18 2003/04/03 06:10:10 marka Exp $";
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
@ -132,9 +132,10 @@ ns_initparse(const u_char *msg, int msglen, ns_msg *handle) {
|
||||
int
|
||||
ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) {
|
||||
int b;
|
||||
int tmp;
|
||||
|
||||
/* Make section right. */
|
||||
if (section >= ns_s_max)
|
||||
if ((tmp = section) < 0 || section >= ns_s_max)
|
||||
RETERR(ENODEV);
|
||||
if (section != handle->_sect)
|
||||
setsection(handle, section);
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] = "$Id: ns_print.c,v 8.24 2001/06/18 06:40:45 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_print.c,v 8.26 2003/02/24 23:56:35 vixie Exp $";
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
@ -31,6 +31,7 @@ static const char rcsid[] = "$Id: ns_print.c,v 8.24 2001/06/18 06:40:45 marka Ex
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <isc/assertions.h>
|
||||
#include <isc/dst.h>
|
||||
#include <errno.h>
|
||||
#include <resolv.h>
|
||||
#include <string.h>
|
||||
@ -58,10 +59,6 @@ static int addstr(const char *src, size_t len,
|
||||
static int addtab(size_t len, size_t target, int spaced,
|
||||
char **buf, size_t *buflen);
|
||||
|
||||
/* Proto. */
|
||||
|
||||
u_int16_t dst_s_dns_key_id(const u_char *, const int);
|
||||
|
||||
/* Macros. */
|
||||
|
||||
#define T(x) \
|
||||
@ -640,9 +637,10 @@ ns_sprintrrf(const u_char *msg, size_t msglen,
|
||||
len = SPRINTF((tmp, "%u %u %u ", mode, err, keysize));
|
||||
T(addstr(tmp, len, &buf, &buflen));
|
||||
|
||||
/* needs to dump key, print otherdata length & other data */
|
||||
/* XXX need to dump key, print otherdata length & other data */
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_tsig: {
|
||||
/* BEW - need to complete this */
|
||||
int n;
|
||||
@ -690,13 +688,13 @@ ns_sprintrrf(const u_char *msg, size_t msglen,
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
case ns_t_opt: {
|
||||
len = SPRINTF((tmp, "%u bytes", class));
|
||||
T(addstr(tmp, len, &buf, &buflen));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
comment = "unknown RR type";
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] = "$Id: ns_samedomain.c,v 8.9.6.2 2002/11/14 22:36:46 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_samedomain.c,v 8.10.8.1 2003/06/02 05:05:05 marka Exp $";
|
||||
#endif
|
||||
|
||||
#include "port_before.h"
|
||||
@ -125,12 +125,12 @@ ns_samedomain(const char *a, const char *b) {
|
||||
*/
|
||||
escaped = 0;
|
||||
for (i = diff - 2; i >= 0; i--)
|
||||
if (a[i] == '\\')
|
||||
if (a[i] == '\\') {
|
||||
if (escaped)
|
||||
escaped = 0;
|
||||
else
|
||||
escaped = 1;
|
||||
else
|
||||
} else
|
||||
break;
|
||||
if (escaped)
|
||||
return (0);
|
||||
@ -166,14 +166,14 @@ int
|
||||
ns_makecanon(const char *src, char *dst, size_t dstsize) {
|
||||
size_t n = strlen(src);
|
||||
|
||||
if (n + sizeof "." > dstsize) {
|
||||
if (n + sizeof "." > dstsize) { /* Note: sizeof == 2 */
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
strcpy(dst, src);
|
||||
while (n > 0 && dst[n - 1] == '.') /* Ends in "." */
|
||||
if (n > 1 && dst[n - 2] == '\\' && /* Ends in "\." */
|
||||
(n < 2 || dst[n - 3] != '\\')) /* But not "\\." */
|
||||
while (n >= 1 && dst[n - 1] == '.') /* Ends in "." */
|
||||
if (n >= 2 && dst[n - 2] == '\\' && /* Ends in "\." */
|
||||
(n < 3 || dst[n - 3] != '\\')) /* But not "\\." */
|
||||
break;
|
||||
else
|
||||
dst[--n] = '\0';
|
||||
|
@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] = "$Id: ns_sign.c,v 8.11 2002/04/30 03:43:55 marka Exp $";
|
||||
static const char rcsid[] = "$Id: ns_sign.c,v 8.12 2002/10/01 06:48:37 marka Exp $";
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
@ -41,6 +41,7 @@ static const char rcsid[] = "$Id: ns_sign.c,v 8.11 2002/04/30 03:43:55 marka Exp
|
||||
#include <unistd.h>
|
||||
|
||||
#include <isc/dst.h>
|
||||
#include <isc/assertions.h>
|
||||
|
||||
#include "port_after.h"
|
||||
|
||||
@ -90,22 +91,30 @@ ns_sign2(u_char *msg, int *msglen, int msgsize, int error, void *k,
|
||||
DST_KEY *key = (DST_KEY *)k;
|
||||
u_char *cp = msg + *msglen, *eob = msg + msgsize;
|
||||
u_char *lenp;
|
||||
u_char *name, *alg;
|
||||
u_char *alg;
|
||||
int n;
|
||||
time_t timesigned;
|
||||
u_char name[NS_MAXCDNAME];
|
||||
|
||||
dst_init();
|
||||
if (msg == NULL || msglen == NULL || sig == NULL || siglen == NULL)
|
||||
return (-1);
|
||||
|
||||
/* Name. */
|
||||
if (key != NULL && error != ns_r_badsig && error != ns_r_badkey)
|
||||
n = dn_comp(key->dk_key_name, cp, eob - cp, dnptrs, lastdnptr);
|
||||
else
|
||||
n = dn_comp("", cp, eob - cp, NULL, NULL);
|
||||
if (key != NULL && error != ns_r_badsig && error != ns_r_badkey) {
|
||||
n = ns_name_pton(key->dk_key_name, name, sizeof name);
|
||||
if (n != -1)
|
||||
n = ns_name_pack(name, cp, eob - cp,
|
||||
(const u_char **)dnptrs,
|
||||
(const u_char **)lastdnptr);
|
||||
|
||||
} else {
|
||||
n = ns_name_pton("", name, sizeof name);
|
||||
if (n != -1)
|
||||
n = ns_name_pack(name, cp, eob - cp, NULL, NULL);
|
||||
}
|
||||
if (n < 0)
|
||||
return (NS_TSIG_ERROR_NO_SPACE);
|
||||
name = cp;
|
||||
cp += n;
|
||||
|
||||
/* Type, class, ttl, length (not filled in yet). */
|
||||
@ -142,7 +151,7 @@ ns_sign2(u_char *msg, int *msglen, int msgsize, int error, void *k,
|
||||
/* Compute the signature. */
|
||||
if (key != NULL && error != ns_r_badsig && error != ns_r_badkey) {
|
||||
void *ctx;
|
||||
u_char buf[MAXDNAME], *cp2;
|
||||
u_char buf[NS_MAXCDNAME], *cp2;
|
||||
int n;
|
||||
|
||||
dst_sign_data(SIG_MODE_INIT, key, &ctx, NULL, 0, NULL, 0);
|
||||
@ -162,6 +171,7 @@ ns_sign2(u_char *msg, int *msglen, int msgsize, int error, void *k,
|
||||
|
||||
/* Digest the key name. */
|
||||
n = ns_name_ntol(name, buf, sizeof(buf));
|
||||
INSIST(n > 0);
|
||||
dst_sign_data(SIG_MODE_UPDATE, key, &ctx, buf, n, NULL, 0);
|
||||
|
||||
/* Digest the class and TTL. */
|
||||
@ -173,6 +183,7 @@ ns_sign2(u_char *msg, int *msglen, int msgsize, int error, void *k,
|
||||
|
||||
/* Digest the algorithm. */
|
||||
n = ns_name_ntol(alg, buf, sizeof(buf));
|
||||
INSIST(n > 0);
|
||||
dst_sign_data(SIG_MODE_UPDATE, key, &ctx, buf, n, NULL, 0);
|
||||
|
||||
/* Digest the time signed, fudge, error, and other data */
|
||||
|
@ -70,7 +70,7 @@
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)res_comp.c 8.1 (Berkeley) 6/4/93";
|
||||
static const char rcsid[] = "$Id: res_comp.c,v 8.15 1999/10/13 16:39:39 vixie Exp $";
|
||||
static const char rcsid[] = "$Id: res_comp.c,v 8.16 2002/08/07 03:47:34 marka Exp $";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "port_before.h"
|
||||
@ -86,10 +86,10 @@ static const char rcsid[] = "$Id: res_comp.c,v 8.15 1999/10/13 16:39:39 vixie Ex
|
||||
#include "port_after.h"
|
||||
|
||||
/*
|
||||
* Expand compressed domain name 'comp_dn' to full domain name.
|
||||
* Expand compressed domain name 'src' to full domain name.
|
||||
* 'msg' is a pointer to the begining of the message,
|
||||
* 'eomorig' points to the first location after the message,
|
||||
* 'exp_dn' is a pointer to a buffer of size 'length' for the result.
|
||||
* 'eom' points to the first location after the message,
|
||||
* 'dst' is a pointer to a buffer of size 'dstsiz' for the result.
|
||||
* Return size of compressed name or -1 if there was an error.
|
||||
*/
|
||||
int
|
||||
|
@ -95,7 +95,7 @@
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93";
|
||||
static const char rcsid[] = "$Id: res_debug.c,v 8.46 2002/05/21 01:57:45 marka Exp $";
|
||||
static const char rcsid[] = "$Id: res_debug.c,v 8.49.6.1 2003/06/04 01:09:43 marka Exp $";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "port_before.h"
|
||||
@ -615,9 +615,6 @@ p_option(u_long option) {
|
||||
#ifdef RES_USE_EDNS0 /* KAME extension */
|
||||
case RES_USE_EDNS0: return "edns0";
|
||||
#endif
|
||||
#ifdef RES_USE_A6
|
||||
case RES_USE_A6: return "a6";
|
||||
#endif
|
||||
#ifdef RES_USE_DNAME
|
||||
case RES_USE_DNAME: return "dname";
|
||||
#endif
|
||||
@ -654,6 +651,33 @@ p_rcode(int rcode) {
|
||||
return (sym_ntos(__p_rcode_syms, rcode, (int *)0));
|
||||
}
|
||||
|
||||
/*
|
||||
* Return a string for a res_sockaddr_union.
|
||||
*/
|
||||
const char *
|
||||
p_sockun(union res_sockaddr_union u, char *buf, size_t size) {
|
||||
char ret[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:123.123.123.123"];
|
||||
|
||||
switch (u.sin.sin_family) {
|
||||
case AF_INET:
|
||||
inet_ntop(AF_INET, &u.sin.sin_addr, ret, sizeof ret);
|
||||
break;
|
||||
#ifdef HAS_INET6_STRUCTS
|
||||
case AF_INET6:
|
||||
inet_ntop(AF_INET6, &u.sin6.sin6_addr, ret, sizeof ret);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
sprintf(ret, "[af%d]", u.sin.sin_family);
|
||||
break;
|
||||
}
|
||||
if (size > 0) {
|
||||
strncpy(buf, ret, size - 1);
|
||||
buf[size - 1] = '0';
|
||||
}
|
||||
return (buf);
|
||||
}
|
||||
|
||||
/*
|
||||
* routines to convert between on-the-wire RR format and zone file format.
|
||||
* Does not contain conversion to/from decimal degrees; divide or multiply
|
||||
@ -1101,8 +1125,9 @@ res_nametoclass(const char *buf, int *successp) {
|
||||
if (strncasecmp(buf, "CLASS", 5) != 0 ||
|
||||
!isdigit((unsigned char)buf[5]))
|
||||
goto done;
|
||||
errno = 0;
|
||||
result = strtoul(buf + 5, &endptr, 10);
|
||||
if (*endptr == '\0' && result <= 0xffff)
|
||||
if (errno == 0 && *endptr == '\0' && result <= 0xffff)
|
||||
success = 1;
|
||||
done:
|
||||
if (successp)
|
||||
@ -1123,8 +1148,9 @@ res_nametotype(const char *buf, int *successp) {
|
||||
if (strncasecmp(buf, "type", 4) != 0 ||
|
||||
!isdigit((unsigned char)buf[4]))
|
||||
goto done;
|
||||
errno = 0;
|
||||
result = strtoul(buf + 4, &endptr, 10);
|
||||
if (*endptr == '\0' && result <= 0xffff)
|
||||
if (errno == 0 && *endptr == '\0' && result <= 0xffff)
|
||||
success = 1;
|
||||
done:
|
||||
if (successp)
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: res_findzonecut.c,v 8.16 2002/04/12 06:27:46 marka Exp $";
|
||||
static const char rcsid[] = "$Id: res_findzonecut.c,v 8.17.6.2 2003/06/02 09:24:40 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -49,19 +49,21 @@ static const char rcsid[] = "$Id: res_findzonecut.c,v 8.16 2002/04/12 06:27:46 m
|
||||
|
||||
typedef struct rr_a {
|
||||
LINK(struct rr_a) link;
|
||||
union res_sockaddr_union addr;
|
||||
union res_sockaddr_union addr;
|
||||
} rr_a;
|
||||
typedef LIST(rr_a) rrset_a;
|
||||
|
||||
typedef struct rr_ns {
|
||||
LINK(struct rr_ns) link;
|
||||
const char * name;
|
||||
int have_v4;
|
||||
int have_v6;
|
||||
unsigned int flags;
|
||||
rrset_a addrs;
|
||||
} rr_ns;
|
||||
typedef LIST(rr_ns) rrset_ns;
|
||||
|
||||
#define RR_NS_HAVE_V4 0x01
|
||||
#define RR_NS_HAVE_V6 0x02
|
||||
|
||||
/* Forward. */
|
||||
|
||||
static int satisfy(res_state, const char *, rrset_ns *,
|
||||
@ -149,7 +151,8 @@ static void res_dprintf(const char *, ...) ISC_FORMAT_PRINTF(1, 2);
|
||||
|
||||
int
|
||||
res_findzonecut(res_state statp, const char *dname, ns_class class, int opts,
|
||||
char *zname, size_t zsize, struct in_addr *addrs, int naddrs) {
|
||||
char *zname, size_t zsize, struct in_addr *addrs, int naddrs)
|
||||
{
|
||||
int result, i;
|
||||
union res_sockaddr_union *u;
|
||||
|
||||
@ -267,7 +270,7 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
|
||||
rrset_ns *nsrrsp)
|
||||
{
|
||||
char tname[NS_MAXDNAME];
|
||||
u_char resp[NS_PACKETSZ];
|
||||
u_char *resp = NULL;
|
||||
int n, i, ancount, nscount;
|
||||
ns_sect sect;
|
||||
ns_msg msg;
|
||||
@ -279,9 +282,13 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
|
||||
|
||||
/* First canonicalize dname (exactly one unescaped trailing "."). */
|
||||
if (ns_makecanon(dname, tname, sizeof tname) < 0)
|
||||
return (-1);
|
||||
goto cleanup;
|
||||
dname = tname;
|
||||
|
||||
resp = malloc(NS_MAXMSG);
|
||||
if (resp == NULL)
|
||||
goto cleanup;
|
||||
|
||||
/* Now grovel the subdomains, hunting for an SOA answer or auth. */
|
||||
for (;;) {
|
||||
/* Leading or inter-label '.' are skipped here. */
|
||||
@ -293,7 +300,7 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
|
||||
if (n < 0) {
|
||||
DPRINTF(("get_soa: do_query('%s', %s) failed (%d)",
|
||||
dname, p_class(class), n));
|
||||
return (-1);
|
||||
goto cleanup;
|
||||
}
|
||||
if (n > 0) {
|
||||
DPRINTF(("get_soa: CNAME or DNAME found"));
|
||||
@ -318,7 +325,7 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
|
||||
if (ns_parserr(&msg, sect, i, &rr) < 0) {
|
||||
DPRINTF(("get_soa: ns_parserr(%s, %d) failed",
|
||||
p_section(sect, ns_o_query), i));
|
||||
return (-1);
|
||||
goto cleanup;
|
||||
}
|
||||
if (ns_rr_type(rr) == ns_t_cname ||
|
||||
ns_rr_type(rr) == ns_t_dname)
|
||||
@ -330,19 +337,23 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
|
||||
switch (sect) {
|
||||
case ns_s_an:
|
||||
if (ns_samedomain(dname, t) == 0) {
|
||||
DPRINTF(("get_soa: ns_samedomain('%s', '%s') == 0",
|
||||
dname, t));
|
||||
DPRINTF(
|
||||
("get_soa: ns_samedomain('%s', '%s') == 0",
|
||||
dname, t)
|
||||
);
|
||||
errno = EPROTOTYPE;
|
||||
return (-1);
|
||||
goto cleanup;
|
||||
}
|
||||
break;
|
||||
case ns_s_ns:
|
||||
if (ns_samename(dname, t) == 1 ||
|
||||
ns_samedomain(dname, t) == 0) {
|
||||
DPRINTF(("get_soa: ns_samename() || !ns_samedomain('%s', '%s')",
|
||||
dname, t));
|
||||
DPRINTF(
|
||||
("get_soa: ns_samename() || !ns_samedomain('%s', '%s')",
|
||||
dname, t)
|
||||
);
|
||||
errno = EPROTOTYPE;
|
||||
return (-1);
|
||||
goto cleanup;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -352,21 +363,23 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
|
||||
DPRINTF(("get_soa: zname(%d) too small (%d)",
|
||||
zsize, strlen(t) + 1));
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
goto cleanup;
|
||||
}
|
||||
strcpy(zname, t);
|
||||
rdata = ns_rr_rdata(rr);
|
||||
rdlen = ns_rr_rdlen(rr);
|
||||
if (ns_name_uncompress(resp, ns_msg_end(msg), rdata,
|
||||
mname, msize) < 0) {
|
||||
DPRINTF(("get_soa: ns_name_uncompress failed"));
|
||||
return (-1);
|
||||
DPRINTF(("get_soa: ns_name_uncompress failed")
|
||||
);
|
||||
goto cleanup;
|
||||
}
|
||||
if (save_ns(statp, &msg, ns_s_ns,
|
||||
zname, class, opts, nsrrsp) < 0) {
|
||||
DPRINTF(("get_soa: save_ns failed"));
|
||||
return (-1);
|
||||
goto cleanup;
|
||||
}
|
||||
free(resp);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -379,13 +392,16 @@ get_soa(res_state statp, const char *dname, ns_class class, int opts,
|
||||
if (*dname == '\\')
|
||||
if (*++dname == '\0') {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
goto cleanup;
|
||||
}
|
||||
dname++;
|
||||
}
|
||||
}
|
||||
DPRINTF(("get_soa: out of labels"));
|
||||
errno = EDESTADDRREQ;
|
||||
cleanup:
|
||||
if (resp != NULL)
|
||||
free(resp);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@ -393,15 +409,20 @@ static int
|
||||
get_ns(res_state statp, const char *zname, ns_class class, int opts,
|
||||
rrset_ns *nsrrsp)
|
||||
{
|
||||
u_char resp[NS_PACKETSZ];
|
||||
u_char *resp;
|
||||
ns_msg msg;
|
||||
int n;
|
||||
|
||||
resp = malloc(NS_MAXMSG);
|
||||
if (resp == NULL)
|
||||
return (-1);
|
||||
|
||||
/* Go and get the NS RRs for this zone. */
|
||||
n = do_query(statp, zname, class, ns_t_ns, resp, &msg);
|
||||
if (n != 0) {
|
||||
DPRINTF(("get_ns: do_query('%s', %s) failed (%d)",
|
||||
zname, p_class(class), n));
|
||||
free(resp);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@ -409,31 +430,38 @@ get_ns(res_state statp, const char *zname, ns_class class, int opts,
|
||||
if (save_ns(statp, &msg, ns_s_an, zname, class, opts, nsrrsp) < 0) {
|
||||
DPRINTF(("get_ns save_ns('%s', %s) failed",
|
||||
zname, p_class(class)));
|
||||
free(resp);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
free(resp);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
get_glue(res_state statp, ns_class class, int opts, rrset_ns *nsrrsp) {
|
||||
rr_ns *nsrr, *nsrr_n;
|
||||
u_char *resp;
|
||||
|
||||
resp = malloc(NS_MAXMSG);
|
||||
if (resp == NULL)
|
||||
return(-1);
|
||||
|
||||
/* Go and get the A RRs for each empty NS RR on our list. */
|
||||
for (nsrr = HEAD(*nsrrsp); nsrr != NULL; nsrr = nsrr_n) {
|
||||
u_char resp[NS_PACKETSZ];
|
||||
ns_msg msg;
|
||||
int n;
|
||||
|
||||
nsrr_n = NEXT(nsrr, link);
|
||||
|
||||
if (!nsrr->have_v4) {
|
||||
if ((nsrr->flags & RR_NS_HAVE_V4) == 0) {
|
||||
n = do_query(statp, nsrr->name, class, ns_t_a,
|
||||
resp, &msg);
|
||||
if (n < 0) {
|
||||
DPRINTF(("get_glue: do_query('%s', %s') failed",
|
||||
nsrr->name, p_class(class)));
|
||||
return (-1);
|
||||
DPRINTF(
|
||||
("get_glue: do_query('%s', %s') failed",
|
||||
nsrr->name, p_class(class)));
|
||||
goto cleanup;
|
||||
}
|
||||
if (n > 0) {
|
||||
DPRINTF((
|
||||
@ -444,17 +472,18 @@ get_glue(res_state statp, ns_class class, int opts, rrset_ns *nsrrsp) {
|
||||
opts, nsrr) < 0) {
|
||||
DPRINTF(("get_glue: save_r('%s', %s) failed",
|
||||
nsrr->name, p_class(class)));
|
||||
return (-1);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
if (!nsrr->have_v6) {
|
||||
if ((nsrr->flags & RR_NS_HAVE_V6) == 0) {
|
||||
n = do_query(statp, nsrr->name, class, ns_t_aaaa,
|
||||
resp, &msg);
|
||||
if (n < 0) {
|
||||
DPRINTF(("get_glue: do_query('%s', %s') failed",
|
||||
nsrr->name, p_class(class)));
|
||||
return (-1);
|
||||
DPRINTF(
|
||||
("get_glue: do_query('%s', %s') failed",
|
||||
nsrr->name, p_class(class)));
|
||||
goto cleanup;
|
||||
}
|
||||
if (n > 0) {
|
||||
DPRINTF((
|
||||
@ -465,7 +494,7 @@ get_glue(res_state statp, ns_class class, int opts, rrset_ns *nsrrsp) {
|
||||
opts, nsrr) < 0) {
|
||||
DPRINTF(("get_glue: save_r('%s', %s) failed",
|
||||
nsrr->name, p_class(class)));
|
||||
return (-1);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
@ -476,7 +505,12 @@ get_glue(res_state statp, ns_class class, int opts, rrset_ns *nsrrsp) {
|
||||
free_nsrr(nsrrsp, nsrr);
|
||||
}
|
||||
}
|
||||
free(resp);
|
||||
return (0);
|
||||
|
||||
cleanup:
|
||||
free(resp);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -514,7 +548,8 @@ save_ns(res_state statp, ns_msg *msg, ns_sect sect,
|
||||
if (ns_name_uncompress(ns_msg_base(*msg),
|
||||
ns_msg_end(*msg), rdata,
|
||||
tname, sizeof tname) < 0) {
|
||||
DPRINTF(("save_ns: ns_name_uncompress failed"));
|
||||
DPRINTF(("save_ns: ns_name_uncompress failed")
|
||||
);
|
||||
free(nsrr);
|
||||
return (-1);
|
||||
}
|
||||
@ -526,8 +561,7 @@ save_ns(res_state statp, ns_msg *msg, ns_sect sect,
|
||||
}
|
||||
INIT_LINK(nsrr, link);
|
||||
INIT_LIST(nsrr->addrs);
|
||||
nsrr->have_v4 = 0;
|
||||
nsrr->have_v6 = 0;
|
||||
nsrr->flags = 0;
|
||||
APPEND(*nsrrsp, nsrr, link);
|
||||
}
|
||||
if (save_a(statp, msg, ns_s_ar,
|
||||
@ -556,7 +590,8 @@ save_a(res_state statp, ns_msg *msg, ns_sect sect,
|
||||
p_section(sect, ns_o_query), i));
|
||||
return (-1);
|
||||
}
|
||||
if ((ns_rr_type(rr) != ns_t_a && ns_rr_type(rr) != ns_t_aaaa) ||
|
||||
if ((ns_rr_type(rr) != ns_t_a &&
|
||||
ns_rr_type(rr) != ns_t_aaaa) ||
|
||||
ns_rr_class(rr) != class ||
|
||||
ns_samename(ns_rr_name(rr), owner) != 1 ||
|
||||
ns_rr_rdlen(rr) != NS_INADDRSZ)
|
||||
@ -581,7 +616,7 @@ save_a(res_state statp, ns_msg *msg, ns_sect sect,
|
||||
memcpy(&arr->addr.sin.sin_addr, ns_rr_rdata(rr),
|
||||
NS_INADDRSZ);
|
||||
arr->addr.sin.sin_port = htons(NAMESERVER_PORT);
|
||||
nsrr->have_v4 = 1;
|
||||
nsrr->flags |= RR_NS_HAVE_V4;
|
||||
break;
|
||||
case ns_t_aaaa:
|
||||
arr->addr.sin6.sin6_family = AF_INET6;
|
||||
@ -590,7 +625,7 @@ save_a(res_state statp, ns_msg *msg, ns_sect sect,
|
||||
#endif
|
||||
memcpy(&arr->addr.sin6.sin6_addr, ns_rr_rdata(rr), 16);
|
||||
arr->addr.sin.sin_port = htons(NAMESERVER_PORT);
|
||||
nsrr->have_v6 = 1;
|
||||
nsrr->flags |= RR_NS_HAVE_V6;
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
@ -646,7 +681,7 @@ do_query(res_state statp, const char *dname, ns_class class, ns_type qtype,
|
||||
DPRINTF(("do_query: res_nmkquery failed"));
|
||||
return (-1);
|
||||
}
|
||||
n = res_nsend(statp, req, n, resp, NS_PACKETSZ);
|
||||
n = res_nsend(statp, req, n, resp, NS_MAXMSG);
|
||||
if (n < 0) {
|
||||
DPRINTF(("do_query: res_nsend failed"));
|
||||
return (-1);
|
||||
|
@ -70,7 +70,7 @@
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)res_init.c 8.1 (Berkeley) 6/7/93";
|
||||
static const char rcsid[] = "$Id: res_init.c,v 8.29 2002/05/31 06:05:31 marka Exp $";
|
||||
static const char rcsid[] = "$Id: res_init.c,v 8.32 2003/04/03 06:31:10 marka Exp $";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "port_before.h"
|
||||
@ -161,6 +161,7 @@ __res_vinit(res_state statp, int preinit) {
|
||||
char *net;
|
||||
#endif
|
||||
int dots;
|
||||
union res_sockaddr_union u[2];
|
||||
|
||||
if (!preinit) {
|
||||
statp->retrans = RES_TIMEOUT;
|
||||
@ -172,17 +173,32 @@ __res_vinit(res_state statp, int preinit) {
|
||||
if ((statp->options & RES_INIT) != 0)
|
||||
res_ndestroy(statp);
|
||||
|
||||
memset(u, 0, sizeof(u));
|
||||
#ifdef USELOOPBACK
|
||||
statp->nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
|
||||
u[nserv].sin.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
|
||||
#else
|
||||
statp->nsaddr.sin_addr.s_addr = INADDR_ANY;
|
||||
u[nserv].sin.sin_addr.s_addr = INADDR_ANY;
|
||||
#endif
|
||||
statp->nsaddr.sin_family = AF_INET;
|
||||
statp->nsaddr.sin_port = htons(NAMESERVER_PORT);
|
||||
u[nserv].sin.sin_family = AF_INET;
|
||||
u[nserv].sin.sin_port = htons(NAMESERVER_PORT);
|
||||
#ifdef HAVE_SA_LEN
|
||||
statp->nsaddr.sin_len = sizeof(struct sockaddr_in);
|
||||
u[nserv].sin.sin_len = sizeof(struct sockaddr_in);
|
||||
#endif
|
||||
statp->nscount = 1;
|
||||
nserv++;
|
||||
#ifdef HAS_INET6_STRUCTS
|
||||
#ifdef USELOOPBACK
|
||||
u[nserv].sin6.sin6_addr = in6addr_loopback;
|
||||
#else
|
||||
u[nserv].sin6.sin6_addr = in6addr_any;
|
||||
#endif
|
||||
u[nserv].sin6.sin6_family = AF_INET6;
|
||||
u[nserv].sin6.sin6_port = htons(NAMESERVER_PORT);
|
||||
#ifdef HAVE_SA_LEN
|
||||
u[nserv].sin6.sin6_len = sizeof(struct sockaddr_in6);
|
||||
#endif
|
||||
nserv++;
|
||||
#endif
|
||||
statp->nscount = 0;
|
||||
statp->ndots = 1;
|
||||
statp->pfcode = 0;
|
||||
statp->_vcsock = -1;
|
||||
@ -196,11 +212,11 @@ __res_vinit(res_state statp, int preinit) {
|
||||
statp->_u._ext.ext->nsaddrs[0].sin = statp->nsaddr;
|
||||
strcpy(statp->_u._ext.ext->nsuffix, "ip6.arpa");
|
||||
strcpy(statp->_u._ext.ext->nsuffix2, "ip6.int");
|
||||
strcpy(statp->_u._ext.ext->bsuffix, "ip6.arpa");
|
||||
}
|
||||
#ifdef RESOLVSORT
|
||||
statp->nsort = 0;
|
||||
#endif
|
||||
res_setservers(statp, u, nserv);
|
||||
|
||||
/* Allow user to override the local domain definition */
|
||||
if ((cp = getenv("LOCALDOMAIN")) != NULL) {
|
||||
@ -242,6 +258,7 @@ __res_vinit(res_state statp, int preinit) {
|
||||
(line[sizeof(name) - 1] == ' ' || \
|
||||
line[sizeof(name) - 1] == '\t'))
|
||||
|
||||
nserv = 0;
|
||||
if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) {
|
||||
/* read the config file */
|
||||
while (fgets(buf, sizeof(buf), fp) != NULL) {
|
||||
@ -507,9 +524,6 @@ res_setoptions(res_state statp, const char *options, const char *source)
|
||||
statp->options |= RES_USE_EDNS0;
|
||||
}
|
||||
#endif
|
||||
else if (!strncmp(cp, "a6", sizeof("a6") - 1)) {
|
||||
statp->options |= RES_USE_A6;
|
||||
}
|
||||
else if (!strncmp(cp, "dname", sizeof("dname") - 1)) {
|
||||
statp->options |= RES_USE_DNAME;
|
||||
}
|
||||
@ -529,14 +543,6 @@ res_setoptions(res_state statp, const char *options, const char *source)
|
||||
strncpy(ext->nsuffix2, cp, i);
|
||||
ext->nsuffix2[i] = '\0';
|
||||
}
|
||||
else if (!strncmp(cp, "bitstring:", sizeof("bitstring:") - 1)) {
|
||||
if (ext == NULL)
|
||||
goto skip;
|
||||
cp += sizeof("bitstring:") - 1;
|
||||
i = MIN(strcspn(cp, " \t"), sizeof(ext->bsuffix) - 1);
|
||||
strncpy(ext->bsuffix, cp, i);
|
||||
ext->bsuffix[i] = '\0';
|
||||
}
|
||||
else if (!strncmp(cp, "v6revmode:", sizeof("v6revmode:") - 1)) {
|
||||
cp += sizeof("v6revmode:") - 1;
|
||||
/* "nibble" and "bitstring" used to be valid */
|
||||
@ -628,13 +634,6 @@ res_get_nibblesuffix2(res_state statp) {
|
||||
return ("ip6.int");
|
||||
}
|
||||
|
||||
const char *
|
||||
res_get_bitstringsuffix(res_state statp) {
|
||||
if (statp->_u._ext.ext)
|
||||
return (statp->_u._ext.ext->bsuffix);
|
||||
return ("ip6.arpa");
|
||||
}
|
||||
|
||||
void
|
||||
res_setservers(res_state statp, const union res_sockaddr_union *set, int cnt) {
|
||||
int i, nserv;
|
||||
|
@ -70,7 +70,7 @@
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)res_mkquery.c 8.1 (Berkeley) 6/4/93";
|
||||
static const char rcsid[] = "$Id: res_mkquery.c,v 8.14 2001/09/24 13:50:27 marka Exp $";
|
||||
static const char rcsid[] = "$Id: res_mkquery.c,v 8.15.8.1 2003/06/02 05:59:57 marka Exp $";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "port_before.h"
|
||||
@ -105,7 +105,7 @@ res_nmkquery(res_state statp,
|
||||
int buflen) /* size of buffer */
|
||||
{
|
||||
register HEADER *hp;
|
||||
register u_char *cp;
|
||||
register u_char *cp, *ep;
|
||||
register int n;
|
||||
u_char *dnptrs[20], **dpp, **lastdnptr;
|
||||
|
||||
@ -128,7 +128,7 @@ res_nmkquery(res_state statp,
|
||||
hp->rd = (statp->options & RES_RECURSE) != 0;
|
||||
hp->rcode = NOERROR;
|
||||
cp = buf + HFIXEDSZ;
|
||||
buflen -= HFIXEDSZ;
|
||||
ep = buf + buflen;
|
||||
dpp = dnptrs;
|
||||
*dpp++ = buf;
|
||||
*dpp++ = NULL;
|
||||
@ -139,15 +139,15 @@ res_nmkquery(res_state statp,
|
||||
switch (op) {
|
||||
case QUERY: /*FALLTHROUGH*/
|
||||
case NS_NOTIFY_OP:
|
||||
if ((buflen -= QFIXEDSZ) < 0)
|
||||
if (ep - cp < QFIXEDSZ)
|
||||
return (-1);
|
||||
if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
|
||||
if ((n = dn_comp(dname, cp, ep - cp - QFIXEDSZ, dnptrs,
|
||||
lastdnptr)) < 0)
|
||||
return (-1);
|
||||
cp += n;
|
||||
buflen -= n;
|
||||
__putshort(type, cp);
|
||||
ns_put16(type, cp);
|
||||
cp += INT16SZ;
|
||||
__putshort(class, cp);
|
||||
ns_put16(class, cp);
|
||||
cp += INT16SZ;
|
||||
hp->qdcount = htons(1);
|
||||
if (op == QUERY || data == NULL)
|
||||
@ -155,19 +155,20 @@ res_nmkquery(res_state statp,
|
||||
/*
|
||||
* Make an additional record for completion domain.
|
||||
*/
|
||||
buflen -= RRFIXEDSZ;
|
||||
n = dn_comp((const char *)data, cp, buflen, dnptrs, lastdnptr);
|
||||
if ((ep - cp) < RRFIXEDSZ)
|
||||
return (-1);
|
||||
n = dn_comp((const char *)data, cp, ep - cp - RRFIXEDSZ,
|
||||
dnptrs, lastdnptr);
|
||||
if (n < 0)
|
||||
return (-1);
|
||||
cp += n;
|
||||
buflen -= n;
|
||||
__putshort(T_NULL, cp);
|
||||
ns_put16(T_NULL, cp);
|
||||
cp += INT16SZ;
|
||||
__putshort(class, cp);
|
||||
ns_put16(class, cp);
|
||||
cp += INT16SZ;
|
||||
__putlong(0, cp);
|
||||
ns_put32(0, cp);
|
||||
cp += INT32SZ;
|
||||
__putshort(0, cp);
|
||||
ns_put16(0, cp);
|
||||
cp += INT16SZ;
|
||||
hp->arcount = htons(1);
|
||||
break;
|
||||
@ -176,16 +177,16 @@ res_nmkquery(res_state statp,
|
||||
/*
|
||||
* Initialize answer section
|
||||
*/
|
||||
if (buflen < 1 + RRFIXEDSZ + datalen)
|
||||
if (ep - cp < 1 + RRFIXEDSZ + datalen)
|
||||
return (-1);
|
||||
*cp++ = '\0'; /* no domain name */
|
||||
__putshort(type, cp);
|
||||
ns_put16(type, cp);
|
||||
cp += INT16SZ;
|
||||
__putshort(class, cp);
|
||||
ns_put16(class, cp);
|
||||
cp += INT16SZ;
|
||||
__putlong(0, cp);
|
||||
ns_put32(0, cp);
|
||||
cp += INT32SZ;
|
||||
__putshort(datalen, cp);
|
||||
ns_put16(datalen, cp);
|
||||
cp += INT16SZ;
|
||||
if (datalen) {
|
||||
memcpy(cp, data, datalen);
|
||||
@ -207,15 +208,14 @@ res_nmkquery(res_state statp,
|
||||
#endif
|
||||
|
||||
int
|
||||
res_nopt(statp, n0, buf, buflen, anslen)
|
||||
res_state statp;
|
||||
int n0;
|
||||
u_char *buf; /* buffer to put query */
|
||||
int buflen; /* size of buffer */
|
||||
int anslen; /* answer buffer length */
|
||||
res_nopt(res_state statp,
|
||||
int n0, /* current offset in buffer */
|
||||
u_char *buf, /* buffer to put query */
|
||||
int buflen, /* size of buffer */
|
||||
int anslen) /* UDP answer buffer size */
|
||||
{
|
||||
register HEADER *hp;
|
||||
register u_char *cp;
|
||||
register u_char *cp, *ep;
|
||||
u_int16_t flags = 0;
|
||||
|
||||
#ifdef DEBUG
|
||||
@ -225,17 +225,16 @@ res_nopt(statp, n0, buf, buflen, anslen)
|
||||
|
||||
hp = (HEADER *) buf;
|
||||
cp = buf + n0;
|
||||
buflen -= n0;
|
||||
ep = buf + buflen;
|
||||
|
||||
if (buflen < 1 + RRFIXEDSZ)
|
||||
return -1;
|
||||
if ((ep - cp) < 1 + RRFIXEDSZ)
|
||||
return (-1);
|
||||
|
||||
*cp++ = 0; /* "." */
|
||||
buflen--;
|
||||
|
||||
__putshort(T_OPT, cp); /* TYPE */
|
||||
ns_put16(T_OPT, cp); /* TYPE */
|
||||
cp += INT16SZ;
|
||||
__putshort(anslen & 0xffff, cp); /* CLASS = UDP payload size */
|
||||
ns_put16(anslen & 0xffff, cp); /* CLASS = UDP payload size */
|
||||
cp += INT16SZ;
|
||||
*cp++ = NOERROR; /* extended RCODE */
|
||||
*cp++ = 0; /* EDNS version */
|
||||
@ -246,13 +245,12 @@ res_nopt(statp, n0, buf, buflen, anslen)
|
||||
#endif
|
||||
flags |= NS_OPT_DNSSEC_OK;
|
||||
}
|
||||
__putshort(flags, cp);
|
||||
ns_put16(flags, cp);
|
||||
cp += INT16SZ;
|
||||
__putshort(0, cp); /* RDLEN */
|
||||
ns_put16(0, cp); /* RDLEN */
|
||||
cp += INT16SZ;
|
||||
hp->arcount = htons(ntohs(hp->arcount) + 1);
|
||||
buflen -= RRFIXEDSZ;
|
||||
|
||||
return cp - buf;
|
||||
return (cp - buf);
|
||||
}
|
||||
#endif
|
||||
|
@ -21,7 +21,7 @@
|
||||
*/
|
||||
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: res_mkupdate.c,v 1.26 2001/05/29 05:49:47 marka Exp $";
|
||||
static const char rcsid[] = "$Id: res_mkupdate.c,v 1.27.8.1 2003/06/02 04:56:28 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "port_before.h"
|
||||
@ -302,7 +302,7 @@ res_nmkupdate(res_state statp, ns_updrec *rrecp_in, u_char *buf, int buflen) {
|
||||
|
||||
if (!getword_str(buf2, sizeof buf2, &startp, endp))
|
||||
return (-1);
|
||||
n = dn_comp(buf2, cp, buflen, dnptrs, lastdnptr);
|
||||
n = dn_comp(buf2, cp, buflen, NULL, NULL);
|
||||
if (n < 0)
|
||||
return (-1);
|
||||
cp += n;
|
||||
@ -482,8 +482,10 @@ res_nmkupdate(res_state statp, ns_updrec *rrecp_in, u_char *buf, int buflen) {
|
||||
char *ulendp;
|
||||
u_int32_t ottl;
|
||||
|
||||
errno = 0;
|
||||
ottl = strtoul(buf2, &ulendp, 10);
|
||||
if (ulendp != NULL && *ulendp != '\0')
|
||||
if (errno != 0 ||
|
||||
(ulendp != NULL && *ulendp != '\0'))
|
||||
return (-1);
|
||||
ShrinkBuffer(INT32SZ);
|
||||
PUTLONG(ottl, cp);
|
||||
@ -572,7 +574,7 @@ res_nmkupdate(res_state statp, ns_updrec *rrecp_in, u_char *buf, int buflen) {
|
||||
/* next name */
|
||||
if (!getword_str(buf2, sizeof buf2, &startp, endp))
|
||||
return (-1);
|
||||
n = dn_comp(buf2, cp, buflen, dnptrs, lastdnptr);
|
||||
n = dn_comp(buf2, cp, buflen, NULL, NULL);
|
||||
if (n < 0)
|
||||
return (-1);
|
||||
cp += n;
|
||||
@ -636,6 +638,62 @@ res_nmkupdate(res_state statp, ns_updrec *rrecp_in, u_char *buf, int buflen) {
|
||||
memcpy(cp, &in6a, NS_IN6ADDRSZ);
|
||||
cp += NS_IN6ADDRSZ;
|
||||
break;
|
||||
case ns_t_naptr:
|
||||
/* Order Preference Flags Service Replacement Regexp */
|
||||
/* Order */
|
||||
n = getnum_str(&startp, endp);
|
||||
if (n < 0 || n > 65535)
|
||||
return (-1);
|
||||
ShrinkBuffer(INT16SZ);
|
||||
PUTSHORT(n, cp);
|
||||
/* Preference */
|
||||
n = getnum_str(&startp, endp);
|
||||
if (n < 0 || n > 65535)
|
||||
return (-1);
|
||||
ShrinkBuffer(INT16SZ);
|
||||
PUTSHORT(n, cp);
|
||||
/* Flags */
|
||||
if ((n = getstr_str(buf2, sizeof buf2,
|
||||
&startp, endp)) < 0) {
|
||||
return (-1);
|
||||
}
|
||||
if (n > 255)
|
||||
return (-1);
|
||||
ShrinkBuffer(n+1);
|
||||
*cp++ = n;
|
||||
memcpy(cp, buf2, n);
|
||||
cp += n;
|
||||
/* Service Classes */
|
||||
if ((n = getstr_str(buf2, sizeof buf2,
|
||||
&startp, endp)) < 0) {
|
||||
return (-1);
|
||||
}
|
||||
if (n > 255)
|
||||
return (-1);
|
||||
ShrinkBuffer(n+1);
|
||||
*cp++ = n;
|
||||
memcpy(cp, buf2, n);
|
||||
cp += n;
|
||||
/* Pattern */
|
||||
if ((n = getstr_str(buf2, sizeof buf2,
|
||||
&startp, endp)) < 0) {
|
||||
return (-1);
|
||||
}
|
||||
if (n > 255)
|
||||
return (-1);
|
||||
ShrinkBuffer(n+1);
|
||||
*cp++ = n;
|
||||
memcpy(cp, buf2, n);
|
||||
cp += n;
|
||||
/* Replacement */
|
||||
if (!getword_str(buf2, sizeof buf2, &startp, endp))
|
||||
return (-1);
|
||||
n = dn_comp(buf2, cp, buflen, NULL, NULL);
|
||||
if (n < 0)
|
||||
return (-1);
|
||||
cp += n;
|
||||
ShrinkBuffer(n);
|
||||
break;
|
||||
default:
|
||||
return (-1);
|
||||
} /*switch*/
|
||||
@ -807,7 +865,7 @@ gethexnum_str(u_char **startpp, u_char *endp) {
|
||||
}
|
||||
|
||||
/*
|
||||
* Get a whitespace delimited base 16 number from a string (not file) into buf
|
||||
* Get a whitespace delimited base 10 number from a string (not file) into buf
|
||||
* update the start pointer to point after the number in the string.
|
||||
*/
|
||||
static int
|
||||
|
@ -11,7 +11,6 @@ struct __res_state_ext {
|
||||
} addr, mask;
|
||||
} sort_list[MAXRESOLVSORT];
|
||||
char nsuffix[64];
|
||||
char bsuffix[64];
|
||||
char nsuffix2[64];
|
||||
};
|
||||
|
||||
|
@ -70,7 +70,7 @@
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)res_query.c 8.1 (Berkeley) 6/4/93";
|
||||
static const char rcsid[] = "$Id: res_query.c,v 8.23 2001/09/24 13:50:29 marka Exp $";
|
||||
static const char rcsid[] = "$Id: res_query.c,v 8.24 2003/01/31 15:25:58 vixie Exp $";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "port_before.h"
|
||||
@ -167,8 +167,11 @@ again:
|
||||
if (hp->rcode != NOERROR || ntohs(hp->ancount) == 0) {
|
||||
#ifdef DEBUG
|
||||
if (statp->options & RES_DEBUG)
|
||||
printf(";; rcode = %d, ancount=%d\n", hp->rcode,
|
||||
ntohs(hp->ancount));
|
||||
printf(";; rcode = (%s), counts = an:%d ns:%d ar:%d\n",
|
||||
p_rcode(hp->rcode),
|
||||
ntohs(hp->ancount),
|
||||
ntohs(hp->nscount),
|
||||
ntohs(hp->arcount));
|
||||
#endif
|
||||
switch (hp->rcode) {
|
||||
case NXDOMAIN:
|
||||
|
@ -70,7 +70,7 @@
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static const char sccsid[] = "@(#)res_send.c 8.1 (Berkeley) 6/4/93";
|
||||
static const char rcsid[] = "$Id: res_send.c,v 8.49 2002/03/29 21:50:51 marka Exp $";
|
||||
static const char rcsid[] = "$Id: res_send.c,v 8.51.2.1 2003/06/02 05:59:57 marka Exp $";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
/*
|
||||
@ -171,6 +171,9 @@ res_ourserver_p(const res_state statp, const struct sockaddr *sa) {
|
||||
srv6 = (struct sockaddr_in6 *)get_nsaddr(statp, ns);
|
||||
if (srv6->sin6_family == in6p->sin6_family &&
|
||||
srv6->sin6_port == in6p->sin6_port &&
|
||||
#ifdef HAVE_SIN6_SCOPE_ID
|
||||
srv6->sin6_scope_id == in6p->sin6_scope_id &&
|
||||
#endif
|
||||
(IN6_IS_ADDR_UNSPECIFIED(&srv6->sin6_addr) ||
|
||||
IN6_ARE_ADDR_EQUAL(&srv6->sin6_addr, &in6p->sin6_addr)))
|
||||
return (1);
|
||||
@ -386,6 +389,8 @@ res_nsend(res_state statp,
|
||||
int nsaplen;
|
||||
nsap = get_nsaddr(statp, ns);
|
||||
nsaplen = get_salen(nsap);
|
||||
statp->_flags &= ~RES_F_LASTMASK;
|
||||
statp->_flags |= (ns << RES_F_LASTSHIFT);
|
||||
same_ns:
|
||||
if (statp->qhook) {
|
||||
int done = 0, loops = 0;
|
||||
@ -623,7 +628,7 @@ send_vc(res_state statp,
|
||||
/*
|
||||
* Send length & message
|
||||
*/
|
||||
putshort((u_short)buflen, (u_char*)&len);
|
||||
ns_put16((u_short)buflen, (u_char*)&len);
|
||||
iov[0] = evConsIovec(&len, INT16SZ);
|
||||
DE_CONST(buf, tmp);
|
||||
iov[1] = evConsIovec(tmp, buflen);
|
||||
|
@ -1,5 +1,5 @@
|
||||
#if !defined(lint) && !defined(SABER)
|
||||
static const char rcsid[] = "$Id: res_update.c,v 1.34 2002/04/12 06:28:52 marka Exp $";
|
||||
static const char rcsid[] = "$Id: res_update.c,v 1.35.8.2 2003/06/02 09:24:40 marka Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
@ -77,7 +77,7 @@ struct zonegrp {
|
||||
|
||||
/* Forward. */
|
||||
|
||||
static void res_dprintf(const char *, ...);
|
||||
static void res_dprintf(const char *, ...) ISC_FORMAT_PRINTF(1, 2);
|
||||
|
||||
/* Macros. */
|
||||
|
||||
@ -92,12 +92,18 @@ static void res_dprintf(const char *, ...);
|
||||
int
|
||||
res_nupdate(res_state statp, ns_updrec *rrecp_in, ns_tsig_key *key) {
|
||||
ns_updrec *rrecp;
|
||||
u_char answer[PACKETSZ], packet[2*PACKETSZ];
|
||||
u_char answer[PACKETSZ];
|
||||
u_char *packet;
|
||||
struct zonegrp *zptr, tgrp;
|
||||
LIST(struct zonegrp) zgrps;
|
||||
int nzones = 0, nscount = 0, n;
|
||||
union res_sockaddr_union nsaddrs[MAXNS];
|
||||
|
||||
packet = malloc(NS_MAXMSG);
|
||||
if (packet == NULL) {
|
||||
DPRINTF(("malloc failed"));
|
||||
return (0);
|
||||
}
|
||||
/* Thread all of the updates onto a list of groups. */
|
||||
INIT_LIST(zgrps);
|
||||
memset(&tgrp, 0, sizeof (tgrp));
|
||||
@ -150,7 +156,7 @@ res_nupdate(res_state statp, ns_updrec *rrecp_in, ns_tsig_key *key) {
|
||||
|
||||
/* Marshall the update message. */
|
||||
n = res_nmkupdate(statp, HEAD(zptr->z_rrlist),
|
||||
packet, sizeof packet);
|
||||
packet, NS_MAXMSG);
|
||||
DPRINTF(("res_mkupdate -> %d", n));
|
||||
if (n < 0)
|
||||
goto done;
|
||||
@ -188,6 +194,7 @@ res_nupdate(res_state statp, ns_updrec *rrecp_in, ns_tsig_key *key) {
|
||||
if (nscount != 0)
|
||||
res_setservers(statp, nsaddrs, nscount);
|
||||
|
||||
free(packet);
|
||||
return (nzones);
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
set -e
|
||||
PATH=/bin:/usr/bin:$PATH; export PATH
|
||||
trap "rm -f tmp$$a.c tmp$$b.c tmp$$a.o tmp$$b.o" 0
|
||||
trap "rm -f tmp$$[abc].[oc]" 0 1 2 15
|
||||
target=port_ipv6
|
||||
new=new_${target}.h
|
||||
old=${target}.h
|
||||
@ -19,6 +19,13 @@ cat > tmp$$b.c <<EOF
|
||||
struct in6_addr xx;
|
||||
EOF
|
||||
|
||||
cat > tmp$$c.c <<EOF
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
struct sockaddr_in6 xx;
|
||||
main() { xx.sin6_scope_id = 0; }
|
||||
EOF
|
||||
|
||||
cat > ${new} <<EOF
|
||||
|
||||
/* This file is automatically generated. Do Not Edit. */
|
||||
@ -37,6 +44,12 @@ then
|
||||
else
|
||||
echo "#define in6_addr in_addr6" >> ${new}
|
||||
fi
|
||||
if ${CC} -c tmp$$c.c > /dev/null 2>&1
|
||||
then
|
||||
echo "#define HAVE_SIN6_SCOPE_ID" >> ${new}
|
||||
else
|
||||
echo "#undef HAVE_SIN6_SCOPE_ID" >> ${new}
|
||||
fi
|
||||
else
|
||||
echo "#undef HAS_INET6_STRUCTS" >> ${new}
|
||||
fi
|
||||
|
@ -6,12 +6,20 @@
|
||||
#define USE_WAITPID
|
||||
#define HAVE_GETRUSAGE
|
||||
#define HAVE_FCHMOD
|
||||
#define NEED_PSELECT
|
||||
#define HAVE_SA_LEN
|
||||
#define HAVE_MINIMUM_IFREQ
|
||||
#define USE_LOG_CONS
|
||||
#define HAVE_CHROOT
|
||||
#define CAN_CHANGE_ID
|
||||
#define USE_IFNAMELINKID
|
||||
#if __FreeBSD_version >= 330000
|
||||
#define HAVE_STRLCPY
|
||||
#define HAVE_STRLCAT
|
||||
#endif
|
||||
|
||||
#define DIG_PING "/sbin/ping"
|
||||
#define DIG_TAIL "/usr/bin/tail"
|
||||
#define DIG_PINGFMT "%s -q -c 3 %s | %s -3"
|
||||
|
||||
#define _TIMEZONE timezone
|
||||
|
||||
@ -22,6 +30,13 @@
|
||||
#define KMEM "/dev/kmem"
|
||||
#define UDPSUM "udpcksum"
|
||||
|
||||
#if defined(__FreeBSD_version) && __FreeBSD_version >= 500041
|
||||
#undef NEED_PSELECT
|
||||
#include <sys/select.h>
|
||||
#else
|
||||
#define NEED_PSELECT
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/param.h>
|
||||
|
Loading…
x
Reference in New Issue
Block a user