The last of the bind-4.9.3-REL resolver merges.

This commit is contained in:
Peter Wemm 1996-01-13 09:03:58 +00:00
parent 6e0871974b
commit 4faad310d3
8 changed files with 280 additions and 249 deletions

View File

@ -53,7 +53,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)gethostnamadr.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: gethostbydns.c,v 1.6 1995/08/21 09:15:32 bde Exp $";
static char rcsid[] = "$Id: gethostbydns.c,v 1.7 1995/10/22 14:39:02 phk Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
@ -76,10 +76,8 @@ static char rcsid[] = "$Id: gethostbydns.c,v 1.6 1995/08/21 09:15:32 bde Exp $";
#define MAXALIASES 35
#define MAXADDRS 35
#define MULTI_PTRS_ARE_ALIASES 1 /* XXX - experimental */
static const char AskedForGot[] =
"gethostby*.gethostanswer: asked for \"%s\", got \"%s\"";
"gethostby*.gethostanswer: asked for \"%s\", got \"%s\"";
static char *h_addr_ptrs[MAXADDRS + 1];
@ -90,6 +88,10 @@ static struct in_addr host_addr;
static FILE *hostf = NULL;
static int stayopen = 0;
#ifdef RESOLVSORT
static void addrsort __P((char **, int));
#endif
#if PACKETSZ > 1024
#define MAXPACKET PACKETSZ
#else
@ -126,51 +128,6 @@ dprintf(msg, num)
#endif
#ifdef RESOLVSORT
static void
addrsort(ap, num)
char **ap;
int num;
{
int i, j;
char **p;
short aval[MAXADDRS];
int needsort = 0;
p = ap;
for (i = 0; i < num; i++, p++) {
for (j = 0 ; (unsigned)j < _res.nsort; j++)
if (_res.sort_list[j].addr.s_addr ==
(((struct in_addr *)(*p))->s_addr & _res.sort_list[j].mask))
break;
aval[i] = j;
if (needsort == 0 && i > 0 && j < aval[i-1])
needsort = i;
}
if (!needsort)
return;
while (needsort < num) {
for (j = needsort - 1; j >= 0; j--) {
if (aval[j] > aval[j+1]) {
char *hp;
i = aval[j];
aval[j] = aval[j+1];
aval[j+1] = i;
hp = ap[j];
ap[j] = ap[j+1];
ap[j+1] = hp;
} else
break;
}
needsort++;
}
}
#endif
static struct hostent *
gethostanswer(answer, anslen, qname, qclass, qtype)
const querybuf *answer;
@ -187,7 +144,9 @@ gethostanswer(answer, anslen, qname, qclass, qtype)
int haveanswer, had_error;
int toobig = 0;
char tbuf[MAXDNAME+1];
const char *tname;
tname = qname;
host.h_name = NULL;
eom = answer->buf + anslen;
/*
@ -225,7 +184,9 @@ gethostanswer(answer, anslen, qname, qclass, qtype)
host.h_aliases = host_aliases;
hap = h_addr_ptrs;
*hap = NULL;
#if BSD >= 43 || defined(h_addr) /* new-style hostent structure */
host.h_addr_list = h_addr_ptrs;
#endif
haveanswer = 0;
had_error = 0;
while (ancount-- > 0 && cp < eom && !had_error) {
@ -257,7 +218,7 @@ gethostanswer(answer, anslen, qname, qclass, qtype)
cp += n;
if (host.h_name && strcasecmp(host.h_name, bp) != 0) {
syslog(LOG_NOTICE|LOG_AUTH,
"gethostby*.gethostanswer: asked for \"%s\", got CNAME for \"%s\"",
"gethostby*.gethostanswer: asked for \"%s\", got CNAME for \"%s\"",
host.h_name, bp);
continue; /* XXX - had_error++ ? */
}
@ -278,19 +239,36 @@ gethostanswer(answer, anslen, qname, qclass, qtype)
buflen -= n;
continue;
}
if (qtype == T_PTR && type == T_CNAME) {
n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf);
if (n < 0) {
had_error++;
continue;
}
cp += n;
/* Get canonical name. */
n = strlen(tbuf) + 1; /* for the \0 */
if (n > buflen) {
had_error++;
continue;
}
strcpy(bp, tbuf);
tname = bp;
bp += n;
buflen -= n;
continue;
}
if (type != qtype) {
/* CNAME->PTR should not cause a log message. */
if (!(qtype == T_PTR && type == T_CNAME))
syslog(LOG_NOTICE|LOG_AUTH,
"gethostby*.gethostanswer: asked for \"%s %s %s\", got type \"%s\"",
qname, p_class(qclass), p_type(qtype),
p_type(type));
"gethostby*.gethostanswer: asked for \"%s %s %s\", got type \"%s\"",
qname, p_class(qclass), p_type(qtype),
p_type(type));
cp += n;
continue; /* XXX - had_error++ ? */
}
switch (type) {
case T_PTR:
if (strcasecmp(qname, bp) != 0) {
if (strcasecmp(tname, bp) != 0) {
syslog(LOG_NOTICE|LOG_AUTH,
AskedForGot, qname, bp);
cp += n;
@ -301,7 +279,7 @@ gethostanswer(answer, anslen, qname, qclass, qtype)
had_error++;
break;
}
#if MULTI_PTRS_ARE_ALIASES
#ifdef MULTI_PTRS_ARE_ALIASES
cp += n;
if (!haveanswer)
host.h_name = bp;
@ -355,7 +333,7 @@ gethostanswer(answer, anslen, qname, qclass, qtype)
if (hap >= &h_addr_ptrs[MAXADDRS-1]) {
if (!toobig++)
dprintf("Too many addresses (%d)\n",
MAXADDRS);
MAXADDRS);
cp += n;
continue;
}
@ -384,6 +362,11 @@ gethostanswer(answer, anslen, qname, qclass, qtype)
qclass == C_IN && qtype == T_A)
addrsort(h_addr_ptrs, haveanswer);
# endif /*RESOLVSORT*/
#if BSD >= 43 || defined(h_addr) /* new-style hostent structure */
/* nothing */
#else
host.h_addr = h_addr_ptrs[0];
#endif /*BSD*/
if (!host.h_name) {
n = strlen(qname) + 1; /* for the \0 */
strcpy(bp, qname);
@ -445,10 +428,15 @@ _gethostbydnsname(name)
host.h_length = INT32SZ;
h_addr_ptrs[0] = (char *)&host_addr;
h_addr_ptrs[1] = NULL;
#if BSD >= 43 || defined(h_addr) /* new-style hostent structure */
host.h_addr_list = h_addr_ptrs;
#else
host.h_addr = h_addr_ptrs[0];
#endif
h_errno = NETDB_SUCCESS;
return (&host);
}
if (!isdigit(*cp) && *cp != '.')
if (!isdigit(*cp) && *cp != '.')
break;
}
@ -474,7 +462,7 @@ _gethostbydnsaddr(addr, len, type)
u_long old_options;
char hname2[MAXDNAME+1];
#endif /*SUNSECURITY*/
if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
h_errno = NETDB_INTERNAL;
return (NULL);
@ -535,10 +523,56 @@ _gethostbydnsaddr(addr, len, type)
return (hp);
}
#ifdef RESOLVSORT
static void
addrsort(ap, num)
char **ap;
int num;
{
int i, j;
char **p;
short aval[MAXADDRS];
int needsort = 0;
p = ap;
for (i = 0; i < num; i++, p++) {
for (j = 0 ; (unsigned)j < _res.nsort; j++)
if (_res.sort_list[j].addr.s_addr ==
(((struct in_addr *)(*p))->s_addr & _res.sort_list[j].mask))
break;
aval[i] = j;
if (needsort == 0 && i > 0 && j < aval[i-1])
needsort = i;
}
if (!needsort)
return;
while (needsort < num) {
for (j = needsort - 1; j >= 0; j--) {
if (aval[j] > aval[j+1]) {
char *hp;
i = aval[j];
aval[j] = aval[j+1];
aval[j+1] = i;
hp = ap[j];
ap[j] = ap[j+1];
ap[j+1] = hp;
} else
break;
}
needsort++;
}
}
#endif
void
_sethostdnsent(stayopen)
int stayopen;
{
if ((_res.options & RES_INIT) == 0 && res_init() == -1)
return;
if (stayopen)
_res.options |= RES_STAYOPEN | RES_USEVC;
}

