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

1.1     ! root        1: /*
        !             2:  *******************************************************************************
        !             3:  *  
        !             4:  *   main.c --
        !             5:  *  
        !             6:  *     Main routine and some action routines for the name server
        !             7:  *     lookup program.
        !             8:  *
        !             9:  *     Copyright (c) 1985 Regents of the University of California.
        !            10:  *     All rights reserved.  The Berkeley software License Agreement
        !            11:  *     specifies the terms and conditions for redistribution.
        !            12:  *
        !            13:  *     Andrew Cherenson        CS298-26  Fall 1985
        !            14:  *  
        !            15:  *******************************************************************************
        !            16:  */
        !            17: 
        !            18: #ifndef lint
        !            19: char copyright[] =
        !            20: "@(#) Copyright (c) 1985 Regents of the University of California.\n\
        !            21:  All rights reserved.\n";
        !            22: #endif not lint
        !            23: 
        !            24: #ifndef lint
        !            25: static char sccsid[] = "@(#)main.c     5.7 (Berkeley) 5/6/86";
        !            26: #endif not lint
        !            27: 
        !            28: #include <stdio.h>
        !            29: #include <strings.h>
        !            30: #include <sys/types.h>
        !            31: #include <netdb.h>
        !            32: #include <sys/socket.h>
        !            33: #include <netinet/in.h>
        !            34: #include <arpa/nameser.h>
        !            35: #include <resolv.h>
        !            36: #include <signal.h>
        !            37: #include <setjmp.h>
        !            38: #include "res.h"
        !            39: 
        !            40: /*
        !            41:  *  Location of the help file.
        !            42:  */
        !            43: 
        !            44: #define HELPFILE "/usr/local/nslookup.help"
        !            45: 
        !            46: 
        !            47: /*
        !            48:  *  Internet address of the current host.
        !            49:  */
        !            50: 
        !            51: #define LOCALHOST "127.0.0.1"
        !            52: 
        !            53: 
        !            54: /*
        !            55:  * Name of a top-level name server. Can be changed with 
        !            56:  * the "set root" command.
        !            57:  */
        !            58: 
        !            59: #define        ROOT_SERVER "sri-nic.arpa"
        !            60: char           rootServerName[NAME_LEN];
        !            61: 
        !            62: 
        !            63: /*
        !            64:  *  Import the state information from the resolver library.
        !            65:  */
        !            66: 
        !            67: extern struct state _res;
        !            68: 
        !            69: 
        !            70: /*
        !            71:  *  Info about the most recently queried host.
        !            72:  */
        !            73: 
        !            74: HostInfo       curHostInfo;
        !            75: int            curHostValid = FALSE;
        !            76: 
        !            77: 
        !            78: /*
        !            79:  *  Info about the default name server.
        !            80:  */
        !            81: 
        !            82: HostInfo       *defaultPtr = NULL;
        !            83: char           defaultServer[NAME_LEN];
        !            84: struct in_addr defaultAddr;
        !            85: 
        !            86: 
        !            87: /*
        !            88:  *  Initial name server query type is Address.
        !            89:  */
        !            90: 
        !            91: int            queryType = T_A;
        !            92: 
        !            93: /*
        !            94:  * Stuff for Interrupt (control-C) signal handler.
        !            95:  *  SockFD is the file descriptor for sockets used to
        !            96:  *  connect with the name servers. It has to be global to
        !            97:  *  allow the interrupt handler can close open sockets.
        !            98:  */
        !            99: 
        !           100: extern int     IntrHandler();
        !           101: int            sockFD = -1;
        !           102: FILE           *filePtr;
        !           103: jmp_buf        env;
        !           104: 
        !           105: 
        !           106: /*
        !           107:  *******************************************************************************
        !           108:  *
        !           109:  *  main --
        !           110:  *
        !           111:  *     Initializes the resolver library and determines the address
        !           112:  *     of the initial name server. The yylex routine is used to
        !           113:  *     read and perform commands.
        !           114:  *
        !           115:  *******************************************************************************
        !           116:  */
        !           117: 
        !           118: main(argc, argv)
        !           119:     int argc;
        !           120:     char **argv;
        !           121: {
        !           122:     int        result;
        !           123:     char       hostName[NAME_LEN];
        !           124:     char       *cp;
        !           125:     char       *find;
        !           126:     int                useLocalServer;
        !           127:     int                i;
        !           128:     struct hostent     *hp;
        !           129: 
        !           130:     /*
        !           131:      *  Initialize the resolver library routines.
        !           132:      */
        !           133: 
        !           134:     if (res_init() == -1) {
        !           135:        fprintf(stderr,"*** Can't find initialize resolver.\n");
        !           136:        exit(1);
        !           137:     }
        !           138: 
        !           139:     /*
        !           140:      *  Allocate space for the default server's host info and
        !           141:      *  find the server's address and name. If the resolver library
        !           142:      *  already has some addresses for a potential name server,
        !           143:      *  then use them. Otherwise, see if the current host has a server.
        !           144:      *  Command line arguments may override the choice of initial server. 
        !           145:      */
        !           146: 
        !           147:     defaultPtr = (HostInfo *) Calloc(1, sizeof(HostInfo));
        !           148: 
        !           149:     useLocalServer = FALSE;
        !           150:     if (argc != 0) {
        !           151:        find = *++argv;
        !           152:        if (argc == 3) {
        !           153:             /*
        !           154:              * Set explicit name server address.
        !           155:              *
        !           156:              */ 
        !           157:            _res.nscount = 1;
        !           158:            _res.nsaddr.sin_addr.s_addr = inet_addr(*++argv);
        !           159:            if (_res.nsaddr.sin_addr.s_addr == (unsigned)-1) {
        !           160:                hp = gethostbyname(*argv);
        !           161:                if (hp == NULL){
        !           162:                    hperror(hp);
        !           163:                    _res.nscount = 0;
        !           164:                     useLocalServer = TRUE;
        !           165:                } else {
        !           166:                    bcopy(hp->h_addr_list[0], &_res.nsaddr.sin_addr,
        !           167:                       hp->h_length);
        !           168:                    useLocalServer = FALSE;
        !           169:                } 
        !           170:            }
        !           171:         }
        !           172:        if (argc > 3) {
        !           173:            fprintf(stderr,
        !           174:                "Usage: nslookup findhost { servername | address }\n");
        !           175:            exit(1);
        !           176:        }
        !           177:     }
        !           178: 
        !           179: 
        !           180:     if (_res.nscount > 0 && !useLocalServer) {
        !           181:        for (i = 0; i < _res.nscount; i++) {
        !           182:            if (_res.nsaddr_list[i].sin_addr.s_addr == INADDR_ANY) {
        !           183:                useLocalServer = TRUE;
        !           184:                break;
        !           185:            } else {
        !           186:                result = FindHostInfo(&(_res.nsaddr_list[i].sin_addr), 
        !           187:                                    &(_res.nsaddr_list[i].sin_addr), 
        !           188:                                    sizeof(struct in_addr),
        !           189:                                    defaultPtr);
        !           190:                if (result != SUCCESS) {
        !           191:                    fprintf(stderr,
        !           192:                    "*** Can't find server name for address %s: %s\n", 
        !           193:                       inet_ntoa(_res.nsaddr_list[i].sin_addr), 
        !           194:                       DecodeError(result));
        !           195:                } else {
        !           196:                    defaultAddr = _res.nsaddr_list[i].sin_addr;
        !           197:                    break;
        !           198:                }
        !           199:            }
        !           200:        }
        !           201: 
        !           202:        /*
        !           203:         *  If we have exhausted the list, tell the user about the
        !           204:         *  command line argument to specify an address.
        !           205:         */
        !           206: 
        !           207:        if (i == _res.nscount) {
        !           208:            fprintf(stderr, 
        !           209:            "*** Default servers are not available\n");
        !           210:            exit(1);
        !           211:        }
        !           212: 
        !           213:     }
        !           214:     if (useLocalServer) {
        !           215: 
        !           216:        defaultAddr.s_addr = inet_addr(LOCALHOST);
        !           217:        gethostname(hostName, sizeof(hostName));
        !           218: 
        !           219:        result = GetHostInfo(&defaultAddr, T_A, hostName, defaultPtr);
        !           220:        if (result != SUCCESS) {
        !           221:            fprintf(stderr,
        !           222:                "*** Can't find initialize address for server %s: %s\n", 
        !           223:                            defaultServer, DecodeError(result));
        !           224:            exit(1);
        !           225:        }
        !           226:     }
        !           227:     strcpy(defaultServer, defaultPtr->name);
        !           228:     PrintHostInfo(stdout, "Default Server:", defaultPtr);
        !           229: 
        !           230:     strcpy(rootServerName, ROOT_SERVER);
        !           231: 
        !           232: /*
        !           233:     _res.options |= (RES_DEBUG | RES_DEBUG2);
        !           234:     _res.options |= RES_DEBUG;
        !           235:     _res.retry    = 2;
        !           236: */
        !           237:     _res.options &= ~RES_DEFNAMES;
        !           238: 
        !           239:     if (find) {
        !           240:        hp = gethostbyname(find);
        !           241:        if (hp == NULL) {
        !           242:            hperror(h_errno); 
        !           243:            exit(1);
        !           244:         }
        !           245:         printanswer(hp);
        !           246:        exit(0);
        !           247:     }
        !           248: 
        !           249:     /*
        !           250:      * Setup the environment to allow the interrupt handler to return here.
        !           251:      */
        !           252: 
        !           253:     (void) setjmp(env);
        !           254: 
        !           255:     /* 
        !           256:      * Return here after a longjmp.
        !           257:      */
        !           258: 
        !           259:     signal(SIGINT, IntrHandler);
        !           260: 
        !           261:     /*
        !           262:      * Read and evaluate commands. Yylex returns 0 when ^D or 'exit'
        !           263:      * is typed.
        !           264:      */
        !           265:     printf("> ");
        !           266:     while(yylex()) {
        !           267:        printf("> ");
        !           268:     }
        !           269: }
        !           270: 
        !           271: /*
        !           272:  *******************************************************************************
        !           273:  *
        !           274:  *  SetDefaultServer --
        !           275:  *
        !           276:  *     Changes the default name server to the one specified by
        !           277:  *     the first argument. The command "server name" uses the current 
        !           278:  *     default server to lookup the info for "name". The command
        !           279:  *     "lserver name" uses the original server to lookup "name".
        !           280:  *
        !           281:  *  Side effects:
        !           282:  *     This routine will cause a core dump if the allocation requests fail.
        !           283:  *
        !           284:  *  Results:
        !           285:  *     SUCCESS         The default server was changed successfully.
        !           286:  *     NONAUTH         The server was changed but addresses of
        !           287:  *                     other servers who know about the requested server
        !           288:  *                     were returned.
        !           289:  *     Errors          No info about the new server was found or
        !           290:  *                     requests to the current server timed-out.
        !           291:  *
        !           292:  *******************************************************************************
        !           293:  */
        !           294: 
        !           295: int
        !           296: SetDefaultServer(string, local)
        !           297:     char *string;
        !           298:     int         local;
        !           299: {
        !           300:     register HostInfo  *newDefPtr;
        !           301:     char               newServer[NAME_LEN];
        !           302:     int                result;
        !           303:     int                i;
        !           304: 
        !           305:     /*
        !           306:      *  Parse the command line. It maybe of the form "server name",
        !           307:      *  "lserver name" or just "name".
        !           308:      */
        !           309: 
        !           310:     if (local) {
        !           311:        i = sscanf(string, " lserver %s", newServer);
        !           312:     } else {
        !           313:        i = sscanf(string, " server %s", newServer);
        !           314:     }
        !           315:     if (i != 1) {
        !           316:        i = sscanf(string, " %s", newServer);
        !           317:        if (i != 1) {
        !           318:            fprintf(stderr,"SetDefaultServer: invalid name: %s\n",  string);
        !           319:            return(ERROR);
        !           320:        }
        !           321:     }
        !           322: 
        !           323:     /*
        !           324:      * Allocate space for a HostInfo variable for the new server. Don't
        !           325:      * overwrite the old HostInfo struct because info about the new server
        !           326:      * might not be found and we need to have valid default server info.
        !           327:      */
        !           328: 
        !           329:     newDefPtr = (HostInfo *) Calloc(1, sizeof(HostInfo));
        !           330: 
        !           331: 
        !           332:     /*
        !           333:      * A 'local' lookup uses the original server that the program was
        !           334:      *  initialized with.
        !           335:      */
        !           336: 
        !           337:     if (local) {
        !           338:        result = GetHostInfo(&defaultAddr, T_A, newServer, newDefPtr);
        !           339:     } else {
        !           340: 
        !           341:        /*
        !           342:         *  Check to see if we have the address of the server or the
        !           343:         *      address of a server who knows about this domain.
        !           344:         *
        !           345:         *  For now, just use the first address in the list.
        !           346:         */
        !           347:        if (defaultPtr->addrList == NULL) {
        !           348:            result = GetHostInfo(
        !           349:                        (struct in_addr *) defaultPtr->servers[0]->addrList[0], 
        !           350:                            T_A, newServer, newDefPtr);
        !           351:        } else {
        !           352:            result = GetHostInfo((struct in_addr *) defaultPtr->addrList[0], 
        !           353:                            T_A, newServer, newDefPtr);
        !           354:        }
        !           355:     }
        !           356: 
        !           357:     if (result == SUCCESS || result == NONAUTH) {
        !           358:            /*
        !           359:             *  Found info about the new server. Free the resources for
        !           360:             *  the old server.
        !           361:             */
        !           362: 
        !           363:            FreeHostInfoPtr(defaultPtr);
        !           364:            free((char *)defaultPtr);
        !           365:            defaultPtr = newDefPtr;
        !           366:            strcpy(defaultServer, defaultPtr->name);
        !           367:            PrintHostInfo(stdout, "Default Server:", defaultPtr);
        !           368:            return(SUCCESS);
        !           369:     } else {
        !           370:            fprintf(stderr, "*** Can't find address for server %s: %s\n",
        !           371:                    newServer, DecodeError(result));
        !           372:            free((char *)newDefPtr);
        !           373: 
        !           374:            return(result);
        !           375:     }
        !           376: }
        !           377: 
        !           378: /*
        !           379:  *******************************************************************************
        !           380:  *
        !           381:  *  LookupHost --
        !           382:  *
        !           383:  *     Asks the default name server for information about the
        !           384:  *     specified host or domain. The information is printed
        !           385:  *     if the lookup was successful.
        !           386:  *
        !           387:  *  Results:
        !           388:  *     SUCCESS         - the lookup was successful.
        !           389:  *     ERROR           - the output file could not be opened.
        !           390:  *     Misc. Errors    - an error message is printed if the lookup failed.
        !           391:  *
        !           392:  *******************************************************************************
        !           393:  */
        !           394: 
        !           395: int
        !           396: LookupHost(string, putToFile)
        !           397:     char *string;
        !           398:     int  putToFile;
        !           399: {
        !           400:     char       host[NAME_LEN];
        !           401:     char       file[NAME_LEN];
        !           402:     int                result;
        !           403: 
        !           404:     /*
        !           405:      *  Invalidate the current host information to prevent Finger 
        !           406:      *  from using bogus info.
        !           407:      */
        !           408: 
        !           409:     curHostValid = FALSE;
        !           410: 
        !           411:     /*
        !           412:      *  Parse the command string into the host and
        !           413:      *  optional output file name.
        !           414:      *
        !           415:      */
        !           416: 
        !           417:     sscanf(string, " %s", host);       /* removes white space */
        !           418:     if (!putToFile) {
        !           419:        filePtr = stdout;
        !           420:     } else {
        !           421:        filePtr = OpenFile(string, file);
        !           422:        if (filePtr == NULL) {
        !           423:            fprintf(stderr, "*** Can't open %s for writing\n", file);
        !           424:            return(ERROR);
        !           425:        }
        !           426:        fprintf(filePtr,"> %s\n", string);
        !           427:     }
        !           428: 
        !           429:     PrintHostInfo(filePtr, "Server:", defaultPtr);
        !           430: 
        !           431:     /*
        !           432:      *  Check to see if we have the address of the server or the
        !           433:      * address of a server who knows about this domain.
        !           434:      *
        !           435:      *  For now, just use the first address in the list.
        !           436:      */
        !           437: 
        !           438:     if (defaultPtr->addrList == NULL) {
        !           439:        result = GetHostInfo(
        !           440:                    (struct in_addr *) defaultPtr->servers[0]->addrList[0], 
        !           441:                          queryType, host, &curHostInfo);
        !           442:     } else {
        !           443:        result = GetHostInfo((struct in_addr *) defaultPtr->addrList[0], 
        !           444:                          queryType, host, &curHostInfo);
        !           445:     }
        !           446: 
        !           447:     switch(result) {
        !           448:        case SUCCESS:
        !           449:            /*
        !           450:             *  If the query was for an address, then the curHostInfo
        !           451:             *  variable can be used by Finger.
        !           452:             *  There's no need to print anything for other query types
        !           453:             *  because the info has already been printed.
        !           454:             */
        !           455:            if (queryType == T_A) {
        !           456:                curHostValid = TRUE;
        !           457:                PrintHostInfo(filePtr, "Name:", &curHostInfo);
        !           458:            }
        !           459:            break;
        !           460: 
        !           461:        /*
        !           462:         * No Authoritative answer was available but we got names
        !           463:         * of servers who know about the host.
        !           464:         */
        !           465:        case NONAUTH:
        !           466:            PrintHostInfo(filePtr, "Name:", &curHostInfo);
        !           467:            break;
        !           468: 
        !           469:        case NO_INFO:
        !           470:            fprintf(stderr, "*** No %s information is available for %s\n", 
        !           471:                        DecodeType(queryType), host);
        !           472:            break;
        !           473: 
        !           474:        case TIME_OUT:
        !           475:            fprintf(stderr, "*** Request to %s timed-out\n", defaultServer);
        !           476:            break;
        !           477: 
        !           478:        default:
        !           479:            fprintf(stderr, "*** %s can't find %s: %s\n", defaultServer, host,
        !           480:                    DecodeError(result));
        !           481:     }
        !           482:     if (putToFile) {
        !           483:        fclose(filePtr);
        !           484:        filePtr = NULL;
        !           485:     }
        !           486:     return(result);
        !           487: }
        !           488: 
        !           489: /*
        !           490:  *******************************************************************************
        !           491:  *
        !           492:  *  LookupHostWithServer --
        !           493:  *
        !           494:  *     Asks the name server specified in the second argument for 
        !           495:  *     information about the host or domain specified in the first
        !           496:  *     argument. The information is printed if the lookup was successful.
        !           497:  *
        !           498:  *     Address info about the requested name server is obtained
        !           499:  *     from the default name server. This routine will return an
        !           500:  *     error if the default server doesn't have info about the 
        !           501:  *     requested server. Thus an error return status might not
        !           502:  *     mean the requested name server doesn't have info about the
        !           503:  *     requested host.
        !           504:  *
        !           505:  *     Comments from LookupHost apply here, too.
        !           506:  *
        !           507:  *  Results:
        !           508:  *     SUCCESS         - the lookup was successful.
        !           509:  *     ERROR           - the output file could not be opened.
        !           510:  *     Misc. Errors    - an error message is printed if the lookup failed.
        !           511:  *
        !           512:  *******************************************************************************
        !           513:  */
        !           514: 
        !           515: int
        !           516: LookupHostWithServer(string, putToFile)
        !           517:     char *string;
        !           518:     int  putToFile;
        !           519: {
        !           520:     char       file[NAME_LEN];
        !           521:     char       host[NAME_LEN];
        !           522:     char       server[NAME_LEN];
        !           523:     int        result;
        !           524:     static HostInfo serverInfo;
        !           525: 
        !           526:     curHostValid = FALSE;
        !           527: 
        !           528:     sscanf(string, " %s %s", host, server);
        !           529:     if (!putToFile) {
        !           530:        filePtr = stdout;
        !           531:     } else {
        !           532:        filePtr = OpenFile(string, file);
        !           533:        if (filePtr == NULL) {
        !           534:            fprintf(stderr, "*** Can't open %s for writing\n", file);
        !           535:            return(ERROR);
        !           536:        }
        !           537:        fprintf(filePtr,"> %s\n", string);
        !           538:     }
        !           539:     
        !           540: 
        !           541:     if (defaultPtr->addrList == NULL) {
        !           542:        result = GetHostInfo(
        !           543:                        (struct in_addr *) defaultPtr->servers[0]->addrList[0], 
        !           544:                                T_A, server, &serverInfo);
        !           545:     } else {
        !           546:        result = GetHostInfo((struct in_addr *) defaultPtr->addrList[0], 
        !           547:                                T_A, server, &serverInfo);
        !           548:     }
        !           549: 
        !           550:     if (result != SUCCESS) {
        !           551:        fprintf(stderr,"*** Can't find address for server %s: %s\n", server,
        !           552:                 DecodeError(result));
        !           553:     } else {
        !           554:        PrintHostInfo(filePtr, "Server:", &serverInfo);
        !           555: 
        !           556:        if (serverInfo.addrList == NULL) {
        !           557:            result = GetHostInfo(
        !           558:                        (struct in_addr *) serverInfo.servers[0]->addrList[0], 
        !           559:                              queryType, host, &curHostInfo);
        !           560:        } else {
        !           561:            result = GetHostInfo((struct in_addr *) serverInfo.addrList[0], 
        !           562:                              queryType, host, &curHostInfo);
        !           563:        }
        !           564: 
        !           565: 
        !           566:        switch(result) {
        !           567: 
        !           568:            case SUCCESS:
        !           569:                if (queryType == T_A) {
        !           570:                    curHostValid = TRUE;
        !           571:                    PrintHostInfo(filePtr, "Name:", &curHostInfo);
        !           572:                }
        !           573:                break;
        !           574: 
        !           575:            case NONAUTH:
        !           576:                PrintHostInfo(filePtr, "Name:", &curHostInfo);
        !           577:                break;
        !           578: 
        !           579:            case NO_INFO:
        !           580:                fprintf(stderr, "*** No %s information is available for %s\n", 
        !           581:                        DecodeType(queryType), host);
        !           582:                break;
        !           583: 
        !           584:            case TIME_OUT:
        !           585:                fprintf(stderr, "*** Request to %s timed-out\n", server);
        !           586:                break;
        !           587: 
        !           588:            default:
        !           589:                fprintf(stderr, "*** %s can't find %s: %s\n", server, host,
        !           590:                        DecodeError(result));
        !           591:        }
        !           592:     }
        !           593:     if (putToFile) {
        !           594:        fclose(filePtr);
        !           595:        filePtr = NULL;
        !           596:     }
        !           597:     return(result);
        !           598: }
        !           599: 
        !           600: /*
        !           601:  *******************************************************************************
        !           602:  *
        !           603:  *  SetOption -- 
        !           604:  *
        !           605:  *     This routine is used to change the state information
        !           606:  *     that affect the lookups. The command format is
        !           607:  *        set keyword[=value]
        !           608:  *     Most keywords can be abbreviated. Parsing is very simplistic--
        !           609:  *     A value must not be separated from its keyword by white space.
        !           610:  *
        !           611:  *     Valid keywords:         Meaning:
        !           612:  *     [no]aaonly              authoritative query only or not (hidden).
        !           613:  *     all                     lists current values of options.
        !           614:  *     ALL                     lists current values of options, including
        !           615:  *                               hidden options.
        !           616:  *     [no]d2                  turn on/off extra debugging mode (hidden).
        !           617:  *     [no]debug               turn on/off debugging mode.
        !           618:  *     [no]defname             use/don't use default domain name.
        !           619:  *     domain=NAME             set default domain name to NAME.
        !           620:  *     [no]ignore              ignore/don't ignore trunc. errors (hidden).
        !           621:  *     [no]primary             use/don't use primary server (hidden).
        !           622:  *     query=value             set default query type to value,
        !           623:  *                             value is one of the query types in RFC883
        !           624:  *                             without the leading T_. (e.g. A, HINFO)
        !           625:  *     [no]recurse             use/don't use recursive lookup.
        !           626:  *     retry=#                 set number of retries to #.
        !           627:  *     root=NAME               change root server to NAME.
        !           628:  *     time=#                  set timeout length to #.
        !           629:  *     [no]vc                  use/don't use virtual circuit.
        !           630:  *
        !           631:  *  Results:
        !           632:  *     SUCCESS         the command was parsed correctly.
        !           633:  *     ERROR           the command was not parsed correctly.
        !           634:  *
        !           635:  *******************************************************************************
        !           636:  */
        !           637: 
        !           638: int
        !           639: SetOption(string)
        !           640:     char *string;
        !           641: {
        !           642:     char       option[NAME_LEN];
        !           643:     char       type[NAME_LEN];
        !           644:     char       *ptr;
        !           645:     int        i;
        !           646: 
        !           647:     i = sscanf(string, " set %s", option);
        !           648:     if (i != 1) {
        !           649:        fprintf(stderr, "*** Invalid option: %s\n",  option);
        !           650:        return(ERROR);
        !           651:     } else {
        !           652:        if (strncmp(option, "all", 3) == 0) {
        !           653:            ShowOptions(FALSE);
        !           654:        } else if (strncmp(option, "ALL", 3) == 0) {
        !           655:            ShowOptions(TRUE);
        !           656:        } else if (strncmp(option, "aa", 2) == 0) {     /* aaonly */
        !           657:            _res.options |= RES_AAONLY;
        !           658:        } else if (strncmp(option, "noaa", 4) == 0) {
        !           659:            _res.options &= ~RES_AAONLY;
        !           660:        } else if (strncmp(option, "deb", 3) == 0) {    /* debug */
        !           661:            _res.options |= RES_DEBUG;
        !           662:        } else if (strncmp(option, "nodeb", 5) == 0) {
        !           663:            _res.options &= ~(RES_DEBUG | RES_DEBUG2);
        !           664:        } else if (strncmp(option, "d2", 2) == 0) {     /* d2 (more debug) */
        !           665:            _res.options |= (RES_DEBUG | RES_DEBUG2);
        !           666:        } else if (strncmp(option, "nod2", 4) == 0) {
        !           667:            _res.options &= ~RES_DEBUG2;
        !           668:        } else if (strncmp(option, "def", 3) == 0) {    /* defname */
        !           669:            _res.options |= RES_DEFNAMES;
        !           670:        } else if (strncmp(option, "nodef", 5) == 0) {
        !           671:            _res.options &= ~RES_DEFNAMES;
        !           672:        } else if (strncmp(option, "do", 2) == 0) {     /* domain */
        !           673:            ptr = index(option, '=');
        !           674:            if (ptr != NULL) {
        !           675:                sscanf(++ptr, "%s", _res.defdname);
        !           676:            }
        !           677:        } else if (strncmp(option, "i", 1) == 0) {      /* ignore */
        !           678:            _res.options |= RES_IGNTC;
        !           679:        } else if (strncmp(option, "noi", 3) == 0) {
        !           680:            _res.options &= ~RES_IGNTC;
        !           681:        } else if (strncmp(option, "p", 1) == 0) {      /* primary */
        !           682:            _res.options |= RES_PRIMARY;
        !           683:        } else if (strncmp(option, "nop", 3) == 0) {
        !           684:            _res.options &= ~RES_PRIMARY;
        !           685:        } else if (strncmp(option, "q", 1) == 0) {      /* querytype */
        !           686:            ptr = index(option, '=');
        !           687:            if (ptr != NULL) {
        !           688:                sscanf(++ptr, "%s", type);
        !           689:                queryType = StringToType(type);
        !           690:            }
        !           691:        } else if (strncmp(option, "rec", 3) == 0) {    /* recurse */
        !           692:            _res.options |= RES_RECURSE;
        !           693:        } else if (strncmp(option, "norec", 5) == 0) {
        !           694:            _res.options &= ~RES_RECURSE;
        !           695:        } else if (strncmp(option, "ret", 3) == 0) {    /* retry */
        !           696:            ptr = index(option, '=');
        !           697:            if (ptr != NULL) {
        !           698:                sscanf(++ptr, "%d", &_res.retry);
        !           699:            }
        !           700:        } else if (strncmp(option, "ro", 2) == 0) {     /* root */
        !           701:            ptr = index(option, '=');
        !           702:            if (ptr != NULL) {
        !           703:                sscanf(++ptr, "%s", rootServerName);
        !           704:            }
        !           705:        } else if (strncmp(option, "t", 1) == 0) {      /* timeout */
        !           706:            ptr = index(option, '=');
        !           707:            if (ptr != NULL) {
        !           708:                sscanf(++ptr, "%d", &_res.retrans);
        !           709:            }
        !           710:        } else if (strncmp(option, "v", 1) == 0) {      /* vc */
        !           711:            _res.options |= RES_USEVC;
        !           712:        } else if (strncmp(option, "nov", 3) == 0) {
        !           713:            _res.options &= ~RES_USEVC;
        !           714:        } else {
        !           715:            fprintf(stderr, "*** Invalid option: %s\n",  option);
        !           716:            return(ERROR);
        !           717:        }
        !           718:     }
        !           719:     return(SUCCESS);
        !           720: }
        !           721: 
        !           722: /*
        !           723:  *******************************************************************************
        !           724:  *
        !           725:  *  ShowOptions --
        !           726:  *
        !           727:  *     Prints out the state information used by the resolver
        !           728:  *     library and other options set by the user.
        !           729:  *
        !           730:  *******************************************************************************
        !           731:  */
        !           732: 
        !           733: void
        !           734: ShowOptions(special)
        !           735:     int special;
        !           736: {
        !           737:     int i;
        !           738: 
        !           739:     PrintHostInfo(stdout, "Default Server:", defaultPtr);
        !           740:     if (curHostValid) {
        !           741:        PrintHostInfo(stdout, "Host:", &curHostInfo);
        !           742:     }
        !           743: 
        !           744:     printf("Set options:\n");
        !           745:     printf("  %sdebug\t", (_res.options & RES_DEBUG) ? "" : "no");
        !           746:     printf("  %sdefname\t", (_res.options & RES_DEFNAMES) ? "" : "no");
        !           747:     printf("  %srecurse\t", (_res.options & RES_RECURSE) ? "" : "no");
        !           748:     printf("  %svc\n", (_res.options & RES_USEVC) ? "" : "no");
        !           749: 
        !           750:     if (special) {
        !           751:        printf("  %saa\t", (_res.options & RES_AAONLY) ? "" : "no");
        !           752:        printf("  %sd2\t", (_res.options & RES_DEBUG2) ? "" : "no");
        !           753:        printf("  %signoretc\t", (_res.options & RES_IGNTC) ? "" : "no");
        !           754:        printf("  %sprimary\n", (_res.options & RES_PRIMARY) ? "" : "no");
        !           755:     }
        !           756: 
        !           757:     printf("  querytype=%s\t", p_type(queryType));
        !           758:     printf("  timeout=%d\t", _res.retrans);
        !           759:     printf("  retry=%d\n", _res.retry);
        !           760:     printf("  domain=%s\n", _res.defdname);
        !           761:     printf("  root=%s\n", rootServerName);
        !           762: 
        !           763:     if (special) {
        !           764:        printf("\n");
        !           765:        printf("State info:\n");
        !           766:        printf("  current packet id:       %d\n", _res.id);
        !           767:        printf("  number of name servers:  %d\n", _res.nscount);
        !           768:        printf("  name server addresses:   %s\n",
        !           769:                                    inet_ntoa(_res.nsaddr_list[0].sin_addr));
        !           770:        for (i = 1; i < _res.nscount; i++) {
        !           771:            printf("                           %s\n", 
        !           772:                    inet_ntoa(_res.nsaddr_list[i].sin_addr));
        !           773:        }
        !           774:     }
        !           775: }
        !           776: 
        !           777: /*
        !           778:  *******************************************************************************
        !           779:  *
        !           780:  *  PrintHelp --
        !           781:  *
        !           782:  *     Prints out the help file.
        !           783: *      (Code taken from Mail.)
        !           784:  *
        !           785:  *******************************************************************************
        !           786:  */
        !           787: 
        !           788: void
        !           789: PrintHelp()
        !           790: {
        !           791:        register char c;
        !           792:        register FILE *filePtr;
        !           793: 
        !           794:        if ((filePtr = fopen(HELPFILE, "r")) == NULL) {
        !           795:            perror(HELPFILE);
        !           796:            return;
        !           797:        } 
        !           798:        while ((c = getc(filePtr)) != EOF) {
        !           799:            putchar(c);
        !           800:        }
        !           801:        fclose(filePtr);
        !           802: }

unix.superglobalmegacorp.com

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