Annotation of 43BSDTahoe/etc/named/tools/nslookup/subr.c, revision 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[] = "@(#)subr.c     5.9 (Berkeley) 2/17/88";
        !            15: #endif /* not lint */
        !            16: 
        !            17: /*
        !            18:  *******************************************************************************
        !            19:  *
        !            20:  *  subr.c --
        !            21:  *
        !            22:  *     Miscellaneous subroutines for the name server 
        !            23:  *     lookup program.
        !            24:  *  
        !            25:  *     Copyright (c) 1985 
        !            26:  *     Andrew Cherenson
        !            27:  *     CS298-26  Fall 1985
        !            28:  *
        !            29:  *******************************************************************************
        !            30:  */
        !            31: 
        !            32: #include <stdio.h>
        !            33: #include <strings.h>
        !            34: #include <sys/types.h>
        !            35: #include <netdb.h>
        !            36: #include <sys/socket.h>
        !            37: #include <netinet/in.h>
        !            38: #include <arpa/nameser.h>
        !            39: #include <signal.h>
        !            40: #include <setjmp.h>
        !            41: #include "res.h"
        !            42: 
        !            43: 
        !            44: 
        !            45: /*
        !            46:  *******************************************************************************
        !            47:  *
        !            48:  *  IntrHandler --
        !            49:  *
        !            50:  *     This routine is called whenever a control-C is typed. 
        !            51:  *     It performs three main functions:
        !            52:  *      - close an open socket connection.
        !            53:  *      - close an open output file (used by LookupHost, et al.)
        !            54:  *      - jump back to the main read-eval loop.
        !            55:  *             
        !            56:  *     Since a user may type a ^C in the middle of a routine that
        !            57:  *     is using a socket, the socket would never get closed by the 
        !            58:  *     routine. To prevent an overflow of the process's open file table,
        !            59:  *     the socket and output file descriptors are closed by
        !            60:  *     the interrupt handler.
        !            61:  *
        !            62:  *  Side effects:
        !            63:  *     If sockFD is valid, its socket is closed.
        !            64:  *     If filePtr is valid, its file is closed.
        !            65:  *     Flow of control returns to the main() routine.
        !            66:  *
        !            67:  *******************************************************************************
        !            68:  */
        !            69: 
        !            70: int
        !            71: IntrHandler()
        !            72: {
        !            73:     extern jmp_buf env;
        !            74: 
        !            75:     if (sockFD >= 0) {
        !            76:        close(sockFD);
        !            77:        sockFD = -1;
        !            78:     }
        !            79:     if (filePtr != NULL && filePtr != stdout) {
        !            80:        fclose(filePtr);
        !            81:        filePtr = NULL;
        !            82:     }
        !            83:     printf("\n");
        !            84:     longjmp(env, 1);
        !            85: }
        !            86: 
        !            87: 
        !            88: /*
        !            89:  *******************************************************************************
        !            90:  *
        !            91:  *  Calloc --
        !            92:  *
        !            93:  *      Calls the calloc library routine with the interrupt
        !            94:  *      signal blocked.  The interrupt signal blocking is done
        !            95:  *      to prevent malloc from getting confused if a
        !            96:  *      control-C arrives in the middle of its bookkeeping
        !            97:  *      routines.  We need to do this because a control-C
        !            98:  *      causes a return to the main command loop instead
        !            99:  *      causing the program to die.
        !           100:  *
        !           101:  *     This method doesn't prevent the pointer returned
        !           102:  *     by calloc from getting lost, so it is possible
        !           103:  *     to get "core leaks".
        !           104:  *
        !           105:  *  Results:
        !           106:  *     (address)       - address of new buffer.
        !           107:  *     NULL            - calloc failed.
        !           108:  *
        !           109:  *******************************************************************************
        !           110:  */
        !           111: 
        !           112: char *
        !           113: Calloc(num, size)
        !           114:     unsigned num, size;
        !           115: {
        !           116:        char    *ptr;
        !           117:        int     saveMask;
        !           118:        extern char *calloc();
        !           119: 
        !           120:        saveMask = sigblock(1 << (SIGINT-1));
        !           121:        ptr = calloc(num, size);
        !           122:        (void) sigsetmask(saveMask);
        !           123:        if (ptr == NULL) {
        !           124:            fflush(stdout);
        !           125:            fprintf(stderr, "Calloc failed\n");
        !           126:            fflush(stderr);
        !           127:            abort();
        !           128:            /*NOTREACHED*/
        !           129:        } else {
        !           130:            return(ptr);
        !           131:        }
        !           132: }
        !           133: 
        !           134: /*
        !           135:  *******************************************************************************
        !           136:  *
        !           137:  *  PrintHostInfo --
        !           138:  *
        !           139:  *     Prints out the HostInfo structure for a host.
        !           140:  *
        !           141:  *******************************************************************************
        !           142:  */
        !           143: 
        !           144: void
        !           145: PrintHostInfo(file, title, hp)
        !           146:        FILE    *file;
        !           147:        char    *title;
        !           148:        register HostInfo *hp;
        !           149: {
        !           150:        register char           **cp;
        !           151:        register ServerInfo     **sp;
        !           152:        char                    comma;
        !           153:        int                     i;
        !           154: 
        !           155:        fprintf(file, "%-7s  %s\n", title, hp->name);
        !           156: 
        !           157:        if (hp->addrList != NULL) {
        !           158:            if (hp->addrList[1] != NULL) {
        !           159:                fprintf(file, "Addresses:");
        !           160:            } else {
        !           161:                fprintf(file, "Address:");
        !           162:            }
        !           163:            comma = ' ';
        !           164:            i = 0;
        !           165:            for (cp = hp->addrList; cp && *cp; cp++) {
        !           166:                i++;
        !           167:                if (i > 4) {
        !           168:                    fprintf(file, "\n\t");
        !           169:                    comma = ' ';
        !           170:                    i = 0;
        !           171:                }
        !           172:                fprintf(file,"%c %s", comma, inet_ntoa(*(struct in_addr *)*cp));
        !           173:                comma = ',';
        !           174:            }
        !           175:        }
        !           176: 
        !           177:        if (hp->aliases != NULL) {
        !           178:            fprintf(file, "\nAliases:");
        !           179:            comma = ' ';
        !           180:            i = 10;
        !           181:            for (cp = hp->aliases; cp && *cp && **cp; cp++) {
        !           182:                i += strlen(*cp) + 2;
        !           183:                if (i > 75) {
        !           184:                    fprintf(file, "\n\t");
        !           185:                    comma = ' ';
        !           186:                    i = 10;
        !           187:                }
        !           188:                fprintf(file, "%c %s", comma, *cp);
        !           189:                comma = ',';
        !           190:            }
        !           191:        }
        !           192: 
        !           193:        if (hp->servers != NULL) {
        !           194:            fprintf(file, "Served by:\n");
        !           195:            for (sp = hp->servers; *sp != NULL ; sp++) {
        !           196: 
        !           197:                fprintf(file, "- %s\n\t",  (*sp)->name);
        !           198: 
        !           199:                comma = ' ';
        !           200:                i = 0;
        !           201:                for (cp = (*sp)->addrList; cp && *cp && **cp; cp++) {
        !           202:                    i++;
        !           203:                    if (i > 4) {
        !           204:                        fprintf(file, "\n\t");
        !           205:                        comma = ' ';
        !           206:                        i = 0;
        !           207:                    }
        !           208:                    fprintf(file, 
        !           209:                        "%c %s", comma, inet_ntoa(*(struct in_addr *)*cp));
        !           210:                    comma = ',';
        !           211:                }
        !           212:                fprintf(file, "\n\t");
        !           213: 
        !           214:                comma = ' ';
        !           215:                i = 10;
        !           216:                for (cp = (*sp)->domains; cp && *cp && **cp; cp++) {
        !           217:                    i += strlen(*cp) + 2;
        !           218:                    if (i > 75) {
        !           219:                        fprintf(file, "\n\t");
        !           220:                        comma = ' ';
        !           221:                        i = 10;
        !           222:                    }
        !           223:                    fprintf(file, "%c %s", comma, *cp);
        !           224:                    comma = ',';
        !           225:                }
        !           226:                fprintf(file, "\n");
        !           227:            }
        !           228:        }
        !           229: 
        !           230:        fprintf(file, "\n\n");
        !           231: }
        !           232: 
        !           233: /*
        !           234:  *******************************************************************************
        !           235:  *
        !           236:  *  OpenFile --
        !           237:  *
        !           238:  *     Parses a command string for a file name and opens
        !           239:  *     the file.
        !           240:  *
        !           241:  *  Results:
        !           242:  *     file pointer    - the open was successful.
        !           243:  *     NULL            - there was an error opening the file or
        !           244:  *                       the input string was invalid.
        !           245:  *
        !           246:  *******************************************************************************
        !           247:  */
        !           248: 
        !           249: FILE *
        !           250: OpenFile(string, file)
        !           251:     char *string;
        !           252:     char *file;
        !           253: {
        !           254:        char    *redirect;
        !           255:        FILE    *tmpPtr;
        !           256: 
        !           257:        /*
        !           258:         *  Open an output file if we see '>' or >>'.
        !           259:         *  Check for overwrite (">") or concatenation (">>").
        !           260:         */
        !           261: 
        !           262:        redirect = index(string, '>');
        !           263:        if (redirect == NULL) {
        !           264:            return(NULL);
        !           265:        }
        !           266:        if (redirect[1] == '>') {
        !           267:            sscanf(redirect, ">> %s", file);
        !           268:            tmpPtr = fopen(file, "a+");
        !           269:        } else {
        !           270:            sscanf(redirect, "> %s", file);
        !           271:            tmpPtr = fopen(file, "w");
        !           272:        }
        !           273: 
        !           274:        if (tmpPtr != NULL) {
        !           275:            redirect[0] = '\0';
        !           276:        }
        !           277: 
        !           278:        return(tmpPtr);
        !           279: }
        !           280: 
        !           281: /*
        !           282:  *******************************************************************************
        !           283:  *
        !           284:  *  DecodeError --
        !           285:  *
        !           286:  *     Converts an error code into a character string.
        !           287:  *
        !           288:  *******************************************************************************
        !           289:  */
        !           290: 
        !           291: char *
        !           292: DecodeError(result)
        !           293:     int result;
        !           294: {
        !           295:        switch(result) {
        !           296:            case NOERROR:       return("Success"); break;
        !           297:            case FORMERR:       return("Format error"); break;
        !           298:            case SERVFAIL:      return("Server failed"); break;
        !           299:            case NXDOMAIN:      return("Non-existent domain"); break;
        !           300:            case NOTIMP:        return("Not implemented"); break;
        !           301:            case REFUSED:       return("Query refused"); break;
        !           302:            case NOCHANGE:      return("No change"); break;
        !           303:            case NO_INFO:       return("No information"); break;
        !           304:            case ERROR:         return("Unspecified error"); break;
        !           305:            case TIME_OUT:      return("Timed out"); break;
        !           306:            case NONAUTH:       return("Non-authoritative answer"); break;
        !           307:            default:            break;
        !           308:        }
        !           309:        return("BAD ERROR VALUE"); 
        !           310: }
        !           311: 
        !           312: int
        !           313: StringToClass(class, dflt)
        !           314:     char *class;
        !           315:     int dflt;
        !           316: {
        !           317:        if (strcasecmp(class, "IN") == 0)
        !           318:                return(C_IN);
        !           319:        if (strcasecmp(class, "CHAOS") == 0)
        !           320:                return(C_CHAOS);
        !           321:        if (strcasecmp(class, "ANY") == 0)
        !           322:                return(C_ANY);
        !           323:        fprintf(stderr, "unknown query class: %s\n", class);
        !           324:        return(dflt);
        !           325: }
        !           326: /*
        !           327:  *******************************************************************************
        !           328:  *
        !           329:  *  StringToType --
        !           330:  *
        !           331:  *     Converts a string form of a query type name to its 
        !           332:  *     corresponding integer value.
        !           333:  *
        !           334:  *******************************************************************************
        !           335:  */
        !           336: 
        !           337: int
        !           338: StringToType(type, dflt)
        !           339:     char *type;
        !           340:     int dflt;
        !           341: {
        !           342:        if (strcasecmp(type, "A") == 0)
        !           343:                return(T_A);
        !           344:        if (strcasecmp(type, "NS") == 0)
        !           345:                return(T_NS);                   /* authoritative server */
        !           346:        if (strcasecmp(type, "MX") == 0)
        !           347:                return(T_MX);                   /* mail exchanger */
        !           348:        if (strcasecmp(type, "CNAME") == 0)
        !           349:                return(T_CNAME);                /* canonical name */
        !           350:        if (strcasecmp(type, "SOA") == 0)
        !           351:                return(T_SOA);                  /* start of authority zone */
        !           352:        if (strcasecmp(type, "MB") == 0)
        !           353:                return(T_MB);                   /* mailbox domain name */
        !           354:        if (strcasecmp(type, "MG") == 0)
        !           355:                return(T_MG);                   /* mail group member */
        !           356:        if (strcasecmp(type, "MR") == 0)
        !           357:                return(T_MR);                   /* mail rename name */
        !           358:        if (strcasecmp(type, "WKS") == 0)
        !           359:                return(T_WKS);                  /* well known service */
        !           360:        if (strcasecmp(type, "PTR") == 0)
        !           361:                return(T_PTR);                  /* domain name pointer */
        !           362:        if (strcasecmp(type, "HINFO") == 0)
        !           363:                return(T_HINFO);                /* host information */
        !           364:        if (strcasecmp(type, "MINFO") == 0)
        !           365:                return(T_MINFO);                /* mailbox information */
        !           366:        if (strcasecmp(type, "AXFR") == 0)
        !           367:                return(T_AXFR);                 /* zone transfer */
        !           368:        if (strcasecmp(type, "MAILB") == 0)
        !           369:                return(T_MAILB);                /* mail box */
        !           370:        if (strcasecmp(type, "ANY") == 0)
        !           371:                return(T_ANY);                  /* matches any type */
        !           372:        if (strcasecmp(type, "UINFO") == 0)
        !           373:                return(T_UINFO);                /* user info */
        !           374:        if (strcasecmp(type, "UID") == 0)
        !           375:                return(T_UID);                  /* user id */
        !           376:        if (strcasecmp(type, "GID") == 0)
        !           377:                return(T_GID);                  /* group id */
        !           378:        fprintf(stderr, "unknown query type: %s\n", type);
        !           379:        return(dflt);
        !           380: }
        !           381: 
        !           382: /*
        !           383:  *******************************************************************************
        !           384:  *
        !           385:  *  DecodeType --
        !           386:  *
        !           387:  *     Converts a query type to a descriptive name.
        !           388:  *     (A more verbose form of p_type.)
        !           389:  *
        !           390:  *
        !           391:  *******************************************************************************
        !           392:  */
        !           393: 
        !           394: static  char nbuf[20];
        !           395: 
        !           396: char *
        !           397: DecodeType(type)
        !           398:        int type;
        !           399: {
        !           400:        switch (type) {
        !           401:        case T_A:
        !           402:                return("address");
        !           403:        case T_NS:
        !           404:                return("name server");
        !           405:        case T_MX:              
        !           406:                return("mail exchanger");
        !           407:        case T_CNAME:           
        !           408:                return("cannonical name");
        !           409:        case T_SOA:             
        !           410:                return("start of authority zone");
        !           411:        case T_MB:              
        !           412:                return("mailbox domain name");
        !           413:        case T_MG:              
        !           414:                return("mail group member");
        !           415:        case T_MR:              
        !           416:                return("mail rename name");
        !           417:        case T_NULL:            
        !           418:                return("null resource record");
        !           419:        case T_WKS:             
        !           420:                return("well known service");
        !           421:        case T_PTR:             
        !           422:                return("domain name pointer");
        !           423:        case T_HINFO:           
        !           424:                return("host");
        !           425:        case T_MINFO:           
        !           426:                return("mailbox (MINFO)");
        !           427:        case T_AXFR:            
        !           428:                return("zone transfer");
        !           429:        case T_MAILB:           
        !           430:                return("mail box");
        !           431:        case T_ANY:             
        !           432:                return("any type");
        !           433:        case T_UINFO:
        !           434:                return("user info");
        !           435:        case T_UID:
        !           436:                return("user id");
        !           437:        case T_GID:
        !           438:                return("group id");
        !           439:        default:
        !           440:                (void) sprintf(nbuf, "%d", type);
        !           441:                return (nbuf);
        !           442:        }
        !           443: }

unix.superglobalmegacorp.com

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