View File

@ -53,7 +53,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)gethostnamadr.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: gethostbyht.c,v 1.1 1994/09/25 02:12:11 pst Exp $";
static char rcsid[] = "$Id: gethostbyht.c,v 1.2 1995/05/30 05:40:44 rgrimes Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
@ -67,21 +67,20 @@ static char rcsid[] = "$Id: gethostbyht.c,v 1.1 1994/09/25 02:12:11 pst Exp $";
#include <string.h>
#define MAXALIASES 35
#define MAXADDRS 35
static struct hostent host;
static char *host_aliases[MAXALIASES];
static char hostbuf[BUFSIZ+1];
static FILE *hostf = NULL;
static char hostaddr[MAXADDRS];
static char *host_addrs[2];
static struct in_addr host_addr;
static char *h_addr_ptrs[2];
static int stayopen = 0;
void
_sethosthtent(f)
int f;
{
if (hostf == NULL)
if (!hostf)
hostf = fopen(_PATH_HOSTS, "r" );
else
rewind(hostf);
@ -103,33 +102,40 @@ gethostent()
char *p;
register char *cp, **q;
if (hostf == NULL && (hostf = fopen(_PATH_HOSTS, "r" )) == NULL)
if (!hostf && !(hostf = fopen(_PATH_HOSTS, "r" ))) {
h_errno = NETDB_INTERNAL;
return (NULL);
}
again:
if ((p = fgets(hostbuf, BUFSIZ, hostf)) == NULL)
if (!(p = fgets(hostbuf, sizeof hostbuf, hostf))) {
h_errno = HOST_NOT_FOUND;
return (NULL);
}
if (*p == '#')
goto again;
cp = strpbrk(p, "#\n");
if (cp == NULL)
if (!(cp = strpbrk(p, "#\n")))
goto again;
*cp = '\0';
cp = strpbrk(p, " \t");
if (cp == NULL)
if (!(cp = strpbrk(p, " \t")))
goto again;
*cp++ = '\0';
/* THIS STUFF IS INTERNET SPECIFIC */
host.h_addr_list = host_addrs;
host.h_addr = hostaddr;
*((u_int32_t *)host.h_addr) = inet_addr(p);
host.h_length = sizeof (u_int32_t);
if (!inet_aton(p, &host_addr))
goto again;
h_addr_ptrs[0] = (char *)&host_addr;
h_addr_ptrs[1] = NULL;
#if BSD >= 43 || defined(h_addr) /* new-style hostent structure */
host.h_addr_list = h_addr_ptrs;
#else
host.h_addr = h_addr_ptrs[0];
#endif
host.h_length = sizeof(u_int32_t);
host.h_addrtype = AF_INET;
while (*cp == ' ' || *cp == '\t')
cp++;
host.h_name = cp;
q = host.h_aliases = host_aliases;
cp = strpbrk(cp, " \t");
if (cp != NULL)
if (cp = strpbrk(cp, " \t"))
*cp++ = '\0';
while (cp && *cp) {
if (*cp == ' ' || *cp == '\t') {
@ -138,11 +144,11 @@ gethostent()
}
if (q < &host_aliases[MAXALIASES - 1])
*q++ = cp;
cp = strpbrk(cp, " \t");
if (cp != NULL)
if (cp = strpbrk(cp, " \t"))
*cp++ = '\0';
}
*q = NULL;
h_errno = NETDB_SUCCESS;
return (&host);
}
@ -152,9 +158,9 @@ _gethostbyhtname(name)
{
register struct hostent *p;
register char **cp;
sethostent(0);
while ((p = gethostent())) {
while (p = gethostent()) {
if (strcasecmp(p->h_name, name) == 0)
break;
for (cp = p->h_aliases; *cp != 0; cp++)
@ -174,9 +180,10 @@ _gethostbyhtaddr(addr, len, type)
register struct hostent *p;
sethostent(0);
while ((p = gethostent()))
while (p = gethostent())
if (p->h_addrtype == type && !bcmp(p->h_addr, addr, len))
break;
endhostent();
return (p);
}

View File

@ -1,56 +0,0 @@
/*
* Copyright (c) 1983, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getnetbyaddr.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include <netdb.h>
extern int _net_stayopen;
struct netent *
getnetbyaddr(net, type)
register long net;
register int type;
{
register struct netent *p;
setnetent(_net_stayopen);
while (p = getnetent())
if (p->n_addrtype == type && p->n_net == net)
break;
if (!_net_stayopen)
endnetent();
return (p);
}

View File

@ -50,10 +50,17 @@
* -
* --Copyright--
*/
/* Portions Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
* Dep. Matematica Universidade de Coimbra, Portugal, Europe
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)gethostnamadr.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: getnetbydns.c,v 1.3 1995/05/30 05:40:46 rgrimes Exp $";
static char rcsid[] = "$Id: getnetbydns.c,v 1.4 1995/10/22 14:39:04 phk Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
@ -61,20 +68,23 @@ static char rcsid[] = "$Id: getnetbydns.c,v 1.3 1995/05/30 05:40:46 rgrimes Exp
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <stdio.h>
#include <netdb.h>
#include <resolv.h>
#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <syslog.h>
#define BYNAME 0
#define BYADDR 1
#include "res_config.h"
extern int h_errno;
#define BYADDR 0
#define BYNAME 1
#define MAXALIASES 35
#define MAXADDRS 35
#if PACKETSZ > 1024
#define MAXPACKET PACKETSZ
@ -83,17 +93,15 @@ static char rcsid[] = "$Id: getnetbydns.c,v 1.3 1995/05/30 05:40:46 rgrimes Exp
#endif
typedef union {
HEADER hdr;
u_char buf[MAXPACKET];
HEADER hdr;
u_char buf[MAXPACKET];
} querybuf;
typedef union {
int32_t al;
char ac;
long al;
char ac;
} align;
extern int h_errno;
static struct netent *
getnetanswer(answer, anslen, net_i)
querybuf *answer;
@ -101,20 +109,15 @@ getnetanswer(answer, anslen, net_i)
int net_i;
{
register HEADER *hp;
register u_char *cp;
register int n;
u_char *eom;
int type, class, buflen, ancount, qdcount,
haveanswer, i, nchar;
char aux1[30], aux2[30], ans[30],
*in, *st, *pauxt, *bp, **ap,
*paux1 = &aux1[0],
*paux2 = &aux2[0],
flag = 0;
static struct netent net_entry;
static char *net_aliases[MAXALIASES],
netbuf[BUFSIZ+1];
register HEADER *hp;
register u_char *cp;
register int n;
u_char *eom;
int type, class, buflen, ancount, qdcount, haveanswer, i, nchar;
char aux1[30], aux2[30], ans[30], *in, *st, *pauxt, *bp, **ap,
*paux1 = &aux1[0], *paux2 = &aux2[0], flag = 0;
static struct netent net_entry;
static char *net_aliases[MAXALIASES], netbuf[BUFSIZ+1];
/*
* find first satisfactory answer
@ -142,12 +145,10 @@ static char *net_aliases[MAXALIASES],
h_errno = HOST_NOT_FOUND;
else
h_errno = TRY_AGAIN;
return ((struct netent *) NULL);
return (NULL);
}
while (qdcount-- > 0){
while (qdcount-- > 0)
cp += __dn_skipname(cp, eom) + QFIXEDSZ;
}
ap = net_aliases;
*ap = NULL;
net_entry.n_aliases = net_aliases;
@ -169,27 +170,26 @@ static char *net_aliases[MAXALIASES],
cp += n;
return (NULL);
}
cp += n;
cp += n;
*ap++ = bp;
bp += (strlen(bp) + 1);
net_entry.n_addrtype = (class == C_IN)
? AF_INET
: AF_UNSPEC;
bp += strlen(bp) + 1;
net_entry.n_addrtype =
(class == C_IN) ? AF_INET : AF_UNSPEC;
haveanswer++;
}
}
if (haveanswer) {
*ap = NULL;
switch (net_i) {
case BYADDR :
case BYADDR:
net_entry.n_name = *net_entry.n_aliases;
net_entry.n_net = 0L;
break;
case BYNAME :
case BYNAME:
in = *net_entry.n_aliases;
net_entry.n_name = &ans[0];
aux2[0] = '\0';
for (i = 0; i < 4; i++) {
for (i = 0; i < 4; i++) {
for (st = in, nchar = 0;
*st != '.';
st++, nchar++)
@ -197,23 +197,23 @@ static char *net_aliases[MAXALIASES],
if (nchar != 1 || *in != '0' || flag) {
flag = 1;
(void)strncpy(paux1,
(i==0) ?in :in-1,
(i==0) ?nchar :nchar+1);
paux1[(i==0) ?nchar :nchar+1] = '\0';
(i==0) ? in : in-1,
(i==0) ?nchar : nchar+1);
paux1[(i==0) ? nchar : nchar+1] = '\0';
pauxt = paux2;
paux2 = strcat(paux1, paux2);
paux1 = pauxt;
}
in = ++st;
}
}
net_entry.n_net = inet_network(paux2);
break;
}
net_entry.n_aliases++;
return (&net_entry);
} else {
h_errno = TRY_AGAIN;
return ((struct netent *) NULL);
}
h_errno = TRY_AGAIN;
return (NULL);
}
struct netent *
@ -221,41 +221,40 @@ _getnetbydnsaddr(net, net_type)
register long net;
register int net_type;
{
unsigned int netbr[4];
int nn, anslen;
querybuf buf;
char qbuf[MAXDNAME];
unsigned long net2;
struct netent *net_entry;
unsigned int netbr[4];
int nn, anslen;
querybuf buf;
char qbuf[MAXDNAME];
unsigned long net2;
struct netent *net_entry;
if (net_type != AF_INET)
return (NULL);
for (nn = 4, net2 = net; net2; net2 >>= 8) {
for (nn = 4, net2 = net; net2; net2 >>= 8)
netbr[--nn] = net2 & 0xff;
}
switch (nn) {
case 3: /* Class A */
(void)sprintf(qbuf, "0.0.0.%u.in-addr.arpa",
netbr[3]);
break;
case 2: /* Class B */
(void)sprintf(qbuf, "0.0.%u.%u.in-addr.arpa",
netbr[3], netbr[2]);
break;
case 1: /* Class C */
(void)sprintf(qbuf, "0.%u.%u.%u.in-addr.arpa",
netbr[3], netbr[2], netbr[1]);
break;
case 0: /* Class D - E */
(void)sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa",
netbr[3], netbr[2], netbr[1], netbr[0]);
break;
case 3: /* Class A */
sprintf(qbuf, "0.0.0.%u.in-addr.arpa", netbr[3]);
break;
case 2: /* Class B */
sprintf(qbuf, "0.0.%u.%u.in-addr.arpa", netbr[3], netbr[2]);
break;
case 1: /* Class C */
sprintf(qbuf, "0.%u.%u.%u.in-addr.arpa", netbr[3], netbr[2],
netbr[1]);
break;
case 0: /* Class D - E */
sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa", netbr[3], netbr[2],
netbr[1], netbr[0]);
break;
}
anslen = res_query(qbuf, C_IN, T_PTR, buf.buf, sizeof buf.buf);
anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf));
if (anslen < 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf("res_query failed\n");
#endif
return (NULL);
}
net_entry = getnetanswer(&buf, anslen, BYADDR);
@ -263,28 +262,34 @@ _getnetbydnsaddr(net, net_type)
unsigned u_net = net; /* maybe net should be unsigned ? */
/* Strip trailing zeros */
while ((u_net & 0xff) == 0 && u_net != 0) {
while ((u_net & 0xff) == 0 && u_net != 0)
u_net >>= 8;
}
net_entry->n_net = u_net;
return (net_entry);
}
return (net_entry);
return (NULL);
}
struct netent *
_getnetbydnsname(net)
register const char *net;
{
int anslen;
querybuf buf;
char qbuf[MAXDNAME];
int anslen;
querybuf buf;
char qbuf[MAXDNAME];
(void)strcpy(&qbuf[0],net);
anslen = res_search(qbuf, C_IN, T_PTR, buf.buf, sizeof buf.buf);
if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
h_errno = NETDB_INTERNAL;
return (NULL);
}
strcpy(&qbuf[0], net);
anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf));
if (anslen < 0) {
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf("res_query failed\n");
return NULL;
#endif
return (NULL);
}
return getnetanswer(&buf, anslen, BYNAME);
}

