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

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

unix.superglobalmegacorp.com

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