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:
Doug Barton 2003-06-17 08:25:13 +00:00
parent 7f1ab065eb
commit 55d7029049
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/vendor/bind/dist/; revision=116464
95 changed files with 2221 additions and 1825 deletions

File diff suppressed because it is too large Load diff

View file

@ -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.

View file

@ -1 +1 @@
8.3.4-REL
8.3.6-REL

View file

@ -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);

View file

@ -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;

View file

@ -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;
}

View file

@ -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 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
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 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
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 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
(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 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
} 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 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
"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 @@ getzone(struct zoneinfo *zp, u_int32_t serial_no, int port) {
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;

View file

@ -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 $
*/
/*

View file

@ -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;
}

View file

@ -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)",

View file

@ -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 */
/*

View file

@ -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);
}

View file

@ -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)

View file

@ -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;

View file

@ -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,

View file

@ -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-- */

View file

@ -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

View file

@ -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);
}
}

View file

@ -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",

View file

@ -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},

View file

@ -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);
}

View file

@ -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) {

View file

@ -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 */
/*

View file

@ -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

View file

@ -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 @@ doaddinfo(HEADER *hp, u_char *msg, int msglen) {
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 @@ doaddinfo(HEADER *hp, u_char *msg, int msglen) {
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 @@ doaddinfo(HEADER *hp, u_char *msg, int msglen) {
}
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 @@ doaddinfo(HEADER *hp, u_char *msg, int msglen) {
continue;
if (dp->d_rcode)
continue;
if (drop)
continue;
/*
* Should be smart and eliminate duplicate
* data here. XXX
@ -2426,7 +2438,14 @@ doaddinfo(HEADER *hp, u_char *msg, int msglen) {
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 @@ doaddinfo(HEADER *hp, u_char *msg, int msglen) {
(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),

View file

@ -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 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
tp = cp;
restart = 0;
validanswer = -1;
nscount = 0;
soacount = 0;
@ -1001,6 +1000,10 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
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 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
}
if (type == T_SOA) {
soacount++;
/* -ve caching only. */
db_detach(&dp);
continue;
}
break;
case T_NXT:
@ -1182,38 +1188,6 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
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 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
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 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
(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 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
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 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
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 @@ ns_resp(u_char *msg, int msglen, struct sockaddr_in from, struct qstream *qsp)
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;
}
}

View file

@ -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;
}

View file

@ -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:

View file

@ -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;

View file

@ -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);
}

View file

@ -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);

View file

@ -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);
}

View file

@ -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>

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 */

View file

@ -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

View file

@ -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*/

View file

@ -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

View file

@ -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*/

View file

@ -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 *);

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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 *);

View file

@ -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 *,

View 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;

View file

@ -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

View file

@ -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,

View file

@ -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()
{

View file

@ -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()
{

View file

@ -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 *

View file

@ -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

View file

@ -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;

View file

@ -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;
}

View file

@ -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);

View file

@ -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)

View file

@ -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 *

View file

@ -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)

View file

@ -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>

View file

@ -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. */

View file

@ -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)

View file

@ -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
}
}

View file

@ -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;

View file

@ -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);
}

View file

@ -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;

View file

@ -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;

View file

@ -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)

View file

@ -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;

View file

@ -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);

View file

@ -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

View file

@ -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");
}

View file

@ -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

View file

@ -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

View file

@ -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 ",

View file

@ -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);

View file

@ -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);

View file

@ -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";

View file

@ -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';

View file

@ -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 */

View file

@ -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

View file

@ -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)

View file

@ -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);

View file

@ -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;

View file

@ -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

View file

@ -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

View file

@ -11,7 +11,6 @@ struct __res_state_ext {
} addr, mask;
} sort_list[MAXRESOLVSORT];
char nsuffix[64];
char bsuffix[64];
char nsuffix2[64];
};

View file

@ -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 @@ res_nquery(res_state statp,
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:

View file

@ -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);

View file

@ -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);
}

View file

@ -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

View file

@ -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>