View File

@ -31,6 +31,16 @@
* SUCH DAMAGE.
*/
/* Portions Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
* Dep. Matematica Universidade de Coimbra, Portugal, Europe
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* from getnetent.c 1.1 (Coimbra) 93/06/02
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getnetent.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
@ -39,6 +49,7 @@ static char sccsid[] = "@(#)getnetent.c 8.1 (Berkeley) 6/4/93";
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
@ -55,6 +66,7 @@ void
_setnethtent(f)
int f;
{
if (netf == NULL)
netf = fopen(_PATH_NETWORKS, "r" );
else
@ -65,6 +77,7 @@ _setnethtent(f)
void
_endnethtent()
{
if (netf) {
fclose(netf);
netf = NULL;
@ -103,7 +116,7 @@ getnetent()
net.n_net = inet_network(cp);
net.n_addrtype = AF_INET;
q = net.n_aliases = net_aliases;
if (p != NULL)
if (p != NULL)
cp = p;
while (cp && *cp) {
if (*cp == ' ' || *cp == '\t') {
@ -128,7 +141,7 @@ _getnetbyhtname(name)
register char **cp;
setnetent(_net_stayopen);
while ((p = getnetent())) {
while (p = getnetent()) {
if (strcasecmp(p->n_name, name) == 0)
break;
for (cp = p->n_aliases; *cp != 0; cp++)
@ -141,7 +154,6 @@ _getnetbyhtname(name)
return (p);
}
struct netent *
_getnetbyhtaddr(net, type)
register long net;
@ -150,7 +162,7 @@ _getnetbyhtaddr(net, type)
register struct netent *p;
setnetent(_net_stayopen);
while ((p = getnetent()))
while (p = getnetent())
if (p->n_addrtype == type && p->n_net == net)
break;
if (!_net_stayopen)

View File

@ -53,7 +53,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)herror.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: herror.c,v 1.2 1995/05/30 05:40:49 rgrimes Exp $";
static char rcsid[] = "$Id: herror.c,v 1.3 1995/08/20 20:02:41 peter Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@ -69,7 +69,7 @@ const char *h_errlist[] = {
"Unknown server error", /* 3 NO_RECOVERY */
"No address associated with name", /* 4 NO_ADDRESS */
};
int h_nerr = { sizeof(h_errlist)/sizeof(h_errlist[0]) };
int h_nerr = { sizeof h_errlist / sizeof h_errlist[0] };
extern int h_errno;

