|
|
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 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[] = "@(#)db_save.c 4.15 (Berkeley) 6/1/90";
22: #endif /* not lint */
23:
24: /*
25: * Buffer allocation and deallocation routines.
26: */
27:
28: #include <sys/types.h>
29: #include <stdio.h>
30: #include <syslog.h>
31: #include <arpa/nameser.h>
32: #include "db.h"
33:
34: #ifdef DEBUG
35: extern int debug;
36: extern FILE *ddt;
37: #endif
38:
39: extern char *strcpy();
40:
41: /*
42: * Allocate a name buffer & save name.
43: */
44: struct namebuf *
45: savename(name)
46: char *name;
47: {
48: register struct namebuf *np;
49:
50: np = (struct namebuf *) malloc(sizeof(struct namebuf));
51: if (np == NULL) {
52: syslog(LOG_ERR, "savename: %m");
53: exit(1);
54: }
55: np->n_dname = savestr(name);
56: np->n_next = NULL;
57: np->n_data = NULL;
58: np->n_hash = NULL;
59: return (np);
60: }
61:
62: /*
63: * Allocate a data buffer & save data.
64: */
65: struct databuf *
66: savedata(class, type, ttl, data, size)
67: int class, type;
68: u_long ttl;
69: char *data;
70: int size;
71: {
72: register struct databuf *dp;
73:
74: if (type == T_NS)
75: dp = (struct databuf *)
76: malloc((unsigned)DATASIZE(size)+sizeof(u_long));
77: else
78: dp = (struct databuf *) malloc((unsigned)DATASIZE(size));
79: if (dp == NULL) {
80: syslog(LOG_ERR, "savedata: %m");
81: exit(1);
82: }
83: dp->d_next = NULL;
84: dp->d_type = type;
85: dp->d_class = class;
86: dp->d_ttl = ttl;
87: dp->d_size = size;
88: dp->d_mark = 0;
89: dp->d_flags = 0;
90: dp->d_nstime = 0;
91: bcopy(data, dp->d_data, dp->d_size);
92: return (dp);
93: }
94:
95: int hashsizes[] = { /* hashtable sizes */
96: 2,
97: 11,
98: 113,
99: 337,
100: 977,
101: 2053,
102: 4073,
103: 8011,
104: 16001,
105: 0
106: };
107:
108: /*
109: * Allocate a data buffer & save data.
110: */
111: struct hashbuf *
112: savehash(oldhtp)
113: register struct hashbuf *oldhtp;
114: {
115: register struct hashbuf *htp;
116: register struct namebuf *np, *nnp, **hp;
117: register int n;
118: int newsize;
119:
120: if (oldhtp == NULL)
121: newsize = hashsizes[0];
122: else {
123: for (n = 0; newsize = hashsizes[n++]; )
124: if (oldhtp->h_size == newsize) {
125: newsize = hashsizes[n];
126: break;
127: }
128: if (newsize == 0)
129: newsize = oldhtp->h_size * 2 + 1;
130: }
131: #ifdef DEBUG
132: if(debug > 3)
133: fprintf(ddt, "savehash GROWING to %d\n", newsize);
134: #endif
135: htp = (struct hashbuf *) malloc((unsigned)HASHSIZE(newsize));
136: if (htp == NULL) {
137: syslog(LOG_ERR, "savehash: %m");
138: exit(1);
139: }
140: htp->h_size = newsize;
141: bzero((char *) htp->h_tab, newsize * sizeof(struct hashbuf *));
142: if (oldhtp == NULL) {
143: htp->h_cnt = 0;
144: return (htp);
145: }
146: #ifdef DEBUG
147: if (debug > 3)
148: fprintf(ddt,"savehash(%#x) cnt=%d, sz=%d, newsz=%d\n",
149: oldhtp, oldhtp->h_cnt, oldhtp->h_size, newsize);
150: #endif
151: htp->h_cnt = oldhtp->h_cnt;
152: for (n = 0; n < oldhtp->h_size; n++) {
153: for (np = oldhtp->h_tab[n]; np != NULL; np = nnp) {
154: nnp = np->n_next;
155: hp = &htp->h_tab[np->n_hashval % htp->h_size];
156: np->n_next = *hp;
157: *hp = np;
158: }
159: }
160: free((char *) oldhtp);
161: return (htp);
162: }
163:
164: /*
165: * Allocate an inverse query buffer.
166: */
167: struct invbuf *
168: saveinv()
169: {
170: register struct invbuf *ip;
171:
172: ip = (struct invbuf *) malloc(sizeof(struct invbuf));
173: if (ip == NULL) {
174: syslog(LOG_ERR, "saveinv: %m");
175: exit(1);
176: }
177: ip->i_next = NULL;
178: bzero((char *)ip->i_dname, sizeof(ip->i_dname));
179: return (ip);
180: }
181:
182: /*
183: * Make a copy of a string and return a pointer to it.
184: */
185: char *
186: savestr(str)
187: char *str;
188: {
189: char *cp;
190:
191: cp = malloc((unsigned)strlen(str) + 1);
192: if (cp == NULL) {
193: syslog(LOG_ERR, "savestr: %m");
194: exit(1);
195: }
196: (void) strcpy(cp, str);
197: return (cp);
198: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.