|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1986 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: static char sccsid[] = "@(#)ns_sort.c 4.4 (Berkeley) 6/18/88"; ! 20: #endif /* not lint */ ! 21: ! 22: #include <stdio.h> ! 23: #include <sys/types.h> ! 24: #include <sys/time.h> ! 25: #include <sys/socket.h> ! 26: #include <sys/file.h> ! 27: #include <netinet/in.h> ! 28: #include <syslog.h> ! 29: #include <arpa/nameser.h> ! 30: #include "ns.h" ! 31: #include "db.h" ! 32: ! 33: extern char *p_type(), *p_class(); ! 34: ! 35: extern int debug; ! 36: extern FILE *ddt; ! 37: ! 38: struct netinfo* ! 39: local(from) ! 40: struct sockaddr_in *from; ! 41: { ! 42: extern struct netinfo *nettab, netloop; ! 43: struct netinfo *ntp; ! 44: ! 45: if (from->sin_addr.s_addr == netloop.my_addr.s_addr) ! 46: return( &netloop); ! 47: for (ntp = nettab; ntp != NULL; ntp = ntp->next) { ! 48: if (ntp->net == (from->sin_addr.s_addr & ntp->mask)) ! 49: return(ntp); ! 50: } ! 51: return(NULL); ! 52: } ! 53: ! 54: ! 55: sort_response(cp, ancount, lp, eom) ! 56: register char *cp; ! 57: register int ancount; ! 58: struct netinfo *lp; ! 59: u_char *eom; ! 60: { ! 61: register struct netinfo *ntp; ! 62: extern struct netinfo *nettab; ! 63: ! 64: #ifdef DEBUG ! 65: if (debug > 2) ! 66: fprintf(ddt,"sort_response(%d)\n", ancount); ! 67: #endif DEBUG ! 68: if (ancount > 1) { ! 69: if (sort_rr(cp, ancount, lp, eom)) ! 70: return; ! 71: for (ntp = nettab; ntp != NULL; ntp = ntp->next) { ! 72: if ((ntp->net == lp->net) && (ntp->mask == lp->mask)) ! 73: continue; ! 74: if (sort_rr(cp, ancount, ntp, eom)) ! 75: break; ! 76: } ! 77: } ! 78: } ! 79: ! 80: int ! 81: sort_rr(cp, count, ntp, eom) ! 82: register u_char *cp; ! 83: int count; ! 84: register struct netinfo *ntp; ! 85: u_char *eom; ! 86: { ! 87: int type, class, dlen, n, c; ! 88: struct in_addr inaddr; ! 89: u_char *rr1; ! 90: ! 91: #ifdef DEBUG ! 92: if (debug > 2) { ! 93: inaddr.s_addr = ntp->net; ! 94: fprintf(ddt,"sort_rr( x%x, %d, %s)\n",cp, count, ! 95: inet_ntoa(inaddr)); ! 96: } ! 97: #endif DEBUG ! 98: rr1 = NULL; ! 99: for (c = count; c > 0; --c) { ! 100: n = dn_skipname(cp, eom); ! 101: if (n < 0) ! 102: return (1); /* bogus, stop processing */ ! 103: cp += n; ! 104: if (cp + QFIXEDSZ > eom) ! 105: return (1); ! 106: GETSHORT(type, cp); ! 107: GETSHORT(class, cp); ! 108: cp += sizeof(u_long); ! 109: GETSHORT(dlen, cp); ! 110: if (dlen > eom - cp) ! 111: return (1); /* bogus, stop processing */ ! 112: switch (type) { ! 113: case T_A: ! 114: switch (class) { ! 115: case C_IN: ! 116: bcopy(cp, (char *)&inaddr, sizeof(inaddr)); ! 117: if (rr1 == NULL) ! 118: rr1 = cp; ! 119: if ((ntp->mask & inaddr.s_addr) == ntp->net) { ! 120: #ifdef DEBUG ! 121: if (debug > 1) { ! 122: fprintf(ddt,"net %s best choice\n", ! 123: inet_ntoa(inaddr)); ! 124: } ! 125: #endif DEBUG ! 126: if (rr1 != cp) { ! 127: bcopy(rr1, cp, sizeof(inaddr)); ! 128: bcopy((char *)&inaddr, rr1, sizeof(inaddr)); ! 129: } ! 130: return(1); ! 131: } ! 132: break; ! 133: } ! 134: break; ! 135: } ! 136: cp += dlen; ! 137: } ! 138: return(0); ! 139: } ! 140: ! 141: #ifdef notdef ! 142: dump_namebuf(np) ! 143: register struct namebuf *np; ! 144: { ! 145: register struct databuf *dp; ! 146: long n; ! 147: u_long addr; ! 148: u_short i; ! 149: int j; ! 150: char *cp; ! 151: char *proto; ! 152: FILE *fp; ! 153: extern char *inet_ntoa(), *p_protocal(), *p_service(); ! 154: int found_data; ! 155: ! 156: gettime(&tt); ! 157: if ((fp = fopen("/usr/tmp/namebuf", "a")) == NULL) ! 158: return; ! 159: found_data = 0; ! 160: for (dp = np->n_data; dp != NULL; dp = dp->d_next) { ! 161: if (dp->d_ttl <= tt.tv_sec) ! 162: continue; /* Stale */ ! 163: if (!found_data) { ! 164: fprintf(fp, "%s\t", np->n_dname); ! 165: if (strlen(np->n_dname) < 8) ! 166: (void) putc('\t', fp); ! 167: found_data++; ! 168: } else ! 169: fprintf(fp, "\t\t"); ! 170: if (dp->d_zone == 0) ! 171: fprintf(fp, "%d\t", dp->d_ttl - tt.tv_sec); ! 172: else if (dp->d_ttl > zones[dp->d_zone].z_minimum) ! 173: fprintf(fp, "%d\t", dp->d_ttl); ! 174: fprintf(fp, "%s\t%s\t", p_class(dp->d_class), ! 175: p_type(dp->d_type)); ! 176: cp = dp->d_data; ! 177: /* ! 178: * Print type specific data ! 179: */ ! 180: switch (dp->d_type) { ! 181: case T_A: ! 182: switch (dp->d_class) { ! 183: case C_IN: ! 184: n = htonl(_getlong(cp)); ! 185: fprintf(fp, "%s\n", ! 186: inet_ntoa(*(struct in_addr *)&n)); ! 187: break; ! 188: } ! 189: break; ! 190: case T_CNAME: ! 191: case T_MB: ! 192: case T_MG: ! 193: case T_MR: ! 194: case T_PTR: ! 195: if (cp[0] == '\0') ! 196: fprintf(fp, ".\n"); ! 197: else ! 198: fprintf(fp, "%s.\n", cp); ! 199: break; ! 200: ! 201: case T_NS: ! 202: cp = dp->d_data; ! 203: if (cp[0] == '\0') ! 204: fprintf(fp, ".\t"); ! 205: else ! 206: fprintf(fp, "%s.", cp); ! 207: if (dp->d_nstime) ! 208: fprintf(fp, "\t; %d", dp->d_nstime); ! 209: fprintf(fp, "\n"); ! 210: break; ! 211: ! 212: case T_HINFO: ! 213: if (n = *cp++) { ! 214: fprintf(fp, "\"%.*s\"", n, cp); ! 215: cp += n; ! 216: } else ! 217: fprintf(fp, "\"\""); ! 218: if (n = *cp++) ! 219: fprintf(fp, " \"%.*s\"", n, cp); ! 220: else ! 221: fprintf(fp, "\"\""); ! 222: (void) putc('\n', fp); ! 223: break; ! 224: ! 225: case T_SOA: ! 226: fprintf(fp, "%s.", cp); ! 227: cp += strlen(cp) + 1; ! 228: fprintf(fp, " %s. (\n", cp); ! 229: cp += strlen(cp) + 1; ! 230: fprintf(fp, "\t\t%d", _getlong(cp)); ! 231: cp += sizeof(u_long); ! 232: fprintf(fp, " %d", _getlong(cp)); ! 233: cp += sizeof(u_long); ! 234: fprintf(fp, " %d", _getlong(cp)); ! 235: cp += sizeof(u_long); ! 236: fprintf(fp, " %d", _getlong(cp)); ! 237: cp += sizeof(u_long); ! 238: fprintf(fp, " %d )\n", _getlong(cp)); ! 239: break; ! 240: ! 241: case T_MX: ! 242: fprintf(fp,"%d", _getshort(cp)); ! 243: cp += sizeof(u_short); ! 244: fprintf(fp," %s.\n", cp); ! 245: break; ! 246: ! 247: ! 248: case T_UINFO: ! 249: fprintf(fp, "\"%s\"\n", cp); ! 250: break; ! 251: ! 252: case T_UID: ! 253: case T_GID: ! 254: if (dp->d_size == sizeof(u_long)) { ! 255: fprintf(fp, "%d\n", _getlong(cp)); ! 256: cp += sizeof(u_long); ! 257: } ! 258: break; ! 259: ! 260: case T_WKS: ! 261: addr = htonl(_getlong(cp)); ! 262: fprintf(fp,"%s ", ! 263: inet_ntoa(*(struct in_addr *)&addr)); ! 264: cp += sizeof(u_long); ! 265: proto = p_protocal(*cp); /* protocal */ ! 266: cp += sizeof(char); ! 267: fprintf(fp, "%s ", proto); ! 268: i = 0; ! 269: while(cp < dp->d_data + dp->d_size) { ! 270: j = *cp++; ! 271: do { ! 272: if(j & 0200) ! 273: fprintf(fp," %s", ! 274: p_service(i, proto)); ! 275: j <<= 1; ! 276: } while(++i & 07); ! 277: } ! 278: fprintf(fp,"\n"); ! 279: break; ! 280: ! 281: default: ! 282: fprintf(fp, "???\n"); ! 283: } ! 284: } ! 285: (void) fclose(fp); ! 286: } ! 287: #endif notdef
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.