* Copyright (c) 1986, 1990 Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 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
static char sccsid
[] = "@(#)ns_sort.c 4.10 (Berkeley) 3/3/91";
#include <arpa/nameser.h>
struct sockaddr_in
*from
;
extern struct netinfo
*nettab
, netloop
, **enettab
;
if (from
->sin_addr
.s_addr
== netloop
.my_addr
.s_addr
)
for (ntp
= nettab
; ntp
!= *enettab
; ntp
= ntp
->next
) {
if (ntp
->net
== (from
->sin_addr
.s_addr
& ntp
->mask
))
sort_response(cp
, ancount
, lp
, eom
)
register struct netinfo
*ntp
;
extern struct netinfo
*nettab
;
fprintf(ddt
,"sort_response(%d)\n", ancount
);
if (sort_rr(cp
, ancount
, lp
, eom
))
for (ntp
= nettab
; ntp
!= NULL
; ntp
= ntp
->next
) {
if ((ntp
->net
== lp
->net
) && (ntp
->mask
== lp
->mask
))
if (sort_rr(cp
, ancount
, ntp
, eom
))
sort_rr(cp
, count
, ntp
, eom
)
register struct netinfo
*ntp
;
int type
, class, dlen
, n
, c
;
inaddr
.s_addr
= ntp
->net
;
fprintf(ddt
,"sort_rr( x%x, %d, %s)\n",cp
, count
,
for (c
= count
; c
> 0; --c
) {
n
= dn_skipname(cp
, eom
);
return (1); /* bogus, stop processing */
return (1); /* bogus, stop processing */
bcopy(cp
, (char *)&inaddr
, sizeof(inaddr
));
if ((ntp
->mask
& inaddr
.s_addr
) == ntp
->net
) {
fprintf(ddt
,"net %s best choice\n",
bcopy(rr1
, cp
, sizeof(inaddr
));
bcopy((char *)&inaddr
, rr1
, sizeof(inaddr
));