View File

@ -1,7 +1,9 @@
/*
* ++Copyright++ 1983, 1990, 1993
* -
* Copyright (c) 1983, 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@ -12,12 +14,12 @@
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@ -29,10 +31,31 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* -
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies, and that
* the name of Digital Equipment Corporation not be used in advertising or
* publicity pertaining to distribution of the document or software without
* specific, written prior permission.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
* CORPORATION 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 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
* -
* --Copyright--
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93";
static char rcsid[] = "$Id$";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
@ -55,7 +78,7 @@ inet_addr(cp)
return (INADDR_NONE);
}
/*
/*
* Check whether "cp" is a valid ascii representation
* of an Internet address and convert to a binary address.
* Returns 1 if the address is valid, 0 if not.
@ -73,50 +96,52 @@ inet_aton(cp, addr)
u_int parts[4];
register u_int *pp = parts;
c = *cp;
for (;;) {
/*
* Collect number up to ``.''.
* Values are specified as for C:
* 0x=hex, 0=octal, other=decimal.
* 0x=hex, 0=octal, isdigit=decimal.
*/
if (!isdigit(c))
return (0);
val = 0; base = 10;
if (*cp == '0') {
if (*++cp == 'x' || *cp == 'X')
base = 16, cp++;
if (c == '0') {
c = *++cp;
if (c == 'x' || c == 'X')
base = 16, c = *++cp;
else
base = 8;
}
while ((c = *cp) != '\0') {
for (;;) {
if (isascii(c) && isdigit(c)) {
val = (val * base) + (c - '0');
cp++;
continue;
}
if (base == 16 && isascii(c) && isxdigit(c)) {
val = (val << 4) +
c = *++cp;
} else if (base == 16 && isascii(c) && isxdigit(c)) {
val = (val << 4) |
(c + 10 - (islower(c) ? 'a' : 'A'));
cp++;
continue;
}
break;
c = *++cp;
} else
break;
}
if (*cp == '.') {
if (c == '.') {
/*
* Internet format:
* a.b.c.d
* a.b.c (with c treated as 16-bits)
* a.b.c (with c treated as 16 bits)
* a.b (with b treated as 24 bits)
*/
if (pp >= parts + 3 || val > 0xff)
if (pp >= parts + 3)
return (0);
*pp++ = val, cp++;
*pp++ = val;
c = *++cp;
} else
break;
}
/*
* Check for trailing characters.
*/
if (*cp && (!isascii(*cp) || !isspace(*cp)))
if (c != '\0' && (!isascii(c) || !isspace(c)))
return (0);
/*
* Concoct the address according to
@ -125,6 +150,9 @@ inet_aton(cp, addr)
n = pp - parts + 1;
switch (n) {
case 0:
return (0); /* initial nondigit */
case 1: /* a -- 32 bits */
break;

View File

@ -1,7 +1,8 @@
#define DEBUG 1 /* enable debugging code (needed for dig) */
#undef ALLOW_T_UNSPEC /* enable the "unspec" RR type for old athena */
#define RESOLVSORT /* allow sorting of addresses in gethostbyname */
#undef RFC1535 /* comply with RFC1535 */
#define RFC1535 /* comply with RFC1535 (STRONGLY reccomended by vixie)*/
#undef ALLOW_UPDATES /* destroy your system security */
#undef USELOOPBACK /* res_init() bind to localhost */
#undef SUNSECURITY /* verify gethostbyaddr() calls - WE DONT NEED IT */
#define MULTI_PTRS_ARE_ALIASES /* fold multiple PTR records into aliases */