Annotation of 43BSDTahoe/etc/named/tools/nslookup/list.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[] = "@(#)list.c     5.10 (Berkeley) 2/17/88";
        !            15: #endif /* not lint */
        !            16: 
        !            17: /*
        !            18:  *******************************************************************************
        !            19:  *
        !            20:  *  list.c --
        !            21:  *
        !            22:  *     Routines to obtain info from name and finger servers.
        !            23:  *
        !            24:  *     Adapted from 4.3BSD BIND ns_init.c and from /usr/src/ucb/finger.c
        !            25:  *
        !            26:  *******************************************************************************
        !            27:  */
        !            28: 
        !            29: #include <sys/types.h>
        !            30: #include <sys/socket.h>
        !            31: #include <netinet/in.h>
        !            32: #include <netdb.h>
        !            33: #include <stdio.h>
        !            34: #include <strings.h>
        !            35: #include <ctype.h>
        !            36: #include <arpa/nameser.h>
        !            37: #include <resolv.h>
        !            38: #include "res.h"
        !            39: 
        !            40: /*
        !            41:  *  Imported from res_debug.c
        !            42:  */
        !            43: extern char *_res_resultcodes[];
        !            44: 
        !            45: typedef union {
        !            46:     HEADER qb1;
        !            47:     char qb2[PACKETSZ];
        !            48: } querybuf;
        !            49: 
        !            50: extern u_long          inet_addr();
        !            51: extern HostInfo        *defaultPtr;
        !            52: extern HostInfo        curHostInfo;
        !            53: extern int             curHostValid;
        !            54: 
        !            55: /*
        !            56:  *  During a listing to a file, hash marks are printed 
        !            57:  *  every HASH_SIZE records.
        !            58:  */
        !            59: 
        !            60: #define HASH_SIZE 50
        !            61: 
        !            62: 
        !            63: /*
        !            64:  *******************************************************************************
        !            65:  *
        !            66:  *  ListHosts --
        !            67:  *
        !            68:  *     Requests the name server to do a zone transfer so we
        !            69:  *     find out what hosts it knows about.
        !            70:  *
        !            71:  *     There are five types of output:
        !            72:  *     - internet addresses (default)
        !            73:  *     - cpu type and operating system (-h option)
        !            74:  *     - canonical and alias names  (-a option)
        !            75:  *     - well-known service names  (-s option)
        !            76:  *     - ALL records (-d option)
        !            77:  *     
        !            78:  *     To see all three types of information in sorted order, 
        !            79:  *     do the following:
        !            80:  *       ls domain.edu > file
        !            81:  *       ls -a domain.edu >> file
        !            82:  *       ls -h domain.edu >> file
        !            83:  *       ls -s domain.edu >> file
        !            84:  *       view file
        !            85:  *
        !            86:  *  Results:
        !            87:  *     SUCCESS         the listing was successful.
        !            88:  *     ERROR           the server could not be contacted because 
        !            89:  *                     a socket could not be obtained or an error
        !            90:  *                     occured while receiving, or the output file
        !            91:  *                     could not be opened.
        !            92:  *
        !            93:  *******************************************************************************
        !            94:  */
        !            95: 
        !            96: int
        !            97: ListHosts(string, putToFile)
        !            98:     char *string;
        !            99:     int  putToFile;
        !           100: {
        !           101:        querybuf                buf;
        !           102:        struct sockaddr_in      sin;
        !           103:        HEADER                  *headerPtr;
        !           104:        int                     queryType;
        !           105:        int                     msglen;
        !           106:        int                     amtToRead;
        !           107:        int                     numRead;
        !           108:        int                     i;
        !           109:        int                     numAnswers = 0;
        !           110:        int                     result;
        !           111:        int                     soacnt = 0;
        !           112:        u_short                 len;
        !           113:        char                    *cp, *nmp;
        !           114:        char                    name[NAME_LEN];
        !           115:        char                    dname[2][NAME_LEN];
        !           116:        char                    option[NAME_LEN];
        !           117:        char                    file[NAME_LEN];
        !           118:        char                    *namePtr;
        !           119:        enum {
        !           120:            NO_ERRORS, 
        !           121:            ERR_READING_LEN, 
        !           122:            ERR_READING_MSG,
        !           123:            ERR_PRINTING,
        !           124:        } error = NO_ERRORS;
        !           125: 
        !           126: 
        !           127:        /*
        !           128:         *
        !           129:     /*
        !           130:      *  Parse the command line. It maybe of the form "ls domain",
        !           131:      *  "ls -a domain" or "ls -h domain".
        !           132:      */ 
        !           133:        i = sscanf(string, " ls %s %s", option, name);
        !           134:        if (putToFile && i == 2 && name[0] == '>') {
        !           135:            i--;
        !           136:        }
        !           137:        if (i == 2) {
        !           138:            if (strcmp("-a", option) == 0) {
        !           139:                queryType = T_CNAME;
        !           140:            } else if (strcmp("-h", option) == 0) {
        !           141:                queryType = T_HINFO;
        !           142:            } else if (strcmp("-m", option) == 0) {
        !           143:                queryType = T_MX;
        !           144:            } else if (strcmp("-s", option) == 0) {
        !           145:                queryType = T_WKS;
        !           146:            } else if (strcmp("-d", option) == 0) {
        !           147:                queryType = T_ANY;
        !           148:            } else {
        !           149:                queryType = T_A;
        !           150:            }
        !           151:            namePtr = name;
        !           152:        } else if (i == 1) {
        !           153:            namePtr = option;
        !           154:            queryType = T_A;
        !           155:        } else {
        !           156:            fprintf(stderr, "ListHosts: invalid request %s\n",string);
        !           157:            return(ERROR);
        !           158:        }
        !           159: 
        !           160: 
        !           161:        /*
        !           162:         *  Create a query packet for the requested domain name.
        !           163:         *
        !           164:         */
        !           165:        msglen = res_mkquery(QUERY, namePtr, C_IN, T_AXFR,
        !           166:                                (char *)0, 0, (char *)0, 
        !           167:                                (char *) &buf, sizeof(buf));
        !           168:        if (msglen < 0) {
        !           169:            if (_res.options & RES_DEBUG) {
        !           170:                fprintf(stderr, "ListHosts: Res_mkquery failed\n");
        !           171:            }
        !           172:            return (ERROR);
        !           173:        }
        !           174: 
        !           175:        bzero((char *)&sin, sizeof(sin));
        !           176:        sin.sin_family  = AF_INET;
        !           177:        sin.sin_port    =  htons(NAMESERVER_PORT);
        !           178: 
        !           179:        /*
        !           180:         *  Check to see if we have the address of the server or the
        !           181:         *  address of a server who knows about this domain.
        !           182:         *       
        !           183:         *  For now, just use the first address in the list.
        !           184:         */
        !           185: 
        !           186:        if (defaultPtr->addrList != NULL) {
        !           187:          sin.sin_addr = *(struct in_addr *) defaultPtr->addrList[0];
        !           188:        } else {
        !           189:          sin.sin_addr = *(struct in_addr *)defaultPtr->servers[0]->addrList[0];
        !           190:        }
        !           191: 
        !           192:        /*
        !           193:         *  Set up a virtual circuit to the server.
        !           194:         */
        !           195:        if ((sockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        !           196:            perror("ListHosts");
        !           197:            return(ERROR);
        !           198:        }       
        !           199:        if (connect(sockFD, &sin, sizeof(sin)) < 0) {
        !           200:            perror("ListHosts");
        !           201:            (void) close(sockFD);
        !           202:            sockFD = -1;
        !           203:            return(ERROR);
        !           204:        }       
        !           205: 
        !           206:        /*
        !           207:         * Send length & message for zone transfer 
        !           208:         */
        !           209: 
        !           210:         len = htons(msglen);
        !           211: 
        !           212:         if (write(sockFD, (char *)&len, sizeof(len)) != sizeof(len) ||
        !           213:             write(sockFD, (char *) &buf, msglen) != msglen) {
        !           214:                perror("ListHosts");
        !           215:                (void) close(sockFD);
        !           216:                sockFD = -1;
        !           217:                return(ERROR);
        !           218:        }
        !           219: 
        !           220:        fprintf(stdout,"[%s]\n",
        !           221:                (defaultPtr->addrList != NULL) ? defaultPtr->name : 
        !           222:                 defaultPtr->servers[0]->name);
        !           223: 
        !           224:        if (!putToFile) {
        !           225:            filePtr = stdout;
        !           226:        } else {
        !           227:            filePtr = OpenFile(string, file);
        !           228:             if (filePtr == NULL) {
        !           229:                 fprintf(stderr, "*** Can't open %s for writing\n", file);
        !           230:                (void) close(sockFD);
        !           231:                sockFD = -1;
        !           232:                 return(ERROR);
        !           233:             }
        !           234:            fprintf(filePtr, "> %s\n", string);
        !           235:            fprintf(filePtr,"[%s]\n",
        !           236:                (defaultPtr->addrList != NULL) ? defaultPtr->name : 
        !           237:                 defaultPtr->servers[0]->name);
        !           238:        }
        !           239: 
        !           240:        fprintf(filePtr, "%-30s", "Host or domain name");
        !           241:        switch(queryType) {
        !           242:            case T_ANY:
        !           243:                    fprintf(filePtr, " %-30s\n", "Resource record info");
        !           244:                    break;
        !           245:            case T_A:
        !           246:                    fprintf(filePtr, " %-30s\n", "Internet address");
        !           247:                    break;
        !           248:            case T_HINFO:
        !           249:                    fprintf(filePtr, " %-10s %s\n", "CPU", "OS");
        !           250:                    break;
        !           251:            case T_CNAME:
        !           252:                    fprintf(filePtr, " %-30s\n", "Alias");
        !           253:                    break;
        !           254:            case T_MX:
        !           255:                    fprintf(filePtr, " %3s %s\n", "Metric", "Host");
        !           256:                    break;
        !           257:            case T_WKS:
        !           258:                    fprintf(filePtr, " %-4s %s\n", "Protocol", "Services");
        !           259:        }
        !           260: 
        !           261: 
        !           262:        while (1) {
        !           263: 
        !           264:            /*
        !           265:             * Read the length of the response.
        !           266:             */
        !           267: 
        !           268:            cp = (char *) &buf;
        !           269:            amtToRead = sizeof(u_short);
        !           270:            while(amtToRead > 0 && (numRead = read(sockFD, cp, amtToRead)) > 0){
        !           271:                cp        += numRead;
        !           272:                amtToRead -= numRead;
        !           273:            }
        !           274:            if (numRead <= 0) {
        !           275:                error = ERR_READING_LEN;
        !           276:                break;
        !           277:            }   
        !           278: 
        !           279:            if ((len = htons(*(u_short *)&buf)) == 0) {
        !           280:                break;  /* nothing left to read */
        !           281:            }
        !           282: 
        !           283:            /*
        !           284:             * Read the response.
        !           285:             */
        !           286: 
        !           287:            amtToRead = len;
        !           288:            cp = (char *) &buf;
        !           289:            while(amtToRead > 0 && (numRead = read(sockFD, cp, amtToRead)) > 0){
        !           290:                cp += numRead;
        !           291:                amtToRead -= numRead;
        !           292:            }
        !           293:            if (numRead <= 0) {
        !           294:                error = ERR_READING_MSG;
        !           295:                break;
        !           296:            }
        !           297: 
        !           298:            result = PrintListInfo(filePtr, (char *) &buf, cp, queryType);
        !           299:            if (result != SUCCESS) {
        !           300:                error = ERR_PRINTING;
        !           301:                break;
        !           302:            }
        !           303: 
        !           304:            numAnswers++;
        !           305:            if (putToFile && ((numAnswers % HASH_SIZE) == 0)) {
        !           306:                fprintf(stdout, "#");
        !           307:                fflush(stdout);
        !           308:            }
        !           309:            cp = buf.qb2 + sizeof(HEADER);
        !           310:            if (ntohs(buf.qb1.qdcount) > 0)
        !           311:                cp += dn_skipname(cp, buf.qb2 + len) + QFIXEDSZ;
        !           312:            nmp = cp;
        !           313:            cp += dn_skipname(cp, (u_char *)&buf + len);
        !           314:            if ((_getshort(cp) == T_SOA)) {
        !           315:                dn_expand(buf.qb2, buf.qb2 + len, nmp, dname[soacnt],
        !           316:                        sizeof(dname[0]));
        !           317:                if (soacnt) {
        !           318:                    if (strcmp(dname[0], dname[1]) == 0)
        !           319:                        break;
        !           320:                } else
        !           321:                    soacnt++;
        !           322:            }
        !           323:        }
        !           324: 
        !           325:        if (putToFile) {
        !           326:            fprintf(stdout, "%sReceived %d record%s.\n", 
        !           327:                (numAnswers >= HASH_SIZE) ? "\n" : "",
        !           328:                numAnswers,
        !           329:                (numAnswers > 1) ? "s" : "");
        !           330:        }
        !           331: 
        !           332:        (void) close(sockFD);
        !           333:        sockFD = -1;
        !           334:        if (putToFile) {
        !           335:            fclose(filePtr);
        !           336:            filePtr = NULL;
        !           337:        }
        !           338: 
        !           339:        switch (error) {
        !           340:            case NO_ERRORS:
        !           341:                return (SUCCESS);
        !           342: 
        !           343:            case ERR_READING_LEN:
        !           344:                return(ERROR);
        !           345: 
        !           346:            case ERR_PRINTING:
        !           347:                fprintf(stderr,"*** Error during listing of %s: %s\n", 
        !           348:                                namePtr, DecodeError(result));
        !           349:                return(result);
        !           350: 
        !           351:            case ERR_READING_MSG:
        !           352:                headerPtr = (HEADER *) &buf;
        !           353:                fprintf(stderr,"ListHosts: error receiving zone transfer:\n");
        !           354:                fprintf(stderr,
        !           355:               "  result: %s, answers = %d, authority = %d, additional = %d\n", 
        !           356:                        _res_resultcodes[headerPtr->rcode], 
        !           357:                        ntohs(headerPtr->ancount), ntohs(headerPtr->nscount), 
        !           358:                        ntohs(headerPtr->arcount));
        !           359:                return(ERROR);
        !           360:            default:
        !           361:                return(ERROR);
        !           362:        }
        !           363: }
        !           364: 
        !           365: 
        !           366: /*
        !           367:  *******************************************************************************
        !           368:  *
        !           369:  *  PrintListInfo --
        !           370:  *
        !           371:  *     Used by the ListInfo routine to print the answer 
        !           372:  *     received from the name server. Only the desired 
        !           373:  *     information is printed.
        !           374:  *
        !           375:  *  Results:
        !           376:  *     SUCCESS         the answer was printed without a problem.
        !           377:  *     NO_INFO         the answer packet did not contain an answer.
        !           378:  *     ERROR           the answer was malformed.
        !           379:  *      Misc. errors   returned in the packet header.
        !           380:  *
        !           381:  *******************************************************************************
        !           382:  */
        !           383: 
        !           384: #define NAME_FORMAT " %-30s"
        !           385: #define STRIP_DOMAIN(string) if((dot = index(string, '.')) != NULL) *dot = '\0'
        !           386: 
        !           387: 
        !           388: PrintListInfo(file, msg, eom, queryType)
        !           389:     FILE       *file;
        !           390:     char       *msg, *eom;
        !           391:     int        queryType;
        !           392: {
        !           393:     register char      *cp;
        !           394:     HEADER             *headerPtr;
        !           395:     int                type, class, dlen, nameLen;
        !           396:     u_long             ttl;
        !           397:     int                n;
        !           398:     struct in_addr     inaddr;
        !           399:     char               name[NAME_LEN];
        !           400:     char               name2[NAME_LEN];
        !           401:     char               *dot;
        !           402: 
        !           403:     /*
        !           404:      * Read the header fields.
        !           405:      */
        !           406:     headerPtr = (HEADER *)msg;
        !           407:     cp = msg + sizeof(HEADER);
        !           408:     if (headerPtr->rcode != NOERROR) {
        !           409:        return(headerPtr->rcode);
        !           410:     }
        !           411: 
        !           412:     /*
        !           413:      *  We are looking for info from answer resource records.
        !           414:      *  If there aren't any, return with an error. We assume
        !           415:      *  there aren't any question records.
        !           416:      */
        !           417: 
        !           418:     if (ntohs(headerPtr->ancount) == 0) {
        !           419:        return(NO_INFO);
        !           420:     } else {
        !           421:        if (ntohs(headerPtr->qdcount) > 0) {
        !           422:            nameLen = dn_skipname(cp, eom);
        !           423:            if (nameLen < 0)
        !           424:                return (ERROR);
        !           425:            cp += nameLen + QFIXEDSZ;
        !           426:        }
        !           427:        if ((nameLen = dn_expand(msg, eom, cp, name, sizeof(name))) < 0) {
        !           428:            return (ERROR);
        !           429:        }
        !           430:        cp += nameLen;
        !           431:        type = _getshort(cp);
        !           432:        cp += sizeof(u_short);
        !           433:        class = _getshort(cp);
        !           434:        cp += sizeof(u_short);
        !           435:        ttl = _getlong(cp);
        !           436:        cp += sizeof(u_long);
        !           437:        dlen = _getshort(cp);
        !           438:        cp += sizeof(u_short);
        !           439:        if (name[0] == 0)
        !           440:                strcpy(name, "(root)");
        !           441: 
        !           442:        /*
        !           443:         * QueryType is used to specify the type of desired information.
        !           444:         *  T_A         - internet address
        !           445:         *  T_CNAME     - aliases
        !           446:         *  T_HINFO     - cpu, OS type
        !           447:         *  T_MX        - mail routing
        !           448:         *  T_WKS       - well known service
        !           449:         *  T_ANY       - any
        !           450:         *
        !           451:         */
        !           452:        switch (type) {
        !           453: 
        !           454:            case T_A:
        !           455:                if (queryType != T_A && queryType != T_ANY)
        !           456:                    break;
        !           457: 
        !           458:                if ((_res.options & RES_DEBUG) == 0)
        !           459:                    STRIP_DOMAIN(name);
        !           460:                fprintf(file, NAME_FORMAT, name);
        !           461:                if (queryType == T_ANY)
        !           462:                    fprintf(file," %-5s", p_type(type));
        !           463:                if (class == C_IN) {
        !           464:                    bcopy(cp, (char *)&inaddr, sizeof(inaddr));
        !           465:                    if (dlen == 4) {
        !           466:                        fprintf(file," %s", inet_ntoa(inaddr));
        !           467:                    } else if (dlen == 7) {
        !           468:                        fprintf(file," %s", inet_ntoa(inaddr));
        !           469:                        fprintf(file," (%d, %d)", cp[4],(cp[5] << 8) + cp[6]);
        !           470:                    } else
        !           471:                        fprintf(file, " (dlen = %d?)", dlen);
        !           472:                    if (_res.options & RES_DEBUG)
        !           473:                        fprintf(file,"\t\t\t%lu", ttl);
        !           474:                    fprintf(file,"\n");
        !           475:                } else
        !           476:                    goto other;
        !           477:                break;
        !           478:                
        !           479:            case T_CNAME:
        !           480:                if (queryType != T_CNAME && queryType != T_ANY)
        !           481:                    break;
        !           482: 
        !           483:                if ((_res.options & RES_DEBUG) == 0)
        !           484:                        STRIP_DOMAIN(name);
        !           485:                fprintf(file, NAME_FORMAT, name);
        !           486:                if (queryType == T_ANY)
        !           487:                    fprintf(file," %-5s", p_type(type));
        !           488:                if ((nameLen = dn_expand(msg, eom, cp, name2, sizeof(name2))) < 0) {
        !           489:                    fprintf(file, " ***\n");
        !           490:                    return (ERROR);
        !           491:                }
        !           492:                /* 
        !           493:                 * a bug -- cnames need not be in same domain!
        !           494:                 * STRIP_DOMAIN(name2);
        !           495:                 */
        !           496: 
        !           497:                fprintf(file, NAME_FORMAT, name2);
        !           498:                if (_res.options & RES_DEBUG)
        !           499:                    fprintf(file,"\t%lu", ttl);
        !           500:                fprintf(file,"\n");
        !           501:                break;
        !           502:                
        !           503:            case T_HINFO:
        !           504:                if (queryType != T_HINFO && queryType != T_ANY)
        !           505:                    break;
        !           506: 
        !           507:                if ((_res.options & RES_DEBUG) == 0)
        !           508:                    STRIP_DOMAIN(name);
        !           509:                fprintf(file, NAME_FORMAT, name);
        !           510:                if (queryType == T_ANY)
        !           511:                    fprintf(file," %-5s", p_type(type));
        !           512:                if (n = *cp++) {
        !           513:                    (void)sprintf(name,"%.*s", n, cp);
        !           514:                    fprintf(file," %-10s", name);
        !           515:                    cp += n;
        !           516:                } else {
        !           517:                    fprintf(file," %-10s", " ");
        !           518:                }
        !           519:                if (n = *cp++) {
        !           520:                    fprintf(file," %.*s", n, cp);
        !           521:                    cp += n;
        !           522:                }
        !           523:                if (_res.options & RES_DEBUG)
        !           524:                    fprintf(file,"\t\t%lu", ttl);
        !           525:                fprintf(file,"\n");
        !           526:                break;
        !           527: 
        !           528:            case T_MX:
        !           529:                if (queryType != T_MX && queryType != T_ANY)
        !           530:                    break;
        !           531: 
        !           532:                if ((_res.options & RES_DEBUG) == 0)
        !           533:                    STRIP_DOMAIN(name);
        !           534:                fprintf(file, NAME_FORMAT, name);
        !           535:                if (queryType == T_ANY)
        !           536:                    fprintf(file," %-5s", p_type(type));
        !           537: 
        !           538:                {
        !           539:                    short pref;
        !           540: 
        !           541:                    pref = _getshort(cp);
        !           542:                    cp += sizeof(u_short);
        !           543:                    fprintf(file," %-3d ",pref);
        !           544:                }
        !           545:                if ((nameLen = dn_expand(msg, eom, cp, name2, sizeof(name2))) < 0) {
        !           546:                    fprintf(file, " ***\n");
        !           547:                    return (ERROR);
        !           548:                }
        !           549:                fprintf(file, " %s", name2);
        !           550:                if (_res.options & RES_DEBUG)
        !           551:                    fprintf(file,"\t%lu", ttl);
        !           552:                fprintf(file,"\n");
        !           553: 
        !           554:                break;
        !           555: 
        !           556: 
        !           557:            case T_NS:
        !           558:            case T_PTR:
        !           559:                if (queryType != T_A && queryType != T_ANY)
        !           560:                    break;
        !           561:                /*
        !           562:                 *  Found a name server or pointer record.
        !           563:                 */
        !           564:                if ((_res.options & RES_DEBUG) == 0)
        !           565:                    STRIP_DOMAIN(name);
        !           566:                fprintf(file, NAME_FORMAT, name);
        !           567:                if (queryType == T_ANY)
        !           568:                    fprintf(file," %-5s", p_type(type));
        !           569:                fprintf(file," %s = ", type == T_PTR ? "host" : "server");
        !           570:                cp = Print_cdname2(cp, msg, eom, file);
        !           571:                if (_res.options & RES_DEBUG)
        !           572:                    fprintf(file,"\t%lu", ttl);
        !           573:                fprintf(file,"\n");
        !           574:                break;
        !           575: 
        !           576:            case T_WKS:
        !           577:                if (queryType != T_WKS && queryType != T_ANY)
        !           578:                    break;
        !           579: 
        !           580:                if ((_res.options & RES_DEBUG) == 0)
        !           581:                    STRIP_DOMAIN(name);
        !           582:                fprintf(file, NAME_FORMAT, name);
        !           583:                if (queryType == T_ANY)
        !           584:                    fprintf(file," %-5s", p_type(type));
        !           585:                if (class == C_IN) {
        !           586:                    cp += 4; dlen -= 4;
        !           587:                    {
        !           588:                        struct protoent *pp;
        !           589:                        struct servent *ss;
        !           590:                        u_short port;
        !           591: 
        !           592:                        setprotoent(1);
        !           593:                        setservent(1);
        !           594:                        n = *cp & 0377;
        !           595:                        pp = getprotobynumber(n);
        !           596:                        if(pp == 0)  
        !           597:                            fprintf(file," %-3d ", n);
        !           598:                        else
        !           599:                            fprintf(file," %-3s ", pp->p_name);
        !           600:                        cp++; dlen--;
        !           601: 
        !           602:                        port = 0;
        !           603:                        while(dlen-- > 0) {
        !           604:                            n = *cp++;
        !           605:                            do {
        !           606:                                if(n & 0200) {
        !           607:                                    ss = getservbyport((int)htons(port), pp->p_name);
        !           608:                                    if(ss == 0)  
        !           609:                                        fprintf(file," %d", port);
        !           610:                                    else
        !           611:                                        fprintf(file," %s", ss->s_name);
        !           612:                                }
        !           613:                                    n <<= 1;
        !           614:                            } while(++port & 07);
        !           615:                        }
        !           616:                    } 
        !           617:                } else
        !           618:                    goto other;
        !           619:                if (_res.options & RES_DEBUG)
        !           620:                    fprintf(file,"\t%lu", ttl);
        !           621:                fprintf(file,"\n");
        !           622:                endprotoent();
        !           623:                endservent();
        !           624:                break;
        !           625: 
        !           626:            case T_SOA:
        !           627:            case T_AXFR:
        !           628:                if (queryType != T_ANY)
        !           629:                    break;
        !           630:                fprintf(file, NAME_FORMAT, name);
        !           631:                if (queryType == T_ANY)
        !           632:                    fprintf(file," %-5s", p_type(type));
        !           633:                if ((nameLen = dn_expand(msg, eom, cp, name2, sizeof(name2))) < 0) {
        !           634:                    fprintf(file, " ***\n");
        !           635:                    return (ERROR);
        !           636:                }
        !           637:                cp += nameLen;
        !           638:                fprintf(file, " %s", name2);
        !           639:                if ((nameLen = dn_expand(msg, eom, cp, name2, sizeof(name2))) < 0) {
        !           640:                    fprintf(file, " ***\n");
        !           641:                    return (ERROR);
        !           642:                }
        !           643:                cp += nameLen;
        !           644:                fprintf(file, " %s. (", name2);
        !           645:                for (n = 0; n < 5; n++) {
        !           646:                    u_long u;
        !           647: 
        !           648:                    u = _getlong(cp);
        !           649:                    cp += sizeof(u_long);
        !           650:                    fprintf(file,"%s%d", n? " " : "", u);
        !           651:                }
        !           652:                fprintf(file, ")", name2);
        !           653:                if (_res.options & RES_DEBUG)
        !           654:                    fprintf(file,"\t%lu", ttl);
        !           655:                fprintf(file,"\n");
        !           656:                break;
        !           657: 
        !           658:            default:
        !           659:                /*
        !           660:                 * Unwanted answer type -- ignore it.
        !           661:                 */
        !           662:                if (queryType != T_ANY)
        !           663:                    break;
        !           664:                if ((_res.options & RES_DEBUG) == 0)
        !           665:                    STRIP_DOMAIN(name);
        !           666:                fprintf(file, NAME_FORMAT, name);
        !           667: other:
        !           668:                fprintf(file," type = %-5s", p_type(type));
        !           669:                fprintf(file,", class = %-5s", p_class(class));
        !           670:                if (_res.options & RES_DEBUG)
        !           671:                    fprintf(file,"\t%lu\n", ttl);
        !           672:                break;
        !           673:        }
        !           674:     }
        !           675:     return(SUCCESS);
        !           676: }
        !           677: 
        !           678: 
        !           679: /*
        !           680:  *******************************************************************************
        !           681:  *
        !           682:  *  ViewList --
        !           683:  *
        !           684:  *     A hack to view the output of the ls command in sorted
        !           685:  *     order using more.
        !           686:  *
        !           687:  *******************************************************************************
        !           688:  */
        !           689: 
        !           690: ViewList(string)
        !           691:     char *string;
        !           692: {
        !           693:     char file[NAME_LEN];
        !           694:     char command[NAME_LEN];
        !           695: 
        !           696:     sscanf(string, " view %s", file);
        !           697:     (void)sprintf(command, "grep \"^ \" %s | sort | more", file);
        !           698:     system(command);
        !           699: }
        !           700: 
        !           701: /*
        !           702:  *******************************************************************************
        !           703:  *
        !           704:  *   Finger --
        !           705:  *
        !           706:  *     Connects with the finger server for the current host
        !           707:  *     to request info on the specified person (long form)
        !           708:  *     who is on the system (short form).
        !           709:  *
        !           710:  *  Results:
        !           711:  *     SUCCESS         the finger server was contacted.
        !           712:  *     ERROR           the server could not be contacted because 
        !           713:  *                     a socket could not be obtained or connected 
        !           714:  *                     to or the service could not be found.
        !           715:  *
        !           716:  *******************************************************************************
        !           717:  */
        !           718: 
        !           719: Finger(string, putToFile)
        !           720:     char *string;
        !           721:     int  putToFile;
        !           722: {
        !           723:        struct servent          *sp;
        !           724:        struct sockaddr_in      sin;
        !           725:        register FILE           *f;
        !           726:        register int            c;
        !           727:        register int            lastc;
        !           728:        char                    name[NAME_LEN];
        !           729:        char                    file[NAME_LEN];
        !           730: 
        !           731:        /*
        !           732:         *  We need a valid current host info to get an inet address.
        !           733:         */
        !           734:        if (!curHostValid) {
        !           735:            fprintf(stderr, "Finger: no current host defined.\n");
        !           736:            return (ERROR);
        !           737:        }
        !           738: 
        !           739:        if (sscanf(string, " finger %s", name) == 1) {
        !           740:            if (putToFile && (name[0] == '>')) {
        !           741:                name[0] = '\0';
        !           742:            }
        !           743:        } else {
        !           744:            name[0] = '\0';
        !           745:        }
        !           746: 
        !           747:        sp = getservbyname("finger", "tcp");
        !           748:        if (sp == 0) {
        !           749:            fprintf(stderr, "Finger: unknown service\n");
        !           750:            return (ERROR);
        !           751:        }
        !           752: 
        !           753:        bzero((char *)&sin, sizeof(sin));
        !           754:        sin.sin_family  = curHostInfo.addrType;
        !           755:        sin.sin_port    = sp->s_port;
        !           756:        bcopy(curHostInfo.addrList[0], (char *)&sin.sin_addr, 
        !           757:                curHostInfo.addrLen);
        !           758: 
        !           759:        /*
        !           760:         *  Set up a virtual circuit to the host.
        !           761:         */
        !           762: 
        !           763:        sockFD = socket(curHostInfo.addrType, SOCK_STREAM, 0);
        !           764:        if (sockFD < 0) {
        !           765:            fflush(stdout);
        !           766:            perror("Finger");
        !           767:            return (ERROR);
        !           768:        }
        !           769: 
        !           770:        if (connect(sockFD, (char *)&sin, sizeof (sin)) < 0) {
        !           771:            fflush(stdout);
        !           772:            perror("Finger");
        !           773:            close(sockFD);
        !           774:            sockFD = -1;
        !           775:            return (ERROR);
        !           776:        }
        !           777: 
        !           778:        if (!putToFile) {
        !           779:            filePtr = stdout;
        !           780:        } else {
        !           781:            filePtr = OpenFile(string, file);
        !           782:            if (filePtr == NULL) {
        !           783:                fprintf(stderr, "*** Can't open %s for writing\n", file);
        !           784:                close(sockFD);
        !           785:                sockFD = -1;
        !           786:                return(ERROR);
        !           787:            }
        !           788:            fprintf(filePtr,"> %s\n", string);
        !           789:        }
        !           790:        fprintf(filePtr, "[%s]\n", curHostInfo.name);
        !           791: 
        !           792:        if (name[0] != '\0') {
        !           793:            write(sockFD, "/W ", 3);
        !           794:        }
        !           795:        write(sockFD, name, strlen(name));
        !           796:        write(sockFD, "\r\n", 2);
        !           797:        f = fdopen(sockFD, "r");
        !           798:        while ((c = getc(f)) != EOF) {
        !           799:            switch(c) {
        !           800:                case 0210:
        !           801:                case 0211:
        !           802:                case 0212:
        !           803:                case 0214:
        !           804:                        c -= 0200;
        !           805:                        break;
        !           806:                case 0215:
        !           807:                        c = '\n';
        !           808:                        break;
        !           809:            }
        !           810:            putc(lastc = c, filePtr);
        !           811:        }
        !           812:        if (lastc != '\n') {
        !           813:            putc('\n', filePtr);
        !           814:        }
        !           815:        putc('\n', filePtr);
        !           816: 
        !           817:        close(sockFD);
        !           818:        sockFD = -1;
        !           819: 
        !           820:        if (putToFile) {
        !           821:            fclose(filePtr);
        !           822:            filePtr = NULL;
        !           823:        }
        !           824:        return (SUCCESS);
        !           825: }

unix.superglobalmegacorp.com

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