Annotation of 43BSD/etc/named/db_save.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)db_save.c  4.3 (Berkeley) 6/4/86";
        !             3: #endif
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 1986 Regents of the University of California
        !             7:  *     All Rights Reserved
        !             8:  */
        !             9: 
        !            10: /*
        !            11:  * Buffer allocation and deallocation routines.
        !            12:  */
        !            13: 
        !            14: #include <sys/types.h>
        !            15: #include <stdio.h>
        !            16: #include <syslog.h>
        !            17: #include "db.h"
        !            18: 
        !            19: #ifdef DEBUG
        !            20: extern int debug;
        !            21: extern FILE *ddt;
        !            22: #endif
        !            23: 
        !            24: extern char *malloc();
        !            25: extern char *strcpy();
        !            26: 
        !            27: /*
        !            28:  * Allocate a name buffer & save name.
        !            29:  */
        !            30: struct namebuf *
        !            31: savename(name)
        !            32:        char *name;
        !            33: {
        !            34:        register struct namebuf *np;
        !            35: 
        !            36:        np = (struct namebuf *) malloc(sizeof(struct namebuf));
        !            37:        if (np == NULL) {
        !            38:                syslog(LOG_ERR, "savename: %m");
        !            39:                exit(1);
        !            40:        }
        !            41:        np->n_dname = savestr(name);
        !            42:        np->n_next = NULL;
        !            43:        np->n_data = NULL;
        !            44:        np->n_hash = NULL;
        !            45:        return (np);
        !            46: }
        !            47: 
        !            48: /*
        !            49:  * Allocate a data buffer & save data.
        !            50:  */
        !            51: struct databuf *
        !            52: savedata(class, type, ttl, data, size)
        !            53:        int class, type;
        !            54:        u_long ttl;
        !            55:        char *data;
        !            56:        int size;
        !            57: {
        !            58:        register struct databuf *dp;
        !            59: 
        !            60:        dp = (struct databuf *) malloc((unsigned)DATASIZE(size));
        !            61:        if (dp == NULL) {
        !            62:                syslog(LOG_ERR, "savedata: %m");
        !            63:                exit(1);
        !            64:        }
        !            65:        dp->d_next = NULL;
        !            66:        dp->d_type = type;
        !            67:        dp->d_class = class;
        !            68:        dp->d_ttl = ttl;
        !            69:        dp->d_size = size;
        !            70:        bcopy(data, dp->d_data, dp->d_size);
        !            71:        return (dp);
        !            72: }
        !            73: 
        !            74: int hashsizes[] = {    /* hashtable sizes */
        !            75:        11,
        !            76:        113,
        !            77:        977,
        !            78:        4073,
        !            79:        16001,
        !            80:        0
        !            81: };
        !            82: 
        !            83: /*
        !            84:  * Allocate a data buffer & save data.
        !            85:  */
        !            86: struct hashbuf *
        !            87: savehash(oldhtp)
        !            88:        struct hashbuf *oldhtp;
        !            89: {
        !            90:        register struct hashbuf *htp;
        !            91:        register int n;
        !            92:        int newsize;
        !            93: 
        !            94:        if (oldhtp == NULL)
        !            95:                newsize = hashsizes[0];
        !            96:        else {
        !            97:                for (n = 0; newsize = hashsizes[n++]; )
        !            98:                        if (oldhtp->h_size == newsize) {
        !            99:                                newsize = hashsizes[n];
        !           100:                                break;
        !           101:                        }
        !           102:                if (newsize == 0)
        !           103:                        newsize = oldhtp->h_size * 2 + 1;
        !           104:        }
        !           105:        htp = (struct hashbuf *) malloc((unsigned)HASHSIZE(newsize));
        !           106:        if (htp == NULL) {
        !           107:                syslog(LOG_ERR, "savehash: %m");
        !           108:                exit(1);
        !           109:        }
        !           110:        htp->h_size = newsize;
        !           111:        bzero((char *) htp->h_tab, newsize * sizeof(struct hashbuf *));
        !           112:        if (oldhtp == NULL) {
        !           113:                htp->h_cnt = 0;
        !           114:                return (htp);
        !           115:        }
        !           116: #ifdef DEBUG
        !           117:        if (debug > 3)
        !           118:                fprintf(ddt,"savehash(%#x) cnt=%d, sz=%d, newsz=%d\n",
        !           119:                        oldhtp, oldhtp->h_cnt, oldhtp->h_size, newsize);
        !           120: #endif
        !           121:        htp->h_cnt = oldhtp->h_cnt;
        !           122:        for (n = 0; n < oldhtp->h_size; n++) {
        !           123:                register struct namebuf *np;
        !           124:                struct namebuf *nnp;
        !           125:                register unsigned hval;
        !           126:                register char *cp;
        !           127: 
        !           128:                for (np = oldhtp->h_tab[n]; np != NULL; np = nnp) {
        !           129:                        hval = 0;
        !           130:                        for (cp = np->n_dname; *cp; ) {
        !           131:                                hval <<= HASHSHIFT;
        !           132:                                hval += *cp++ & HASHMASK;
        !           133:                        }
        !           134:                        hval %= htp->h_size;
        !           135:                        nnp = np->n_next;
        !           136:                        np->n_next = htp->h_tab[hval];
        !           137:                        htp->h_tab[hval] = np;
        !           138:                }
        !           139:        }
        !           140:        free((char *) oldhtp);
        !           141:        return (htp);
        !           142: }
        !           143: 
        !           144: /*
        !           145:  * Allocate an inverse query buffer.
        !           146:  */
        !           147: struct invbuf *
        !           148: saveinv()
        !           149: {
        !           150:        register struct invbuf *ip;
        !           151: 
        !           152:        ip = (struct invbuf *) malloc(sizeof(struct invbuf));
        !           153:        if (ip == NULL) {
        !           154:                syslog(LOG_ERR, "saveinv: %m");
        !           155:                exit(1);
        !           156:        }
        !           157:        ip->i_next = NULL;
        !           158:        bzero((char *)ip->i_dname, sizeof(ip->i_dname));
        !           159:        return (ip);
        !           160: }
        !           161: 
        !           162: /*
        !           163:  * Make a copy of a string and return a pointer to it.
        !           164:  */
        !           165: char *
        !           166: savestr(str)
        !           167:        char *str;
        !           168: {
        !           169:        char *cp;
        !           170: 
        !           171:        cp = malloc((unsigned)strlen(str) + 1);
        !           172:        if (cp == NULL) {
        !           173:                syslog(LOG_ERR, "savestr: %m");
        !           174:                exit(1);
        !           175:        }
        !           176:        (void) strcpy(cp, str);
        !           177:        return (cp);
        !           178: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.