Annotation of 43BSDTahoe/etc/named/tools/nslookup/getinfo.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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