Annotation of 43BSDReno/usr.sbin/named/ns_init.c, revision 1.1

1.1     ! root        1: /*-
        !             2:  * Copyright (c) 1986, 1990 The 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_init.c  4.35 (Berkeley) 6/27/90";
        !            22: #endif /* not lint */
        !            23: 
        !            24: #include <sys/types.h>
        !            25: #include <sys/socket.h>
        !            26: #include <sys/time.h>
        !            27: #include <sys/stat.h>
        !            28: #include <netinet/in.h>
        !            29: #include <stdio.h>
        !            30: #include <errno.h>
        !            31: #include <signal.h>
        !            32: #include <syslog.h>
        !            33: #include <ctype.h>
        !            34: #include <string.h>
        !            35: #include <arpa/nameser.h>
        !            36: #include "pathnames.h"
        !            37: #include "ns.h"
        !            38: #include "db.h"
        !            39: 
        !            40: struct zoneinfo *zones;                /* zone information */
        !            41: int    nzones;                         /* number of zones in use */
        !            42: int    forward_only = 0;               /* run only as a slave */
        !            43: char   *cache_file;
        !            44: char   *localdomain;                   /* "default" for non-dotted names */
        !            45: int    maint_interval = 15*60;         /* minimum ns_maint() interval */
        !            46: 
        !            47: extern int lineno;
        !            48: 
        !            49: 
        !            50: /*
        !            51:  * Read boot file for configuration info.
        !            52:  */
        !            53: 
        !            54: ns_init(bootfile)
        !            55:        char *bootfile;
        !            56: {
        !            57:        register struct zoneinfo *zp;
        !            58:        struct zoneinfo *find_zone();
        !            59:        char buf[BUFSIZ], obuf[BUFSIZ], *source;
        !            60:        extern char *calloc();
        !            61:        FILE *fp;
        !            62:        int type;
        !            63:        extern int needmaint;
        !            64:        struct stat f_time;
        !            65:        static int loads = 0;                   /* number of times loaded */
        !            66:        static int tmpnum = 0;          /* unique number for tmp zone files */
        !            67: #ifdef ALLOW_UPDATES
        !            68:        char *cp, *flag;
        !            69: #endif
        !            70: 
        !            71: #ifdef DEBUG
        !            72:        if (debug)
        !            73:                fprintf(ddt,"\nns_init(%s)\n", bootfile);
        !            74: #endif
        !            75:        gettime(&tt);
        !            76: 
        !            77:        if ((fp = fopen(bootfile, "r")) == NULL) {
        !            78:                syslog(LOG_ERR, "%s: %m", bootfile);
        !            79:                exit(1);
        !            80:        }
        !            81:        lineno = 0;
        !            82:         if (loads == 0) {
        !            83:                if ((zones =
        !            84:                        (struct zoneinfo *)calloc(64, sizeof(struct zoneinfo)))
        !            85:                                            == NULL) {
        !            86:                    syslog(LOG_ERR,
        !            87:                        "Not enough memory to allocate initial zones array");
        !            88:                    exit(1);
        !            89:                }
        !            90:                nzones = 1;             /* zone zero is cache data */
        !            91:                /* allocate cache hash table, formerly the root hash table. */
        !            92:                hashtab = savehash((struct hashbuf *)NULL);
        !            93: 
        !            94:                /* allocate root-hints/file-cache hash table */
        !            95:                fcachetab = savehash((struct hashbuf *)NULL);
        !            96:                /* init zone data */
        !            97:                zones[0].z_type = Z_CACHE;
        !            98:         } else {
        !            99:                /* Mark previous zones as not yet found in boot file. */
        !           100:                for (zp = &zones[1]; zp < &zones[nzones]; zp++)
        !           101:                        zp->z_state &= ~Z_FOUND;
        !           102:                if (localdomain)
        !           103:                        free(localdomain);
        !           104:                localdomain = NULL;
        !           105:                free_forwarders();
        !           106:                forward_only = 0;
        !           107:        }
        !           108: 
        !           109: #ifdef DEBUG
        !           110:         if (debug >= 3) {
        !           111:                fprintf(ddt,"\n content of zones before loading \n");
        !           112:                content_zone(nzones - 1);
        !           113:         }
        !           114: #endif
        !           115:        while (!feof(fp) && !ferror(fp)) {
        !           116:                if (!getword(buf, sizeof(buf), fp))
        !           117:                        continue;
        !           118:                /* read named.boot keyword and process args */
        !           119:                if (strcasecmp(buf, "directory") == 0) {
        !           120:                        (void) getword(buf, sizeof(buf), fp);
        !           121:                        if (chdir(buf) < 0) {
        !           122:                                syslog(LOG_CRIT, "directory %s: %m\n",
        !           123:                                        buf);
        !           124:                                exit(1);
        !           125:                        }
        !           126:                        continue;
        !           127:                } else if (strcasecmp(buf, "sortlist") == 0) {
        !           128:                        get_sort_list(fp);
        !           129:                        continue;
        !           130:                } else if (strcasecmp(buf, "forwarders") == 0) {
        !           131:                        get_forwarders(fp);
        !           132:                        continue;
        !           133:                } else if (strcasecmp(buf, "slave") == 0) {
        !           134:                        forward_only++;
        !           135:                        endline(fp);
        !           136:                        continue;
        !           137:                } else if (strcasecmp(buf, "domain") == 0) {
        !           138:                        if (getword(buf, sizeof(buf), fp))
        !           139:                                localdomain = savestr(buf);
        !           140:                        endline(fp);
        !           141:                        continue;
        !           142:                } else if (strcasecmp(buf, "cache") == 0)
        !           143:                        type = Z_CACHE;
        !           144:                else if (strcasecmp(buf, "primary") == 0)
        !           145:                        type = Z_PRIMARY;
        !           146:                else if (strcasecmp(buf, "secondary") == 0)
        !           147:                        type = Z_SECONDARY;
        !           148:                else {
        !           149:                        syslog(LOG_ERR, "%s: line %d: unknown field '%s'\n",
        !           150:                                bootfile, lineno, buf);
        !           151:                        endline(fp);
        !           152:                        continue;
        !           153:                }
        !           154: 
        !           155:                /*
        !           156:                 * read zone origin
        !           157:                 */
        !           158:                if (!getword(obuf, sizeof(obuf), fp)) {
        !           159:                        syslog(LOG_ERR, "%s: line %d: missing origin\n",
        !           160:                            bootfile, lineno);
        !           161:                        continue;
        !           162:                }
        !           163: #ifdef DEBUG
        !           164:                if (debug)
        !           165:                        fprintf(ddt, "zone origin %s", obuf);
        !           166: #endif
        !           167:                if (obuf[0] == '.' && obuf[1] == '\0')
        !           168:                        obuf[0] = '\0';
        !           169:                /*
        !           170:                 * read source file or host address
        !           171:                 */
        !           172:                if (!getword(buf, sizeof(buf), fp)) {
        !           173:                        syslog(LOG_ERR,
        !           174:                            "%s: line %d: missing source or addr\n",
        !           175:                            bootfile, lineno);
        !           176:                        continue;
        !           177:                }
        !           178: 
        !           179:                /* check for previous instance of this zone (reload) */
        !           180:                if ((zp = find_zone(obuf, type)) == 0) {
        !           181:                        if (type == Z_CACHE) {
        !           182:                                zp = &zones[0];
        !           183:                                zp->z_origin = "";
        !           184:                                goto gotzone;
        !           185:                        }
        !           186:                        for (zp = &zones[1]; zp < &zones[nzones]; zp++)
        !           187:                                if (zp->z_type == 0)
        !           188:                                        goto gotzone;
        !           189:                        /*
        !           190:                         * this code assume that nzones never decreases
        !           191:                         */
        !           192:                        if (nzones % 64  == 0) {
        !           193: #ifdef DEBUG
        !           194:                            if (debug > 1)
        !           195:                                fprintf(ddt, "Reallocating zones structure\n");
        !           196: #endif DEBUG
        !           197:                            /*
        !           198:                             * Realloc() not used since it might damage zones
        !           199:                             * if an error occurs
        !           200:                             */
        !           201:                            if ((zp = (struct zoneinfo *)
        !           202:                                malloc((64 + nzones) * sizeof(struct zoneinfo)))
        !           203:                                            == NULL) {
        !           204:                                    syslog(LOG_ERR, "no memory for more zones");
        !           205: #ifdef DEBUG
        !           206:                                    if (debug)
        !           207:                                        fprintf(ddt,
        !           208:                                            "Out of memory for new zones\n");
        !           209: #endif DEBUG
        !           210:                                    endline(fp);
        !           211:                                    continue;
        !           212:                            }
        !           213:                            bcopy((char *)zones, (char *)zp,
        !           214:                                            nzones * sizeof(struct zoneinfo));
        !           215:                            bzero((char *)&zp[nzones],
        !           216:                                            64 * sizeof(struct zoneinfo));
        !           217:                            free(zones);
        !           218:                            zones = zp;
        !           219:                        }
        !           220:                        zp = &zones[nzones++];
        !           221:        gotzone:
        !           222:                        zp->z_origin = savestr(obuf);
        !           223:                        zp->z_type = type;
        !           224:                }
        !           225:                zp->z_addrcnt = 0;
        !           226: 
        !           227:                switch (type) {
        !           228:                case Z_CACHE:
        !           229:                        source = savestr(buf);
        !           230: #ifdef DEBUG
        !           231:                        if (debug)
        !           232:                                fprintf(ddt,", source = %s\n", source);
        !           233: #endif
        !           234:                        zp->z_refresh = 0;      /* by default, no dumping */
        !           235:                        if (getword(buf, sizeof(buf), fp)) {
        !           236: #ifdef notyet
        !           237:                                zp->z_refresh = atoi(buf);
        !           238:                                if (zp->z_refresh <= 0) {
        !           239:                                        syslog(LOG_ERR,
        !           240:                                "%s: line %d: bad refresh time '%s', ignored\n",
        !           241:                                                bootfile, lineno, buf);
        !           242:                                        zp->z_refresh = 0;
        !           243:                                } else if (cache_file == NULL)
        !           244:                                        cache_file = source;
        !           245: #else
        !           246:                                syslog(LOG_WARNING,
        !           247:                                "%s: line %d: cache refresh ignored\n",
        !           248:                                        bootfile, lineno);
        !           249: #endif
        !           250:                                endline(fp);
        !           251:                        }
        !           252:                        /*
        !           253:                         * If we've loaded this file, and the file has
        !           254:                         * not been modified and contains no $include,
        !           255:                         * then there's no need to reload.
        !           256:                         */
        !           257:                        if (zp->z_source && strcmp(source, zp->z_source) == 0 &&
        !           258:                            (zp->z_state & Z_INCLUDE) == 0 && 
        !           259:                            stat(zp->z_source, &f_time) == 0 &&
        !           260:                            zp->z_ftime == f_time.st_mtime) {
        !           261: #ifdef DEBUG
        !           262:                                if (debug)
        !           263:                                        fprintf(ddt, "cache is up to date\n");
        !           264: #endif
        !           265:                                break; /* zone is already up to date */
        !           266:                        }
        !           267: 
        !           268:                        /* file has changed, or hasn't been loaded yet */
        !           269:                        if (zp->z_source) {
        !           270:                                free(zp->z_source);
        !           271:                                remove_zone(fcachetab, 0);
        !           272:                        }
        !           273:                        zp->z_source = source;
        !           274: #ifdef DEBUG
        !           275:                        if (debug)
        !           276:                                fprintf(ddt, "reloading zone\n");
        !           277: #endif
        !           278:                        (void) db_load(zp->z_source, zp->z_origin, zp, 0);
        !           279:                        break;
        !           280: 
        !           281:                case Z_PRIMARY:
        !           282:                        source = savestr(buf);
        !           283: #ifdef ALLOW_UPDATES
        !           284:                        if (getword(buf, sizeof(buf), fp)) {
        !           285:                                endline(fp);
        !           286:                                flag = buf;
        !           287:                                while (flag) {
        !           288:                                    cp = index(flag, ',');
        !           289:                                    if (cp)
        !           290:                                        *cp++ = 0;
        !           291:                                    if (strcasecmp(flag, "dynamic") == 0)
        !           292:                                        zp->z_state |= Z_DYNAMIC;
        !           293:                                    else if (strcasecmp(flag, "addonly") == 0)
        !           294:                                        zp->z_state |= Z_DYNADDONLY;
        !           295:                                    else {
        !           296:                                        syslog(LOG_ERR,
        !           297:                                               "%s: line %d: bad flag '%s'\n",
        !           298:                                               bootfile, lineno, flag);
        !           299:                                    }
        !           300:                                    flag = cp;
        !           301:                                }
        !           302:                        }
        !           303: #else ALLOW_UPDATES
        !           304:                        endline(fp);
        !           305: #endif
        !           306: 
        !           307: #ifdef DEBUG
        !           308:                        if (debug)
        !           309:                                fprintf(ddt,", source = %s\n", source);
        !           310: #endif
        !           311:                        /*
        !           312:                         * If we've loaded this file, and the file has
        !           313:                         * not been modified and contains no $include,
        !           314:                         * then there's no need to reload.
        !           315:                         */
        !           316:                        if (zp->z_source && strcmp(source, zp->z_source) == 0 &&
        !           317:                            (zp->z_state & Z_INCLUDE) == 0 && 
        !           318:                            stat(zp->z_source, &f_time) == 0 &&
        !           319:                            zp->z_ftime == f_time.st_mtime) {
        !           320: #ifdef DEBUG
        !           321:                                if (debug)
        !           322:                                        fprintf(ddt, "zone is up to date\n");
        !           323: #endif
        !           324:                                break; /* zone is already up to date */
        !           325:                        }
        !           326:                        if (zp->z_source) {
        !           327:                                free(zp->z_source);
        !           328:                                remove_zone(hashtab, zp - zones);
        !           329:                        }
        !           330:                         zp->z_source = source;
        !           331:                         zp->z_auth = 0;
        !           332: #ifdef DEBUG
        !           333:                        if (debug)
        !           334:                                fprintf(ddt, "reloading zone\n");
        !           335: #endif
        !           336:                        if (db_load(zp->z_source, zp->z_origin, zp, 0) == 0)
        !           337:                                zp->z_auth = 1;
        !           338: #ifdef ALLOW_UPDATES
        !           339:                        /* Guarantee calls to ns_maint() */
        !           340:                        zp->z_refresh = maint_interval;
        !           341: #else ALLOW_UPDATES
        !           342:                        zp->z_refresh = 0;      /* no maintenance needed */
        !           343:                        zp->z_time = 0;
        !           344: #endif ALLOW_UPDATES
        !           345:                        break;
        !           346: 
        !           347:                case Z_SECONDARY:
        !           348:                        source = 0;
        !           349: #ifdef DEBUG
        !           350:                        if (debug)
        !           351:                                fprintf(ddt,"\n\taddrs: ");
        !           352: #endif
        !           353:                        do {
        !           354:                                zp->z_addr[zp->z_addrcnt].s_addr =
        !           355:                                        inet_addr(buf);
        !           356:                                if (zp->z_addr[zp->z_addrcnt].s_addr ==
        !           357:                                                (u_long)-1) {
        !           358:                                        source = savestr(buf);
        !           359:                                        endline(fp);
        !           360:                                        break;
        !           361:                                }
        !           362: #ifdef DEBUG
        !           363:                                if (debug)
        !           364:                                        fprintf(ddt,"%s, ",buf);
        !           365: #endif
        !           366:                                if (++zp->z_addrcnt > NSMAX - 1) {
        !           367:                                        zp->z_addrcnt = NSMAX - 1;
        !           368: #ifdef DEBUG
        !           369:                                        if (debug)
        !           370:                                            fprintf(ddt,
        !           371:                                                "\nns.h NSMAX reached\n");
        !           372: #endif
        !           373:                                }
        !           374:                        } while (getword(buf, sizeof(buf), fp));
        !           375: #ifdef DEBUG
        !           376:                        if (debug)
        !           377:                                fprintf(ddt,"addrcnt = %d\n", zp->z_addrcnt);
        !           378: #endif
        !           379:                        if (source == 0) {
        !           380:                                /*
        !           381:                                 * We will always transfer this zone again
        !           382:                                 * after a reload.
        !           383:                                 */
        !           384:                                sprintf(buf, "/%s/NsTmp%d", _PATH_TMPDIR,
        !           385:                                                tmpnum++);
        !           386:                                source = savestr(buf);
        !           387:                                zp->z_state |= Z_TMP_FILE;
        !           388:                        } else
        !           389:                                zp->z_state &= ~Z_TMP_FILE;
        !           390:                        /*
        !           391:                         * If we had a backup file name, and it was changed,
        !           392:                         * free old zone and start over.  If we don't have
        !           393:                         * current zone contents, try again now in case
        !           394:                         * we have a new server on the list.
        !           395:                         */
        !           396:                        if (zp->z_source && strcmp(source, zp->z_source)) {
        !           397: #ifdef DEBUG
        !           398:                                if (debug)
        !           399:                                        fprintf(ddt,"backup file changed\n");
        !           400: #endif
        !           401:                                free(zp->z_source);
        !           402:                                zp->z_source = 0;
        !           403:                                zp->z_auth = 0;
        !           404:                                zp->z_serial = 0;       /* force xfer */
        !           405:                                remove_zone(hashtab, zp - zones);
        !           406:                        }
        !           407:                        if (zp->z_source)
        !           408:                                free(source);
        !           409:                        else
        !           410:                                zp->z_source = source;
        !           411:                        if (zp->z_auth == 0)
        !           412:                                zoneinit(zp);
        !           413:                        break;
        !           414: 
        !           415:                }
        !           416:                 zp->z_state |= Z_FOUND;
        !           417: #ifdef DEBUG
        !           418:                if (debug)
        !           419:                        fprintf(ddt,"zone[%d] type %d: '%s'",
        !           420:                                zp-zones, type,
        !           421:                                *(zp->z_origin) == '\0' ? "." : zp->z_origin);
        !           422: #endif
        !           423:                if (zp->z_refresh && zp->z_time == 0)
        !           424:                        zp->z_time = zp->z_refresh + tt.tv_sec;
        !           425:                if (zp->z_time <= tt.tv_sec)
        !           426:                        needmaint = 1;
        !           427: #ifdef DEBUG
        !           428:                if (debug)
        !           429:                        fprintf(ddt, " z_time %d, z_refresh %d\n",
        !           430:                            zp->z_time, zp->z_refresh);
        !           431: #endif
        !           432:        }
        !           433:        (void) fclose(fp);
        !           434:         /* erase all old zones that were not found */
        !           435:         for (zp = &zones[1]; zp < &zones[nzones]; zp++)
        !           436:             if (zp->z_type && (zp->z_state & Z_FOUND) == 0) {
        !           437:                remove_zone(hashtab, zp - zones);
        !           438:                bzero((char *) zp, sizeof(*zp));
        !           439: #ifdef DEBUG
        !           440:                if(debug >=2)
        !           441:                        fprintf(ddt,"\n zone no %d was removed \n", zp - zones);
        !           442: #endif
        !           443:         }
        !           444: #ifdef DEBUG
        !           445:         if(debug >= 2) {
        !           446:                fprintf(ddt,"\n content of zones after loading \n");
        !           447:                content_zone(nzones-1);
        !           448:         }
        !           449: #endif
        !           450: 
        !           451:        /*
        !           452:         * Schedule calls to ns_maint().
        !           453:         */
        !           454:        if (needmaint == 0)
        !           455:                sched_maint();
        !           456: #ifdef DEBUG
        !           457:        if (debug)
        !           458:                fprintf(ddt,"exit ns_init()%s\n", needmaint ?
        !           459:                    ", need maintenance immediately" : "");
        !           460: #endif
        !           461:        loads++;
        !           462: }
        !           463: 
        !           464: zoneinit(zp)
        !           465:        register struct zoneinfo *zp;
        !           466: {
        !           467:        extern int needmaint;
        !           468:        struct stat sb;
        !           469: 
        !           470:        /*
        !           471:         * Try to load zone from backup file,
        !           472:         * if one was specified and it exists.
        !           473:         * If not, or if the data are out of date,
        !           474:         * we will refresh the zone from a primary
        !           475:         * immediately.
        !           476:         */
        !           477:        if (zp->z_source == NULL)
        !           478:                return;
        !           479:        if (stat(zp->z_source, &sb) == -1 ||
        !           480:            db_load(zp->z_source, zp->z_origin, zp, 0) != 0) {
        !           481:                /*
        !           482:                 * Set zone to be refreshed immediately.
        !           483:                 */
        !           484:                zp->z_refresh = INIT_REFRESH;
        !           485:                zp->z_retry = INIT_REFRESH;
        !           486:                zp->z_time = tt.tv_sec;
        !           487:                needmaint = 1;
        !           488:        } else
        !           489:                zp->z_auth = 1;
        !           490: }
        !           491: 
        !           492: #ifdef ALLOW_UPDATES
        !           493: /*
        !           494:  * Look for the authoritative zone with the longest matching RHS of dname
        !           495:  * and return its zone # or zero if not found.
        !           496:  */
        !           497: findzone(dname, class)
        !           498:        char *dname;
        !           499:        int class;
        !           500: {
        !           501:        char *dZoneName, *zoneName, *index();
        !           502:        int dZoneNameLen, zoneNameLen;
        !           503:        int maxMatchLen = 0;
        !           504:        int maxMatchZoneNum = 0;
        !           505:        int zoneNum;
        !           506: 
        !           507: #ifdef DEBUG
        !           508:        if (debug >= 4)
        !           509:                fprintf(ddt, "findzone(dname=%s, class=%d)\n", dname, class);
        !           510:        if (debug >= 5) {
        !           511:                fprintf(ddt, "zone dump:\n");
        !           512:                for (zoneNum = 1; zoneNum < nzones; zoneNum++)
        !           513:                        printzoneinfo(zoneNum);
        !           514:        }
        !           515: #endif DEBUG
        !           516: 
        !           517:        dZoneName = index(dname, '.');
        !           518:        if (dZoneName == NULL)
        !           519:                dZoneName = ""; /* root */
        !           520:        else
        !           521:                dZoneName++;    /* There is a '.' in dname, so use remainder of
        !           522:                                   string as the zone name */
        !           523:        dZoneNameLen = strlen(dZoneName);
        !           524:        for (zoneNum = 1; zoneNum < nzones; zoneNum++) {
        !           525:                zoneName = (zones[zoneNum]).z_origin;
        !           526:                zoneNameLen = strlen(zoneName);
        !           527:                /* The zone name may or may not end with a '.' */
        !           528:                if (zoneName[zoneNameLen - 1] == '.')
        !           529:                        zoneNameLen--;
        !           530:                if (dZoneNameLen != zoneNameLen)
        !           531:                        continue;
        !           532: #ifdef DEBUG
        !           533:                if (debug >= 5)
        !           534:                        fprintf(ddt, "about to strncasecmp('%s', '%s', %d)\n",
        !           535:                                dZoneName, zoneName, dZoneNameLen);
        !           536: #endif
        !           537:                if (strncasecmp(dZoneName, zoneName, dZoneNameLen) == 0) {
        !           538: #ifdef DEBUG
        !           539:                        if (debug >= 5)
        !           540:                                fprintf(ddt, "match\n");
        !           541: #endif
        !           542:                        /*
        !           543:                         * See if this is as long a match as any so far.
        !           544:                         * Check if "<=" instead of just "<" so that if
        !           545:                         * root domain (whose name length is 0) matches,
        !           546:                         * we use it's zone number instead of just 0
        !           547:                         */
        !           548:                        if (maxMatchLen <= zoneNameLen) {
        !           549:                                maxMatchZoneNum = zoneNum;
        !           550:                                maxMatchLen = zoneNameLen;
        !           551:                        }
        !           552:                }
        !           553: #ifdef DEBUG
        !           554:                else
        !           555:                        if (debug >= 5)
        !           556:                                fprintf(ddt, "no match\n");
        !           557: #endif
        !           558:        }
        !           559: #ifdef DEBUG
        !           560:        if (debug >= 4)
        !           561:                fprintf(ddt, "findzone: returning %d\n", maxMatchZoneNum);
        !           562: #endif DEBUG
        !           563:        return (maxMatchZoneNum);
        !           564: }
        !           565: #endif ALLOW_UPDATES
        !           566: 
        !           567: soa_zinfo(zp, cp, eom)
        !           568:        register struct zoneinfo *zp;
        !           569:        register u_char *cp;
        !           570:        u_char *eom;
        !           571: {
        !           572:        cp += 3 * sizeof(u_short);
        !           573:        cp += sizeof(u_long);
        !           574:        cp += dn_skipname(cp, eom);
        !           575:        cp += dn_skipname(cp, eom);
        !           576:        GETLONG(zp->z_serial, cp);
        !           577:        GETLONG(zp->z_refresh, cp);
        !           578:        gettime(&tt);
        !           579:        zp->z_time = tt.tv_sec + zp->z_refresh;
        !           580:        GETLONG(zp->z_retry, cp);
        !           581:        GETLONG(zp->z_expire, cp);
        !           582:        GETLONG(zp->z_minimum, cp);
        !           583: }
        !           584: 
        !           585: get_forwarders(fp)
        !           586:        FILE *fp;
        !           587: {
        !           588:        char buf[BUFSIZ];
        !           589:        register struct fwdinfo *fip = NULL, *ftp = NULL;
        !           590:        extern struct sockaddr_in nsaddr;
        !           591:        extern struct fwdinfo *fwdtab;
        !           592: 
        !           593: #ifdef DEBUG
        !           594:        if (debug)
        !           595:                fprintf(ddt,"forwarders ");
        !           596: #endif
        !           597: 
        !           598:        /* on mulitple forwarder lines, move to end of the list */
        !           599:        if (fwdtab != NULL)
        !           600:                for (fip = fwdtab; fip->next != NULL; fip = fip->next)
        !           601:                        ;
        !           602: 
        !           603:        while (getword(buf, sizeof(buf), fp)) {
        !           604:                if (strlen(buf) == 0)
        !           605:                        break;
        !           606: #ifdef DEBUG
        !           607:                if (debug)
        !           608:                        fprintf(ddt," %s",buf);
        !           609: #endif
        !           610:                if (ftp == NULL)
        !           611:                        ftp = (struct fwdinfo *)malloc(sizeof(struct fwdinfo));
        !           612:                if (isdigit(buf[0]) &&
        !           613:                    (ftp->fwdaddr.sin_addr.s_addr = inet_addr(buf)) !=
        !           614:                    (u_long)-1) {
        !           615:                        ftp->fwdaddr.sin_port = nsaddr.sin_port;
        !           616:                        ftp->fwdaddr.sin_family = AF_INET;
        !           617:                } else {
        !           618:                        syslog(LOG_ERR, "'%s' (ignored, NOT dotted quad)", buf);
        !           619: #ifdef DEBUG
        !           620:                        if (debug)
        !           621:                                fprintf(ddt," (ignored, NOT dotted quad)");
        !           622: #endif
        !           623:                        continue;       
        !           624:                }
        !           625:                ftp->next = NULL;
        !           626:                if (fwdtab == NULL)
        !           627:                        fwdtab = ftp;   /* First time only */
        !           628:                else
        !           629:                        fip->next = ftp;
        !           630:                fip = ftp;
        !           631:                ftp = NULL;
        !           632:        }
        !           633:        if (ftp)
        !           634:                free((char *)ftp);
        !           635:        
        !           636: #ifdef DEBUG
        !           637:        if (debug) 
        !           638:                fprintf(ddt,"\n");
        !           639:        if (debug > 2)
        !           640:                for (ftp = fwdtab; ftp != NULL; ftp = ftp->next)
        !           641:                        fprintf(ddt,"ftp x%x %s next x%x\n", ftp,
        !           642:                                inet_ntoa(ftp->fwdaddr.sin_addr), ftp->next);
        !           643: #endif
        !           644: }
        !           645: 
        !           646: free_forwarders()
        !           647: {
        !           648:        extern struct fwdinfo *fwdtab;
        !           649:        register struct fwdinfo *ftp, *fnext;
        !           650: 
        !           651:        for (ftp = fwdtab; ftp != NULL; ftp = fnext) {
        !           652:                fnext = ftp->next;
        !           653:                free((char *)ftp);
        !           654:        }
        !           655:        fwdtab = NULL;
        !           656: }
        !           657: 
        !           658: struct zoneinfo *
        !           659: find_zone(name, type) 
        !           660:        char *name;
        !           661:        int type;
        !           662: {
        !           663:        register struct zoneinfo *zp;
        !           664: 
        !           665:         for (zp = &zones[1]; zp < &zones[nzones]; zp++)
        !           666:                if (zp->z_type == type && strcasecmp(name, zp->z_origin) == 0) {
        !           667: #ifdef DEBUG
        !           668:                        if (debug > 1)
        !           669:                                fprintf(ddt, ", old zone (%d)", zp - zones);
        !           670: #endif
        !           671:                        return (zp);
        !           672:                }
        !           673: #ifdef DEBUG
        !           674:        if(debug > 1)
        !           675:                fprintf(ddt, ", new zone");
        !           676: #endif
        !           677:        return ((struct zoneinfo *)NULL);
        !           678: }
        !           679: 
        !           680: /* prints out the content of zones */
        !           681: content_zone(end) 
        !           682:        int  end;
        !           683: {
        !           684:        int i;
        !           685:        for (i = 1; i <= end; i++)
        !           686:                printzoneinfo(i);
        !           687: }

unix.superglobalmegacorp.com

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