Annotation of 43BSD/etc/named/tools/ns.lookup/src/getinfo.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *******************************************************************************
        !             3:  *
        !             4:  *  getinfo.c --
        !             5:  *
        !             6:  *     Routines to create requests to name servers 
        !             7:  *     and interpret the answers.
        !             8:  *
        !             9:  *     Adapted from 4.3BSD BIND gethostnamadr.c
        !            10:  *
        !            11:  *     Copyright (c) 1985 Regents of the University of California.
        !            12:  *     All rights reserved.  The Berkeley software License Agreement
        !            13:  *     specifies the terms and conditions for redistribution.
        !            14:  *
        !            15:  *******************************************************************************
        !            16:  */
        !            17: 
        !            18: #ifndef lint
        !            19: static char sccsid[] = "@(#)getinfo.c  5.3 (Berkeley) 3/31/86";
        !            20: #endif not lint
        !            21: 
        !            22: #include <sys/types.h>
        !            23: #include <sys/socket.h>
        !            24: #include <netinet/in.h>
        !            25: #include <stdio.h>
        !            26: #include <ctype.h>
        !            27: #include <arpa/nameser.h>
        !            28: #include <resolv.h>
        !            29: #include "res.h"
        !            30: 
        !            31: extern char *rcodes[];
        !            32: extern char *res_skip();
        !            33: 
        !            34: #define        MAXALIASES      35
        !            35: #define MAXADDRS       35
        !            36: #define MAXDOMAINS     35
        !            37: #define MAXSERVERS     10
        !            38: 
        !            39: static char *addr_list[MAXADDRS + 1];
        !            40: 
        !            41: static char *host_aliases[MAXALIASES];
        !            42: static int   host_aliases_len[MAXALIASES];
        !            43: static char  hostbuf[BUFSIZ+1];
        !            44: 
        !            45: typedef struct {
        !            46:     char *name;
        !            47:     char *domain[MAXDOMAINS];
        !            48:     int   numDomains;
        !            49:     char *address[MAXADDRS];
        !            50:     int   numAddresses;
        !            51: } ServerTable;
        !            52: 
        !            53: ServerTable server[MAXSERVERS];
        !            54: 
        !            55: typedef union {
        !            56:     HEADER qb1;
        !            57:     char qb2[PACKETSZ];
        !            58: } querybuf;
        !            59: 
        !            60: static union {
        !            61:     long al;
        !            62:     char ac;
        !            63: } align;
        !            64: 
        !            65: 
        !            66: /*
        !            67:  *******************************************************************************
        !            68:  *
        !            69:  *  GetAnswer --
        !            70:  *
        !            71:  *     Interprets an answer packet and retrieves the following
        !            72:  *     information:
        !            73:  *
        !            74:  *  Results:
        !            75:  *      SUCCESS         the info was retrieved.
        !            76:  *      NO_INFO         the packet did not contain an answer.
        !            77:  *     NONAUTH         non-authoritative information was found.
        !            78:  *      ERROR           the answer was malformed.
        !            79:  *      Other errors    returned in the packet header.
        !            80:  *
        !            81:  *******************************************************************************
        !            82:  */
        !            83: 
        !            84: static int
        !            85: GetAnswer(nsAddrPtr, queryType, msg, msglen, iquery, hostPtr)
        !            86:        struct in_addr          *nsAddrPtr;
        !            87:        char                    *msg;
        !            88:        int                     queryType;
        !            89:        int                     msglen;
        !            90:        int                     iquery;
        !            91:        register HostInfo       *hostPtr;
        !            92: {
        !            93:        register HEADER         *headerPtr;
        !            94:        register char           *cp;
        !            95:        querybuf                answer;
        !            96:        char                    *eom, *bp, **aliasPtr;
        !            97:        char                    **addrPtr;
        !            98:        char                    *namePtr;
        !            99:        char                    *dnamePtr;
        !           100:        int                     type, class;
        !           101:        int                     qdcount, ancount, arcount, nscount, buflen;
        !           102:        int                     haveanswer, getclass;
        !           103:        int                     numAliases = 0;
        !           104:        int                     numAddresses = 0;
        !           105:        int                     n, i, j;
        !           106:        int                     len;
        !           107:        int                     dlen;
        !           108:        int                     status;
        !           109:        int                     numServers;
        !           110:        int                     found;
        !           111: 
        !           112: 
        !           113:        /*
        !           114:         *  If the hostPtr was used before, free up 
        !           115:         *  the calloc'd areas.
        !           116:         */
        !           117:        FreeHostInfoPtr(hostPtr);
        !           118:            
        !           119:        status = SendRequest(nsAddrPtr, msg, msglen, (char *) &answer, 
        !           120:                                sizeof(answer), &n);
        !           121: 
        !           122:        if (status != SUCCESS) {
        !           123:                if (_res.options & RES_DEBUG2)
        !           124:                        printf("SendRequest failed\n");
        !           125:                return (status);
        !           126:        }
        !           127:        eom = (char *) &answer + n;
        !           128: 
        !           129:        headerPtr = (HEADER *) &answer;
        !           130:        qdcount = ntohs(headerPtr->qdcount);
        !           131:        ancount = ntohs(headerPtr->ancount);
        !           132:        arcount = ntohs(headerPtr->arcount);
        !           133:        nscount = ntohs(headerPtr->nscount);
        !           134: 
        !           135:        if (headerPtr->rcode != NOERROR) {
        !           136:            if (_res.options & RES_DEBUG) {
        !           137:                printf(
        !           138:                "Failed: %s, num. answers = %d, ns = %d, additional = %d\n", 
        !           139:                        rcodes[headerPtr->rcode], ancount, nscount, arcount);
        !           140:            }
        !           141:            return (headerPtr->rcode);
        !           142:        }
        !           143: 
        !           144:        /*
        !           145:         * If there are no answer, n.s. or additional records 
        !           146:         * then return with an error.
        !           147:         */
        !           148:        if (ancount == 0 && nscount == 0 && arcount == 0) {
        !           149:            return (NO_INFO);
        !           150:        }
        !           151: 
        !           152: 
        !           153:        bp      = hostbuf;
        !           154:        buflen  = sizeof(hostbuf);
        !           155:        cp      = (char *) &answer + sizeof(HEADER);
        !           156: 
        !           157:        /*
        !           158:         * For inverse queries, the desired information is returned
        !           159:         * in the question section. If there are no question records,
        !           160:         * return with an error.
        !           161:         *
        !           162:         */
        !           163:        if (qdcount) {
        !           164:            if (iquery) {
        !           165:                if ((n = dn_expand((char *)&answer, eom, cp, bp, buflen)) < 0) {
        !           166:                    return (ERROR);
        !           167:                }
        !           168:                cp += n + QFIXEDSZ;
        !           169:                len = strlen(bp) + 1;
        !           170:                hostPtr->name = Calloc((unsigned)1, (unsigned)len);
        !           171:                bcopy(bp, hostPtr->name, len);
        !           172:            } else {
        !           173:                cp += dn_skip(cp) + QFIXEDSZ;
        !           174:            }
        !           175:            while (--qdcount > 0) {
        !           176:                cp += dn_skip(cp) + QFIXEDSZ;
        !           177:            }
        !           178:        } else if (iquery) {
        !           179:            return (NO_INFO);
        !           180:        }
        !           181: 
        !           182:        aliasPtr        = host_aliases;
        !           183:        addrPtr         = addr_list;
        !           184:        haveanswer      = 0;
        !           185: 
        !           186:        /*
        !           187:         * Scan through the answer resource records.
        !           188:         * Answers for address query types are saved.
        !           189:         * Other query type answers are just printed.
        !           190:         */
        !           191:        while (--ancount >= 0 && cp < eom) {
        !           192:            if (queryType != T_A) {
        !           193:                if ((cp = Print_rr(cp, (char *) &answer, eom, stdout)) == NULL) {
        !           194:                    return(ERROR);
        !           195:                }
        !           196:                continue;
        !           197:            } else {
        !           198:                if ((n = dn_expand((char *) &answer, eom, cp, bp, buflen)) < 0) {
        !           199:                    return(ERROR);
        !           200:                }
        !           201:                cp += n;
        !           202:                type = getshort(cp);
        !           203:                cp += sizeof(u_short);
        !           204:                class = getshort(cp);
        !           205:                cp += sizeof(u_short) + sizeof(u_long);
        !           206:                dlen = getshort(cp);
        !           207:                cp += sizeof(u_short);
        !           208:                if (type == T_CNAME) {
        !           209:                    /*
        !           210:                     * Found an alias.
        !           211:                     */
        !           212:                    cp += dlen;
        !           213:                    if (aliasPtr >= &host_aliases[MAXALIASES-1])
        !           214:                            continue;
        !           215:                    *aliasPtr++ = bp;
        !           216:                    n = strlen(bp) + 1;
        !           217:                    host_aliases_len[numAliases] = n;
        !           218:                    numAliases++;
        !           219:                    bp += n;
        !           220:                    buflen -= n;
        !           221:                    continue;
        !           222:                } else if (type == T_PTR) {
        !           223:                    /*
        !           224:                     *  Found a "pointer" to the real name.
        !           225:                     */
        !           226:                    if((n= dn_expand((char *)&answer, eom, cp, bp, buflen)) < 0){
        !           227:                        cp += n;
        !           228:                        continue;
        !           229:                    }
        !           230:                    cp += n;
        !           231:                    len = strlen(bp) + 1;
        !           232:                    hostPtr->name = Calloc((unsigned)1, (unsigned)len);
        !           233:                    bcopy(bp, hostPtr->name, len);
        !           234:                    haveanswer = 1;
        !           235:                    break;
        !           236:                } else if (type != T_A) {
        !           237:                    cp += dlen;
        !           238:                    continue;
        !           239:                }
        !           240:                if (haveanswer) {
        !           241:                    if (n != hostPtr->addrLen) {
        !           242:                        cp += dlen;
        !           243:                        continue;
        !           244:                    }
        !           245:                    if (class != getclass) {
        !           246:                        cp += dlen;
        !           247:                        continue;
        !           248:                    }
        !           249:                } else {
        !           250:                    hostPtr->addrLen = dlen;
        !           251:                    getclass = class;
        !           252:                    hostPtr->addrType = (class == C_IN) ? AF_INET : AF_UNSPEC;
        !           253:                    if (!iquery) {
        !           254:                        len = strlen(bp) + 1;
        !           255:                        hostPtr->name = Calloc((unsigned)1, (unsigned)len);
        !           256:                        bcopy(bp, hostPtr->name, len);
        !           257:                    }
        !           258:                }
        !           259:                bp += (((u_long)bp) % sizeof(align));
        !           260: 
        !           261:                if (bp + dlen >= &hostbuf[sizeof(hostbuf)]) {
        !           262:                        if (_res.options & RES_DEBUG)
        !           263:                                printf("Size (%d) too big\n", dlen);
        !           264:                        break;
        !           265:                }
        !           266:                bcopy(cp, *addrPtr++ = bp, dlen);
        !           267:                bp +=dlen;
        !           268:                cp += dlen;
        !           269:                numAddresses++;
        !           270:                haveanswer = 1;
        !           271:            }
        !           272:        }
        !           273: 
        !           274:        if (queryType == T_A && haveanswer) {
        !           275: 
        !           276:            /*
        !           277:             *  Go through the alias and address lists and return them
        !           278:             *  in the hostPtr variable.
        !           279:             */
        !           280: 
        !           281:            if (numAliases > 0) {
        !           282:                hostPtr->aliases = (char **) Calloc((unsigned)1+numAliases, 
        !           283:                                                        sizeof(char *));
        !           284:                for (i = 0; i < numAliases; i++) {
        !           285:                    hostPtr->aliases[i] = Calloc((unsigned)1, (unsigned)host_aliases_len[i]);
        !           286:                    bcopy(host_aliases[i], hostPtr->aliases[i], 
        !           287:                            host_aliases_len[i]);
        !           288:                }
        !           289:                hostPtr->aliases[i] = NULL;
        !           290:            }
        !           291:            if (numAddresses > 0) {
        !           292:                hostPtr->addrList = (char **) Calloc((unsigned)1+numAddresses, 
        !           293:                                                        sizeof(char *));
        !           294:                for (i = 0; i < numAddresses; i++) {
        !           295:                    hostPtr->addrList[i] = Calloc((unsigned)1, (unsigned)hostPtr->addrLen);
        !           296:                    bcopy(addr_list[i], hostPtr->addrList[i], 
        !           297:                            hostPtr->addrLen);
        !           298:                }
        !           299:                hostPtr->addrList[i] = NULL;
        !           300:            }
        !           301:            hostPtr->servers= NULL;
        !           302:            return (SUCCESS);
        !           303:        }
        !           304: 
        !           305:        /*
        !           306:         * At this point, only non-authoritative answers for
        !           307:         * the T_A query type remain. For other query types,
        !           308:         * additional information might be found in the additional
        !           309:         * resource records part.
        !           310:         */
        !           311: 
        !           312:        cp = res_skip((char *) &answer, 2);
        !           313: 
        !           314:        numServers = 0;
        !           315:        while (--nscount >= 0 && cp < eom) {
        !           316:            /*
        !           317:             *  Go through the NS records and retrieve the
        !           318:             *  names of hosts that server the requested domain, 
        !           319:             *  their addresses and other domains they might serve.
        !           320:             */
        !           321: 
        !           322:          if ((n = dn_expand((char *) &answer, eom, cp, bp, buflen)) < 0) {
        !           323:              return(ERROR);
        !           324:          }
        !           325:          cp += n;
        !           326:          len = strlen(bp) + 1;
        !           327:          dnamePtr = Calloc((unsigned)1, (unsigned)len);   /* domain name */
        !           328:          bcopy(bp, dnamePtr, len);
        !           329: 
        !           330:          type = getshort(cp);
        !           331:          cp += sizeof(u_short);
        !           332:          class = getshort(cp);
        !           333:          cp += sizeof(u_short) + sizeof(u_long);
        !           334:          dlen = getshort(cp);
        !           335:          cp += sizeof(u_short);
        !           336: 
        !           337:          if (type != T_NS) {
        !           338:              cp += dlen;
        !           339:          } else {
        !           340:            if ((n = dn_expand((char *) &answer, eom, cp, bp, buflen)) < 0) {
        !           341:                return(ERROR);
        !           342:            }
        !           343:            cp += n;
        !           344:            len = strlen(bp) + 1;
        !           345:            namePtr = Calloc((unsigned)1, (unsigned)len); /* server host name */
        !           346:            bcopy(bp, namePtr, len);
        !           347: 
        !           348:            /*
        !           349:             * Store the information keyed by the server host name.
        !           350:             */
        !           351:            found = FALSE;
        !           352:            for (j = 0; j < numServers; j++) {
        !           353:                if (strcmp(namePtr, server[j].name) == 0) {
        !           354:                    found = TRUE;
        !           355:                    free(namePtr);
        !           356:                    break;
        !           357:                }
        !           358:            }
        !           359:            if (found) {
        !           360:                server[j].numDomains++;
        !           361:                if (server[j].numDomains <= MAXDOMAINS) {
        !           362:                    server[j].domain[server[j].numDomains-1] = dnamePtr;
        !           363:                }
        !           364:            } else {
        !           365:                if (numServers > MAXSERVERS) {
        !           366:                    break;
        !           367:                }
        !           368:                numServers++;
        !           369:                server[numServers -1].name = namePtr;
        !           370:                server[numServers -1].domain[0] = dnamePtr;
        !           371:                server[numServers -1].numDomains = 1;
        !           372:                server[numServers -1].numAddresses = 0;
        !           373:            }
        !           374:          }
        !           375:        }
        !           376: 
        !           377:        if (!headerPtr->aa && (queryType != T_A) && arcount > 0) {
        !           378:            printf("Authoritative answers can be found from:\n");
        !           379:        }
        !           380: 
        !           381:        /*
        !           382:         * Additional resource records contain addresses of
        !           383:         * servers.
        !           384:         */
        !           385:        cp = res_skip((char *) &answer, 3);
        !           386:        while (--arcount >= 0 && cp < eom) {
        !           387:            /*
        !           388:             * If we don't need to save the record, just print it.
        !           389:             */
        !           390:            if (queryType != T_A) {
        !           391:                if ((cp = Print_rr(cp, (char *) &answer, eom, stdout)) == NULL) {
        !           392:                    return(ERROR);
        !           393:                }
        !           394:                continue;
        !           395: 
        !           396:            } else {
        !           397:              if ((n = dn_expand((char *) &answer, eom, cp, bp, buflen)) < 0)
        !           398:                      break;
        !           399:              cp += n;
        !           400:              type = getshort(cp);
        !           401:              cp += sizeof(u_short);
        !           402:              class = getshort(cp);
        !           403:              cp += sizeof(u_short) + sizeof(u_long);
        !           404:              dlen = getshort(cp);
        !           405:              cp += sizeof(u_short);
        !           406: 
        !           407:              if (type != T_A)  {
        !           408:                  cp += dlen;
        !           409:                  continue;
        !           410:              } else {
        !           411:                for (j = 0; j < numServers; j++) {
        !           412:                  if (strcmp(bp, server[j].name) == 0) {
        !           413:                    server[j].numAddresses++;
        !           414:                    if (server[j].numAddresses <= MAXADDRS) {
        !           415:                     server[j].address[server[j].numAddresses-1]=Calloc((unsigned)1,(unsigned)dlen);
        !           416:                     bcopy(cp,server[j].address[server[j].numAddresses-1],dlen);
        !           417:                     break;
        !           418:                    }
        !           419:                  }
        !           420:                }
        !           421:                cp += dlen;
        !           422:              }
        !           423:            }
        !           424:        }
        !           425: 
        !           426:        /*
        !           427:         * If we are returning name server info, transfer it to
        !           428:         * the hostPtr.
        !           429:         *
        !           430:         */
        !           431:        if (numServers > 0) {
        !           432:          hostPtr->servers = (ServerInfo **) Calloc((unsigned)numServers+1, 
        !           433:                                        sizeof(ServerInfo *));
        !           434:          for (i = 0; i < numServers; i++) {
        !           435:            hostPtr->servers[i] = (ServerInfo *) Calloc((unsigned)1, sizeof(ServerInfo));
        !           436:            hostPtr->servers[i]->name = server[i].name;
        !           437: 
        !           438: 
        !           439:            hostPtr->servers[i]->domains = (char **)
        !           440:                                Calloc((unsigned)server[i].numDomains+1,sizeof(char *));
        !           441:            for (j = 0; j < server[i].numDomains; j++) {
        !           442:              hostPtr->servers[i]->domains[j] = server[i].domain[j];
        !           443:            }
        !           444:            hostPtr->servers[i]->domains[j] = NULL;
        !           445: 
        !           446: 
        !           447:            hostPtr->servers[i]->addrList = (char **)
        !           448:                                Calloc((unsigned)server[i].numAddresses+1,sizeof(char *));
        !           449:            for (j = 0; j < server[i].numAddresses; j++) {
        !           450:              hostPtr->servers[i]->addrList[j] = server[i].address[j];
        !           451:            }
        !           452:            hostPtr->servers[i]->addrList[j] = NULL;
        !           453: 
        !           454:          }
        !           455:          hostPtr->servers[i] = NULL;
        !           456:        }
        !           457: 
        !           458: 
        !           459:        if (queryType != T_A) {
        !           460:            return(SUCCESS);
        !           461:        } else {
        !           462:            return(NONAUTH);
        !           463:        }
        !           464: }
        !           465: 
        !           466: /*
        !           467:  *******************************************************************************
        !           468:  *
        !           469:  *  GetHostInfo --
        !           470:  *
        !           471:  *     Retrieves host name, address and alias information
        !           472:  *     for a domain.
        !           473:  *
        !           474:  *  Results:
        !           475:  *     ERROR           - res_mkquery failed.
        !           476:  *     + return values from GetAnswer()
        !           477:  *
        !           478:  *******************************************************************************
        !           479:  */
        !           480: 
        !           481: int
        !           482: GetHostInfo(nsAddrPtr, queryType, name, hostPtr)
        !           483:        struct in_addr *nsAddrPtr;
        !           484:        int             queryType;
        !           485:        char            *name;
        !           486:        HostInfo        *hostPtr;
        !           487: {
        !           488:        int      n;
        !           489:        int      result;
        !           490:        querybuf buf;
        !           491:        extern char *Calloc();
        !           492: 
        !           493:        /* catch explicit addresses */
        !           494:        if (isdigit(*name)) {
        !           495:            long ina;
        !           496: 
        !           497:            ina = inet_addr(name);
        !           498: 
        !           499:            if (ina == -1)
        !           500:                return(ERROR);
        !           501: 
        !           502:            hostPtr->name = Calloc((unsigned)strlen(name)+3,1);
        !           503:            sprintf(hostPtr->name,"[%s]",name);
        !           504:            hostPtr->aliases = 0;
        !           505:            hostPtr->servers = 0;
        !           506:            hostPtr->addrType = AF_INET;
        !           507:            hostPtr->addrLen = 4;
        !           508:            hostPtr->addrList = (char **)Calloc((unsigned)2,sizeof(char *));
        !           509:            hostPtr->addrList[0] = Calloc(sizeof(long),sizeof(char));
        !           510:            bcopy((char *)&ina,hostPtr->addrList[0],sizeof(ina));
        !           511:            hostPtr->addrList[1] = 0;
        !           512: 
        !           513:            return(SUCCESS);
        !           514:        }
        !           515: 
        !           516:        n = res_mkquery(QUERY, name, C_ANY, queryType,
        !           517:                        (char *)0, 0, (char *)0, (char *) &buf, sizeof(buf));
        !           518:        if (n < 0) {
        !           519:            if (_res.options & RES_DEBUG) {
        !           520:                printf("Res_mkquery failed\n");
        !           521:            }
        !           522:            return (ERROR);
        !           523:        }
        !           524: 
        !           525:        result = GetAnswer(nsAddrPtr, queryType, (char *) &buf, n, 0, hostPtr);
        !           526: 
        !           527:        /*
        !           528:         * GetAnswer didn't find a name, so set it to the specified one.
        !           529:         */
        !           530:        if (result == NONAUTH) {
        !           531:            if (hostPtr->name == NULL) {
        !           532:                int len = strlen(name) + 1;
        !           533:                hostPtr->name = Calloc((unsigned)len, sizeof(char));
        !           534:                bcopy(name, hostPtr->name, len);
        !           535:            }
        !           536:        }
        !           537:        return(result);
        !           538: }
        !           539: 
        !           540: 
        !           541: /*
        !           542:  *******************************************************************************
        !           543:  *
        !           544:  *  FindHostInfo --
        !           545:  *
        !           546:  *     Performs an inverse query to find the host name
        !           547:  *     that corresponds to the given address.
        !           548:  *
        !           549:  *  Results:
        !           550:  *     ERROR           - res_mkquery failed.
        !           551:  *     + return values from GetAnswer()
        !           552:  *
        !           553:  *******************************************************************************
        !           554:  */
        !           555: 
        !           556: int
        !           557: FindHostInfo(nsAddrPtr, address, len, hostPtr)
        !           558:        struct in_addr  *nsAddrPtr;
        !           559:        struct in_addr  *address;
        !           560:        int             len;
        !           561:        HostInfo        *hostPtr;
        !           562: {
        !           563:        int      n;
        !           564:        querybuf buf;
        !           565: 
        !           566:        n = res_mkquery(IQUERY, (char *)0, C_IN, T_A,
        !           567:                (char *)address, len, (char *)0, (char *) &buf, sizeof(buf));
        !           568:        if (n < 0) {
        !           569:            if (_res.options & RES_DEBUG) {
        !           570:                printf("Res_mkquery failed\n");
        !           571:            }
        !           572:            return (ERROR);
        !           573:        }
        !           574:        return(GetAnswer(nsAddrPtr, T_A, (char *) &buf, n, 1, hostPtr));
        !           575: }
        !           576: 
        !           577: /*
        !           578:  *******************************************************************************
        !           579:  *
        !           580:  *  FreeHostInfoPtr --
        !           581:  *
        !           582:  *     Deallocates all the calloc'd areas for a HostInfo
        !           583:  *     variable.
        !           584:  *
        !           585:  *******************************************************************************
        !           586:  */
        !           587: 
        !           588: void
        !           589: FreeHostInfoPtr(hostPtr)
        !           590:     HostInfo *hostPtr;
        !           591: {
        !           592:        int i, j;
        !           593: 
        !           594:        if (hostPtr->name != NULL) {
        !           595:            free(hostPtr->name);
        !           596:            hostPtr->name = NULL;
        !           597:        }
        !           598: 
        !           599:        if (hostPtr->aliases != NULL) {
        !           600:            i = 0;
        !           601:            while (hostPtr->aliases[i] != NULL) {
        !           602:                free(hostPtr->aliases[i]);
        !           603:                i++;
        !           604:            }
        !           605:            free((char *)hostPtr->aliases);
        !           606:            hostPtr->aliases = NULL;
        !           607:        }
        !           608: 
        !           609:        if (hostPtr->addrList != NULL) {
        !           610:            i = 0;
        !           611:            while (hostPtr->addrList[i] != NULL) {
        !           612:                free(hostPtr->addrList[i]);
        !           613:                i++;
        !           614:            }
        !           615:            free((char *)hostPtr->addrList);
        !           616:            hostPtr->addrList = NULL;
        !           617:        }
        !           618: 
        !           619:        if (hostPtr->servers != NULL) {
        !           620:            i = 0;
        !           621:            while (hostPtr->servers[i] != NULL) {
        !           622: 
        !           623:                if (hostPtr->servers[i]->name != NULL) {
        !           624:                    free(hostPtr->servers[i]->name);
        !           625:                }
        !           626: 
        !           627:                if (hostPtr->servers[i]->domains != NULL) {
        !           628:                    j = 0;
        !           629:                    while (hostPtr->servers[i]->domains[j] != NULL) {
        !           630:                        free(hostPtr->servers[i]->domains[j]);
        !           631:                        j++;
        !           632:                    }
        !           633:                    free((char *)hostPtr->servers[i]->domains);
        !           634:                }
        !           635: 
        !           636:                if (hostPtr->servers[i]->addrList != NULL) {
        !           637:                    j = 0;
        !           638:                    while (hostPtr->servers[i]->addrList[j] != NULL) {
        !           639:                        free(hostPtr->servers[i]->addrList[j]);
        !           640:                        j++;
        !           641:                    }
        !           642:                    free((char *)hostPtr->servers[i]->addrList);
        !           643:                }
        !           644:                free((char *)hostPtr->servers[i]);
        !           645:                i++;
        !           646:            }
        !           647:            free((char *)hostPtr->servers);
        !           648:            hostPtr->servers = NULL;
        !           649:        }
        !           650: }
        !           651: 
        !           652: /*
        !           653:  *******************************************************************************
        !           654:  *
        !           655:  *  GetHostList --
        !           656:  *
        !           657:  *     Performs a completion query when given an incomplete
        !           658:  *     name.
        !           659:  *
        !           660:  *     Still under development.
        !           661:  *
        !           662:  *******************************************************************************
        !           663:  */
        !           664: 
        !           665: #if  notdef
        !           666: 
        !           667: int
        !           668: GetHostList(nsAddrPtr, queryType, name, defaultName, hostPtr)
        !           669:        struct in_addr  *nsAddrPtr;
        !           670:        int             queryType;
        !           671:        char            *name, *defaultName;
        !           672:        HostInfo        *hostPtr;
        !           673: {
        !           674:        int      n;
        !           675:        querybuf buf;
        !           676: 
        !           677:        n = res_mkquery(CQUERYM, name, C_IN, T_A, defaultName, 0, (char *)0,
        !           678:                (char *) &buf, sizeof(buf));
        !           679:        if (n < 0) {
        !           680:                if (_res.options & RES_DEBUG)
        !           681:                        printf("Res_mkquery failed\n");
        !           682:                return (ERROR);
        !           683:        }
        !           684:        return(GetAnswer( nsAddrPtr, queryType, (char *) &buf, n, 0, hostPtr));
        !           685: }
        !           686: #endif  notdef

unix.superglobalmegacorp.com

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