|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)db_dump.c 4.3 (Berkeley) 5/30/86"; ! 3: #endif ! 4: ! 5: /* ! 6: * Copyright (c) 1986 Regents of the University of California ! 7: * All Rights Reserved ! 8: */ ! 9: ! 10: #include <sys/types.h> ! 11: #include <sys/time.h> ! 12: #include <netinet/in.h> ! 13: #include <netdb.h> ! 14: #include <stdio.h> ! 15: #include <syslog.h> ! 16: #include <arpa/nameser.h> ! 17: #include "ns.h" ! 18: #include "db.h" ! 19: ! 20: extern char *p_type(), *p_class(); ! 21: ! 22: #ifdef DUMPFILE ! 23: char *dumpfile = DUMPFILE; ! 24: #else ! 25: char *dumpfile = "/usr/tmp/named_dump.db"; ! 26: #endif ! 27: ! 28: /* ! 29: * Dump current data base in a format similar to RFC 883. ! 30: */ ! 31: ! 32: doadump() ! 33: { ! 34: FILE *fp; ! 35: ! 36: #ifdef DEBUG ! 37: if (debug >= 3) ! 38: fprintf(ddt,"doadump()\n"); ! 39: #endif ! 40: ! 41: if ((fp = fopen(dumpfile, "w")) == NULL) ! 42: return; ! 43: fprintf(fp, "$ORIGIN .\n"); ! 44: if (hashtab != NULL) ! 45: db_dump(hashtab, fp); ! 46: (void) fclose(fp); ! 47: } ! 48: ! 49: db_dump(htp, fp) ! 50: struct hashbuf *htp; ! 51: FILE *fp; ! 52: { ! 53: register struct databuf *dp; ! 54: register struct namebuf *np; ! 55: struct namebuf **npp, **nppend; ! 56: char dname[MAXDNAME]; ! 57: long n; ! 58: u_long addr; ! 59: u_short i; ! 60: int j; ! 61: char *cp; ! 62: char *proto; ! 63: extern char *inet_ntoa(), *p_protocal(), *p_service(); ! 64: ! 65: ! 66: npp = htp->h_tab; ! 67: nppend = npp + htp->h_size; ! 68: while (npp < nppend) { ! 69: for (np = *npp++; np != NULL; np = np->n_next) { ! 70: if (np->n_data == NULL) ! 71: continue; ! 72: fprintf(fp, "%s\t", np->n_dname); ! 73: if (strlen(np->n_dname) < 8) ! 74: (void) putc('\t', fp); ! 75: for (dp = np->n_data; dp != NULL; dp = dp->d_next) { ! 76: if (dp != np->n_data) ! 77: fprintf(fp, "\t\t"); ! 78: if (dp->d_zone == 0) { ! 79: if (gettimeofday(&tt, (struct timezone *)0) < 0) ! 80: syslog(LOG_ERR, "gettimeofday: %m"); ! 81: if ((n = dp->d_ttl - tt.tv_sec) >= 0) ! 82: fprintf(fp, "%d\t", n); ! 83: } else if (dp->d_ttl > zones[dp->d_zone].z_minimum) ! 84: fprintf(fp, "%d\t", dp->d_ttl); ! 85: fprintf(fp, "%s\t%s\t", p_class(dp->d_class), ! 86: p_type(dp->d_type)); ! 87: cp = dp->d_data; ! 88: /* ! 89: * Print type specific data ! 90: */ ! 91: switch (dp->d_type) { ! 92: case T_A: ! 93: switch (dp->d_class) { ! 94: case C_IN: ! 95: n = htonl(getlong(cp)); ! 96: fprintf(fp, "%s\n", ! 97: inet_ntoa(*(struct in_addr *)&n)); ! 98: break; ! 99: } ! 100: break; ! 101: case T_CNAME: ! 102: case T_MB: ! 103: case T_MG: ! 104: case T_MR: ! 105: case T_NS: ! 106: case T_PTR: ! 107: if (cp[0] == '\0') ! 108: fprintf(fp, ".\n"); ! 109: else ! 110: fprintf(fp, "%s.\n", cp); ! 111: break; ! 112: ! 113: case T_HINFO: ! 114: if (n = *cp++) { ! 115: fprintf(fp, "%.*s", n, cp); ! 116: cp += n; ! 117: } else ! 118: fprintf(fp, "\"\""); ! 119: if (n = *cp++) ! 120: fprintf(fp, " %.*s", n, cp); ! 121: else ! 122: fprintf(fp, "\"\""); ! 123: (void) putc('\n', fp); ! 124: break; ! 125: ! 126: case T_SOA: ! 127: fprintf(fp, "%s", cp); ! 128: cp += strlen(cp) + 1; ! 129: fprintf(fp, " %s\n", cp); ! 130: cp += strlen(cp) + 1; ! 131: fprintf(fp, "\t\t%d", getlong(cp)); ! 132: cp += sizeof(u_long); ! 133: fprintf(fp, " %d", getlong(cp)); ! 134: cp += sizeof(u_long); ! 135: fprintf(fp, " %d", getlong(cp)); ! 136: cp += sizeof(u_long); ! 137: fprintf(fp, " %d", getlong(cp)); ! 138: cp += sizeof(u_long); ! 139: fprintf(fp, " %d\n", getlong(cp)); ! 140: break; ! 141: ! 142: case T_MX: ! 143: fprintf(fp,"%d", getshort(cp)); ! 144: cp += sizeof(u_short); ! 145: fprintf(fp," %s\n", cp); ! 146: break; ! 147: ! 148: ! 149: case T_UINFO: ! 150: fprintf(fp, "%s\n", cp); ! 151: break; ! 152: ! 153: case T_UID: ! 154: case T_GID: ! 155: if (dp->d_size == sizeof(u_long)) { ! 156: fprintf(fp, "%d\n", getlong(cp)); ! 157: cp += sizeof(u_long); ! 158: } ! 159: break; ! 160: ! 161: case T_WKS: ! 162: addr = htonl(getlong(cp)); ! 163: fprintf(fp,"%s ", ! 164: inet_ntoa(*(struct in_addr *)&addr)); ! 165: cp += sizeof(u_long); ! 166: proto = p_protocal(*cp); /* protocal */ ! 167: cp += sizeof(char); ! 168: fprintf(fp, "%s ", proto); ! 169: i = 0; ! 170: while(cp < dp->d_data + dp->d_size) { ! 171: j = *cp++; ! 172: do { ! 173: if(j & 0200) ! 174: fprintf(fp," %s", ! 175: p_service(i, proto)); ! 176: j <<= 1; ! 177: } while(++i & 07); ! 178: } ! 179: fprintf(fp,"\n"); ! 180: break; ! 181: ! 182: default: ! 183: fprintf(fp, "???\n", cp); ! 184: } ! 185: } ! 186: } ! 187: } ! 188: npp = htp->h_tab; ! 189: nppend = npp + htp->h_size; ! 190: while (npp < nppend) { ! 191: for (np = *npp++; np != NULL; np = np->n_next) { ! 192: if (np->n_hash == NULL) ! 193: continue; ! 194: getname(np, dname, sizeof(dname)); ! 195: fprintf(fp, "$ORIGIN %s.\n", dname); ! 196: db_dump(np->n_hash, fp); ! 197: } ! 198: } ! 199: } ! 200: ! 201: /* These next two routines will be moveing to res_debug.c */ ! 202: /* They are currently here for ease of distributing the WKS record fix */ ! 203: char * ! 204: p_protocal(num) ! 205: int num; ! 206: { ! 207: struct protoent *pp; ! 208: pp = getprotobynumber(num); ! 209: if(pp == 0) ! 210: return("???"); ! 211: return(pp->p_name); ! 212: } ! 213: ! 214: char * ! 215: p_service(port, proto) ! 216: u_short port; ! 217: char *proto; ! 218: { ! 219: struct servent *ss; ! 220: ss = getservbyport((int)htons(port), proto); ! 221: if(ss == 0) ! 222: return("???"); ! 223: return(ss->s_name); ! 224: } ! 225:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.