|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1986, 1990 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted provided ! 6: * that: (1) source distributions retain this entire copyright notice and ! 7: * comment, and (2) distributions including binaries display the following ! 8: * acknowledgement: ``This product includes software developed by the ! 9: * University of California, Berkeley and its contributors'' in the ! 10: * documentation or other materials provided with the distribution and in ! 11: * all advertising materials mentioning features or use of this software. ! 12: * Neither the name of the University nor the names of its contributors may ! 13: * be used to endorse or promote products derived from this software without ! 14: * specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)ns_sort.c 4.8 (Berkeley) 6/1/90"; ! 22: #endif /* not lint */ ! 23: ! 24: #include <stdio.h> ! 25: #include <sys/types.h> ! 26: #include <sys/time.h> ! 27: #include <sys/socket.h> ! 28: #include <sys/file.h> ! 29: #include <netinet/in.h> ! 30: #include <syslog.h> ! 31: #include <arpa/nameser.h> ! 32: #include "ns.h" ! 33: #include "db.h" ! 34: ! 35: extern char *p_type(), *p_class(); ! 36: ! 37: extern int debug; ! 38: extern FILE *ddt; ! 39: ! 40: struct netinfo* ! 41: local(from) ! 42: struct sockaddr_in *from; ! 43: { ! 44: extern struct netinfo *nettab, netloop, **enettab; ! 45: struct netinfo *ntp; ! 46: ! 47: if (from->sin_addr.s_addr == netloop.my_addr.s_addr) ! 48: return( &netloop); ! 49: for (ntp = nettab; ntp != *enettab; ntp = ntp->next) { ! 50: if (ntp->net == (from->sin_addr.s_addr & ntp->mask)) ! 51: return(ntp); ! 52: } ! 53: return(NULL); ! 54: } ! 55: ! 56: ! 57: sort_response(cp, ancount, lp, eom) ! 58: register char *cp; ! 59: register int ancount; ! 60: struct netinfo *lp; ! 61: u_char *eom; ! 62: { ! 63: register struct netinfo *ntp; ! 64: extern struct netinfo *nettab; ! 65: ! 66: #ifdef DEBUG ! 67: if (debug > 2) ! 68: fprintf(ddt,"sort_response(%d)\n", ancount); ! 69: #endif DEBUG ! 70: if (ancount > 1) { ! 71: if (sort_rr(cp, ancount, lp, eom)) ! 72: return; ! 73: for (ntp = nettab; ntp != NULL; ntp = ntp->next) { ! 74: if ((ntp->net == lp->net) && (ntp->mask == lp->mask)) ! 75: continue; ! 76: if (sort_rr(cp, ancount, ntp, eom)) ! 77: break; ! 78: } ! 79: } ! 80: } ! 81: ! 82: int ! 83: sort_rr(cp, count, ntp, eom) ! 84: register u_char *cp; ! 85: int count; ! 86: register struct netinfo *ntp; ! 87: u_char *eom; ! 88: { ! 89: int type, class, dlen, n, c; ! 90: struct in_addr inaddr; ! 91: u_char *rr1; ! 92: ! 93: #ifdef DEBUG ! 94: if (debug > 2) { ! 95: inaddr.s_addr = ntp->net; ! 96: fprintf(ddt,"sort_rr( x%x, %d, %s)\n",cp, count, ! 97: inet_ntoa(inaddr)); ! 98: } ! 99: #endif DEBUG ! 100: rr1 = NULL; ! 101: for (c = count; c > 0; --c) { ! 102: n = dn_skipname(cp, eom); ! 103: if (n < 0) ! 104: return (1); /* bogus, stop processing */ ! 105: cp += n; ! 106: if (cp + QFIXEDSZ > eom) ! 107: return (1); ! 108: GETSHORT(type, cp); ! 109: GETSHORT(class, cp); ! 110: cp += sizeof(u_long); ! 111: GETSHORT(dlen, cp); ! 112: if (dlen > eom - cp) ! 113: return (1); /* bogus, stop processing */ ! 114: switch (type) { ! 115: case T_A: ! 116: switch (class) { ! 117: case C_IN: ! 118: case C_HS: ! 119: bcopy(cp, (char *)&inaddr, sizeof(inaddr)); ! 120: if (rr1 == NULL) ! 121: rr1 = cp; ! 122: if ((ntp->mask & inaddr.s_addr) == ntp->net) { ! 123: #ifdef DEBUG ! 124: if (debug > 1) { ! 125: fprintf(ddt,"net %s best choice\n", ! 126: inet_ntoa(inaddr)); ! 127: } ! 128: #endif DEBUG ! 129: if (rr1 != cp) { ! 130: bcopy(rr1, cp, sizeof(inaddr)); ! 131: bcopy((char *)&inaddr, rr1, sizeof(inaddr)); ! 132: } ! 133: return(1); ! 134: } ! 135: break; ! 136: } ! 137: break; ! 138: } ! 139: cp += dlen; ! 140: } ! 141: return(0); ! 142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.