Annotation of 43BSDReno/contrib/isode-beta/snmp/snmpi.c, revision 1.1

1.1     ! root        1: /* snmpi.c - really minimal SNMP initiator */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/snmp/RCS/snmpi.c,v 7.13 90/07/09 14:49:34 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/snmp/RCS/snmpi.c,v 7.13 90/07/09 14:49:34 mrose Exp $
        !             9:  *
        !            10:  * Contributed by NYSERNet Inc.  This work was partially supported by the
        !            11:  * U.S. Defense Advanced Research Projects Agency and the Rome Air Development
        !            12:  * Center of the U.S. Air Force Systems Command under contract number
        !            13:  * F30602-88-C-0016.
        !            14:  *
        !            15:  *
        !            16:  * $Log:       snmpi.c,v $
        !            17:  * Revision 7.13  90/07/09  14:49:34  mrose
        !            18:  * sync
        !            19:  * 
        !            20:  * Revision 7.12  90/06/23  18:25:14  mrose
        !            21:  * now
        !            22:  * 
        !            23:  * Revision 7.11  90/06/23  17:01:55  mrose
        !            24:  * update
        !            25:  * 
        !            26:  * Revision 7.10  90/05/12  17:02:09  mrose
        !            27:  * sync
        !            28:  * 
        !            29:  * Revision 7.9  90/02/23  17:47:59  mrose
        !            30:  * update
        !            31:  * 
        !            32:  * Revision 7.8  90/02/19  19:17:05  mrose
        !            33:  * again
        !            34:  * 
        !            35:  * Revision 7.7  90/01/27  08:22:04  mrose
        !            36:  * touch-up
        !            37:  * 
        !            38:  * Revision 7.6  90/01/11  18:34:43  mrose
        !            39:  * real-sync
        !            40:  * 
        !            41:  * Revision 7.5  89/12/19  17:57:56  mrose
        !            42:  * touch-up
        !            43:  * 
        !            44:  * Revision 7.4  89/12/19  16:18:26  mrose
        !            45:  * dgram
        !            46:  * 
        !            47:  * Revision 7.3  89/12/12  16:13:47  mrose
        !            48:  * touch-up
        !            49:  * 
        !            50:  * Revision 7.2  89/12/11  16:22:33  mrose
        !            51:  * more clts
        !            52:  * 
        !            53:  * Revision 7.1  89/12/01  10:42:18  mrose
        !            54:  * clts
        !            55:  * 
        !            56:  * Revision 7.0  89/11/23  22:23:30  mrose
        !            57:  * Release 6.0
        !            58:  * 
        !            59:  */
        !            60: 
        !            61: /*
        !            62:  *                               NOTICE
        !            63:  *
        !            64:  *    Acquisition, use, and distribution of this module and related
        !            65:  *    materials are subject to the restrictions of a license agreement.
        !            66:  *    Consult the Preface in the User's Manual for the full terms of
        !            67:  *    this agreement.
        !            68:  *
        !            69:  */
        !            70: 
        !            71: 
        !            72: #include <setjmp.h>
        !            73: #include <signal.h>
        !            74: #include <stdio.h>
        !            75: #include <varargs.h>
        !            76: #include "SNMP-types.h"
        !            77: #include "objects.h"
        !            78: #include <sys/ioctl.h>
        !            79: #include "tailor.h"
        !            80: 
        !            81: #include "dgram.h"
        !            82: #include "tsap.h"
        !            83: #ifdef TCP
        !            84: #include "internet.h"
        !            85: #endif
        !            86: #ifdef X25
        !            87: #include "x25.h"
        !            88: #define        COTS
        !            89: #endif
        !            90: #ifdef TP4
        !            91: #include "tp4.h"
        !            92: #if    !defined(CLTS) && !defined(COTS)
        !            93: #define        COTS
        !            94: #endif
        !            95: #endif
        !            96: 
        !            97: /*    DATA */
        !            98: 
        !            99: int    debug = 0;
        !           100: static int     verbose = 0;
        !           101: static int     watch = 0;
        !           102: 
        !           103: static char   *myname = "snmp";
        !           104: 
        !           105: static char  **op = NULLVP;
        !           106: 
        !           107: static int     ontty;
        !           108: static int     armed;
        !           109: static jmp_buf intrenv;
        !           110: static int     interrupted;
        !           111: 
        !           112: static SFP     istat;
        !           113: 
        !           114: SFD    intrser ();
        !           115: 
        !           116: 
        !           117: static char   *defs = NULLCP;
        !           118: 
        !           119: static PS      ps;
        !           120: static char   *community = "public";
        !           121: 
        !           122: static int     sd;
        !           123: static struct TSAPaddr  snmp_ta;
        !           124: 
        !           125: char   *snmp_error ();
        !           126: struct type_SNMP_Message *new_message ();
        !           127: 
        !           128: 
        !           129: void   adios (), advise ();
        !           130: 
        !           131: /*  */
        !           132: 
        !           133: struct dispatch {
        !           134:     char   *ds_name;           /* command name */
        !           135:     IFP            ds_fnx;             /* dispatch */
        !           136: 
        !           137:     char   *ds_help;           /* help string */
        !           138: };
        !           139: struct dispatch *getds ();
        !           140: 
        !           141: 
        !           142: int    f_audit ();
        !           143: int    f_dump ();
        !           144: int    f_get (), f_get_next (), f_set ();
        !           145: int    f_help (), f_quit (), f_status ();
        !           146: 
        !           147: static struct dispatch dispatches[] = {
        !           148:     "audit", f_audit, "audit traps",
        !           149: 
        !           150:     "dump", f_dump, "dump a portion of the MIB",
        !           151: 
        !           152:     "get", f_get, "perform get operation",
        !           153: 
        !           154:     "help", f_help, "print help information",
        !           155:     
        !           156:     "next", f_get_next, "perform powerful get-next operation",
        !           157: 
        !           158:     "quit", f_quit, "terminate program",
        !           159: 
        !           160:     "set", f_set, "perform set operation",
        !           161: 
        !           162:     "status", f_status, "report status",
        !           163: 
        !           164:     NULL
        !           165: };
        !           166: 
        !           167: 
        !           168: static int     helpwidth;
        !           169: 
        !           170: 
        !           171: #ifndef        SYS5
        !           172: long   random ();
        !           173: #endif
        !           174: long   time ();
        !           175: 
        !           176: /*    MAIN */
        !           177: 
        !           178: /* ARGSUSED */
        !           179: 
        !           180: main (argc, argv, envp)
        !           181: int    argc;
        !           182: char  **argv,
        !           183:       **envp;
        !           184: {
        !           185:     int            eof,
        !           186:            status,
        !           187:            vecp;
        !           188:     char    buffer[BUFSIZ],
        !           189:           *vec[NVEC + 1];
        !           190: 
        !           191:     arginit (argv);
        !           192: 
        !           193:     status = 0;
        !           194:     if (op) {
        !           195:        vecp = 0;
        !           196:        while (*op)
        !           197:            vec[vecp++] = *op++;
        !           198:        vec[vecp] = NULL;
        !           199: 
        !           200:        if (snmploop (vec, NOTOK) == NOTOK)
        !           201:            status = 1;
        !           202: 
        !           203:        goto were_out_of_here;
        !           204:     }
        !           205: 
        !           206:     istat = signal (SIGINT, intrser);
        !           207:     
        !           208:     eof = 0;
        !           209:     for (interrupted = 0;; interrupted = 0) {
        !           210:        if (getline ("%s> ", buffer) == NOTOK) {
        !           211:            if (eof)
        !           212:                break;
        !           213: 
        !           214:            eof = 1;
        !           215:            continue;
        !           216:        }
        !           217:        eof = 0;
        !           218: 
        !           219:        bzero ((char *) vec, sizeof vec);
        !           220:        if ((vecp = str2vec (buffer, vec)) < 1)
        !           221:            continue;
        !           222: 
        !           223:        switch (snmploop (vec, OK)) {
        !           224:            case NOTOK:
        !           225:                status = 1;
        !           226:                break;
        !           227: 
        !           228:           case OK:
        !           229:           default:
        !           230:                continue;
        !           231: 
        !           232:           case DONE:
        !           233:                status = 0;
        !           234:                break;
        !           235:        }
        !           236:        break;
        !           237:     }
        !           238: 
        !           239:     (void) signal (SIGINT, istat);
        !           240: 
        !           241: were_out_of_here: ;
        !           242: #ifdef COTS
        !           243:     if (snmp_ta.ta_addrs -> na_stack != NA_TCP) {
        !           244:        struct TSAPdisconnect tds;
        !           245: 
        !           246: #ifdef CLTS
        !           247:        if (snmp_ta.ta_addrs -> na_stack != NA_NSAP)
        !           248: #endif
        !           249:            (void) TDiscRequest (sd, NULLCP, 0, &tds);
        !           250:     }
        !           251: #endif
        !           252: 
        !           253:     exit (status);             /* NOTREACHED */
        !           254: }
        !           255: 
        !           256: /*  */
        !           257: 
        !           258: static int  snmploop (vec, error)
        !           259: char  **vec;
        !           260: int    error;
        !           261: {
        !           262:     register struct dispatch *ds;
        !           263: 
        !           264:     if ((ds = getds (strcmp (*vec, "?") ? *vec : "help")) == NULL)
        !           265:        return error;
        !           266:     switch ((*ds -> ds_fnx) (vec)) {
        !           267:        case NOTOK:
        !           268:            return error;
        !           269: 
        !           270:        case OK:
        !           271:        default:
        !           272:            return OK;
        !           273: 
        !           274:        case DONE:
        !           275:            return DONE;
        !           276:     }
        !           277: }
        !           278: 
        !           279: /*  */
        !           280: 
        !           281: static struct dispatch *getds (name)
        !           282: char   *name;
        !           283: {
        !           284:     register int    longest,
        !           285:                     nmatches;
        !           286:     register char  *p,
        !           287:                    *q;
        !           288:     char    buffer[BUFSIZ];
        !           289:     register struct dispatch   *ds,
        !           290:                                *fs;
        !           291: 
        !           292:     longest = nmatches = 0;
        !           293:     for (ds = dispatches; p = ds -> ds_name; ds++) {
        !           294:        for (q = name; *q == *p++; q++)
        !           295:            if (*q == NULL)
        !           296:                return ds;
        !           297: 
        !           298:        if (*q == NULL)
        !           299:            if (q - name > longest) {
        !           300:                longest = q - name;
        !           301:                nmatches = 1;
        !           302:                fs = ds;
        !           303:            }
        !           304:            else
        !           305:                if (q - name == longest)
        !           306:                    nmatches++;
        !           307:     }
        !           308: 
        !           309:     switch (nmatches) {
        !           310:        case 0: 
        !           311:            advise (NULLCP, "unknown operation \"%s\"", name);
        !           312:            return NULL;
        !           313: 
        !           314:        case 1: 
        !           315:            return fs;
        !           316: 
        !           317:        default: 
        !           318:            for (ds = dispatches, p = buffer; q = ds -> ds_name; ds++)
        !           319:                if (strncmp (q, name, longest) == 0) {
        !           320:                    (void) sprintf (p, "%s \"%s\"", p != buffer ? "," : "", q);
        !           321:                    p += strlen (p);
        !           322:                }
        !           323:            advise (NULLCP, "ambiguous operation, it could be one of:%s",
        !           324:                        buffer);
        !           325:            return NULL;
        !           326:     }
        !           327: }
        !           328: 
        !           329: /*    OPERATIONS */
        !           330: 
        !           331: static int  f_audit (vec)
        !           332: char  **vec;
        !           333: {
        !           334:     int            follow,
        !           335:            forever,
        !           336:            i;
        !           337:     long    longtimeago,
        !           338:            now;
        !           339:     char   *cp,
        !           340:           *file;
        !           341:     PE     pe,
        !           342:            p;
        !           343:     PS     ps2;
        !           344:     struct type_SNMP_Audit *au;
        !           345:     FILE   *fp;
        !           346: 
        !           347:     file = "snmp.traps";
        !           348:     if (*++vec != NULL && strcmp (*vec, "-help") == 0) {
        !           349:        printf ("audit [-f | -N | +N] [file]\n");
        !           350:        printf ("    audit trap sink\n");
        !           351:        printf ("        -f:   endless loop\n");
        !           352:        printf ("        -N:   last N traps\n");
        !           353:        printf ("        +N:   first N traps\n");
        !           354:        printf ("        file: trap file (default %s)", file);
        !           355: 
        !           356:        return OK;
        !           357:     }
        !           358: 
        !           359:     follow = forever = 0;
        !           360:     for (; cp = *vec; vec++)
        !           361:        switch (*cp) {
        !           362:            case '-':
        !           363:                if (strcmp (cp, "-f") == 0)
        !           364:                    forever++, follow = 0;
        !           365:                else
        !           366:                    follow = -atoi (++cp), forever = 0;
        !           367:                break;
        !           368: 
        !           369:            case '+':
        !           370:                follow = atoi (++cp), forever = 0;
        !           371:                break;
        !           372: 
        !           373:            default:
        !           374:                file = cp;
        !           375:                break;
        !           376:        }
        !           377: 
        !           378:     file = _isodefile (isodelogpath, file);
        !           379:     if ((fp = fopen (file, "r")) == NULL) {
        !           380:        advise (file, "unable to read");
        !           381:        return OK;
        !           382:     }
        !           383: 
        !           384:     pe = p = NULLPE, au = NULL;
        !           385:     if ((ps2 = ps_alloc (std_open)) == NULLPS) {
        !           386:        advise (NULLCP, "ps_alloc(std_open): you lose");
        !           387:        goto out;
        !           388:     }
        !           389:     if (std_setup (ps2, fp) == NOTOK) {
        !           390:        advise (NULLCP, "std_setup: %s", ps_error (ps2 -> ps_errno));
        !           391:        goto out;
        !           392:     }
        !           393: 
        !           394:     (void) time (&now);
        !           395:     longtimeago = now - 6L * 30L * 24L * 60L * 60L;
        !           396: 
        !           397:     if (follow < 0) {
        !           398:        register long    offset,
        !           399:                        *lp,
        !           400:                        *ep;
        !           401:        long   *opp;
        !           402: 
        !           403:        follow = -follow;
        !           404:        if ((opp = (long *) calloc ((unsigned) follow, sizeof *opp)) == NULL)
        !           405:            adios (NULLCP, "out of memory");
        !           406:        offset = ftell (fp);
        !           407:        for (ep = (lp = opp) + follow; lp < ep; lp++)
        !           408:            *lp = offset;
        !           409:        lp = opp;
        !           410: 
        !           411:        for (;;) {
        !           412:            if ((pe = ps2pe (ps2)) == NULLPE)
        !           413:                break;
        !           414:            if (decode_SNMP_Audit (pe, 1, NULLIP, NULLVP, &au) == NOTOK)
        !           415:                goto bad_audit;
        !           416: 
        !           417:            fseek (fp, (long) au -> sizeOfEncodingWhichFollows, 1);
        !           418: 
        !           419:            free_SNMP_Audit (au);
        !           420: 
        !           421:            *lp++ = offset;
        !           422:            if (lp >= ep)
        !           423:                lp = opp;
        !           424:            offset = ftell (fp);
        !           425:        }
        !           426: 
        !           427:        fseek (fp, *lp, 0);
        !           428:        free ((char *) opp);
        !           429:        follow = 0;
        !           430:     }
        !           431: 
        !           432:     for (i = 1;; i++) {
        !           433:        long    mtime;
        !           434:        UTC     ut;
        !           435: 
        !           436:        if (follow > 0 && i > follow)
        !           437:            break;
        !           438: 
        !           439:        if ((pe = ps2pe (ps2)) == NULLPE) {
        !           440:            if (ps2 -> ps_errno)
        !           441:                advise (NULLCP, "ps2pe: %s", ps_error (ps2 -> ps_errno));
        !           442:            else
        !           443:                if (forever) {
        !           444:                    clearerr (fp);
        !           445:                    ps2 -> ps_errno = PS_ERR_NONE;
        !           446:                    sleep (1);
        !           447:                    continue;
        !           448:                }
        !           449:            break;
        !           450:        }
        !           451:        if (decode_SNMP_Audit (pe, 1, NULLIP, NULLVP, &au) == NOTOK) {
        !           452: bad_audit: ;
        !           453:            advise (NULLCP, "decode_SNMP_Audit: %s", PY_pepy);
        !           454:            break;
        !           455:        }
        !           456: 
        !           457:        if ((cp = qb2str (au -> dateAndTime)) == NULL) {
        !           458: no_mem: ;
        !           459:            advise (NULLCP, "qb2str: out of memory");
        !           460:            break;
        !           461:        }
        !           462:        ut = str2gent (cp, strlen (cp));
        !           463:        free (cp);
        !           464:        if (ut == NULL) {
        !           465:            advise (NULLCP, "str2gent: you lose");
        !           466:            break;
        !           467:        }
        !           468:        mtime = gtime (ut2tm (ut));
        !           469:        cp = ctime (&mtime);
        !           470:        if (forever)
        !           471:            (void) time (&now);
        !           472:        if (mtime < longtimeago || mtime > now)
        !           473:            printf ("%-7.7s %-4.4s ", cp + 4, cp + 20);
        !           474:        else
        !           475:            printf ("%-12.12s ", cp + 4);
        !           476: 
        !           477:        if ((cp = qb2str (au -> source)) == NULL)
        !           478:            goto no_mem;
        !           479:        printf ("%s\n", cp);
        !           480:        free (cp);
        !           481: 
        !           482:        if ((p = ps2pe (ps2)) == NULLPE) {
        !           483:            if (ps2 -> ps_errno)
        !           484:                advise (NULLCP, "ps2pe: %s", ps_error (ps2 -> ps_errno));
        !           485:            break;
        !           486:        }
        !           487:        if (print_SNMP_Message (p, 1, NULLIP, NULLVP, NULLCP) == NOTOK)
        !           488:            printf ("\n");
        !           489: 
        !           490:        free_SNMP_Audit (au), au = NULL;
        !           491:     }
        !           492: 
        !           493: out: ;
        !           494:     (void) fclose (fp);
        !           495:     if (ps2)
        !           496:        ps_free (ps2);
        !           497:     if (pe)
        !           498:        pe_free (pe);
        !           499:     if (p)
        !           500:        pe_free (p);
        !           501:     if (au)
        !           502:        free_SNMP_Audit (au);
        !           503: 
        !           504:     return OK;
        !           505: }
        !           506: 
        !           507: /*  */
        !           508: 
        !           509: static int  f_dump (vec)
        !           510: char  **vec;
        !           511: {
        !           512:     int            request_id;
        !           513:     char   *nvec[3];
        !           514:     OID            oid;
        !           515:     PE     pe;
        !           516:     struct type_SNMP_Message *msg;
        !           517:     register struct type_SNMP_PDU *parm;
        !           518:     register struct type_SNMP_VarBindList *vp;
        !           519: 
        !           520:     if (*++vec != NULL && strcmp (*vec, "-help") == 0) {
        !           521:        printf ("dump [object]\n");
        !           522:        printf ("    with no arguments, dump entire MIB\n");
        !           523:        printf ("    with an argument, dump a portion of the MIB\n");
        !           524: 
        !           525:        return OK;
        !           526:     }
        !           527: 
        !           528:     nvec[0] = "dump";
        !           529:     nvec[1] = *vec ? *vec : "mib-2";
        !           530:     nvec[2] = NULL;
        !           531: 
        !           532:     if ((msg = new_message (type_SNMP_PDUs_get__next__request, nvec)) == NULL)
        !           533:        return OK;
        !           534: 
        !           535:     request_id = msg -> data -> un.get__response -> request__id = 0;
        !           536: 
        !           537:     if (*vec) {
        !           538:        if ((oid = oid_cpy (msg -> data -> un.get__next__request ->
        !           539:                            variable__bindings -> VarBind -> name)) == NULLOID)
        !           540:            adios (NULLCP, "out of memory");
        !           541:     }
        !           542:     else
        !           543:        oid = NULLOID;
        !           544: 
        !           545: again: ;
        !           546:     pe = NULLPE;
        !           547: 
        !           548:     if (encode_SNMP_Message (&pe, 1, 0, NULLCP, msg) != NOTOK) {
        !           549:        if (watch)
        !           550:            (void) print_SNMP_Message (pe, 1, NULLIP, NULLVP, NULLCP);
        !           551: 
        !           552:        if (pe2ps (ps, pe) == NOTOK) {
        !           553:            advise (NULLCP, "pe2ps: %s", ps_error (ps -> ps_errno));
        !           554:            goto out;
        !           555:        }
        !           556:     }
        !           557:     else
        !           558:        advise (NULLCP, "encode_SNMP_Message: %s", PY_pepy);
        !           559: 
        !           560: try_again: ;
        !           561:     if (pe)
        !           562:        pe_free (pe);
        !           563:     pe = NULLPE;
        !           564:     
        !           565:     free_SNMP_Message (msg);
        !           566:     msg = NULL;
        !           567: 
        !           568:     if ((pe = ps2pe (ps)) == NULLPE) {
        !           569:        advise (NULLCP, "ps2pe: %s", ps_error (ps -> ps_errno));
        !           570:        goto out;
        !           571:     }
        !           572: 
        !           573:     if (decode_SNMP_Message (pe, 1, NULLIP, NULLVP, &msg) == NOTOK) {
        !           574:        advise (NULLCP, "decode_SNMP_Message: %s", PY_pepy);
        !           575:        goto out;
        !           576:     }
        !           577: 
        !           578:     if (watch)
        !           579:        (void) print_SNMP_Message (pe, 1, NULLIP, NULLVP, NULLCP);
        !           580: 
        !           581:     if (msg -> data -> offset != type_SNMP_PDUs_get__response) {
        !           582:        advise (NULLCP, "unexpected message type %d",
        !           583:                msg -> data -> offset);
        !           584:        goto out;
        !           585:     }
        !           586: 
        !           587:     if ((parm = msg -> data -> un.get__response) -> request__id
        !           588:            != request_id) {
        !           589:        fprintf (stderr, "request-id mismatch (got %d, wanted %d)\n",
        !           590:                 parm -> request__id, request_id);
        !           591:        goto try_again;
        !           592:     }
        !           593:        
        !           594:     if (parm -> error__status != int_SNMP_error__status_noError) {
        !           595:        if (parm -> error__status != int_SNMP_error__status_noSuchName)
        !           596:            fprintf (stderr, "%s at position %d\n",
        !           597:                     snmp_error (parm -> error__status), parm -> error__index);
        !           598:        goto out;
        !           599:     }
        !           600: 
        !           601:     for (vp = parm -> variable__bindings; vp; vp = vp -> next) {
        !           602:        caddr_t  value;
        !           603:        register OI     oi;
        !           604:        register OS     os;
        !           605:        register struct type_SNMP_VarBind *v = vp -> VarBind;
        !           606:        
        !           607:        if (oid
        !           608:                && (oid -> oid_nelem > v -> name -> oid_nelem
        !           609:                        || bcmp ((char *) oid -> oid_elements,
        !           610:                                 (char *) v -> name -> oid_elements,
        !           611:                                 oid -> oid_nelem
        !           612:                                        * sizeof oid -> oid_elements[0])))
        !           613:            goto out;
        !           614: 
        !           615:        printf ("%s=", oid2ode (vp -> VarBind -> name));
        !           616:        if ((oi = name2inst (v -> name)) == NULL
        !           617:                || (os = oi -> oi_type -> ot_syntax) == NULL
        !           618:                || (*os -> os_decode) (&value, v -> value) == NOTOK)
        !           619:            vunknown (v -> value);
        !           620:        else {
        !           621:            (*os -> os_print) (value, os);
        !           622:            printf ("\n");
        !           623: 
        !           624:            (*os -> os_free) (value);
        !           625:        }
        !           626:     }
        !           627: 
        !           628:     if (pe)
        !           629:        pe_free (pe);
        !           630:     msg -> data -> offset = type_SNMP_PDUs_get__next__request;
        !           631:     request_id = ++parm -> request__id;
        !           632:     goto again;
        !           633: 
        !           634:  out: ;
        !           635:     if (oid)
        !           636:        oid_free (oid);
        !           637:     if (pe)
        !           638:        pe_free (pe);
        !           639:     if (msg)
        !           640:        free_SNMP_Message (msg);
        !           641: 
        !           642:     return OK;
        !           643: }
        !           644: 
        !           645: /*  */
        !           646: 
        !           647: static int  f_get (vec)
        !           648: char  **vec;
        !           649: {
        !           650:     (void) process (new_message (type_SNMP_PDUs_get__request, vec));
        !           651: }
        !           652: 
        !           653: /*  */
        !           654: 
        !           655: static int  f_get_next (vec)
        !           656: char  **vec;
        !           657: {
        !           658:     (void) process (new_message (type_SNMP_PDUs_get__next__request, vec));
        !           659: }
        !           660: 
        !           661: /*  */
        !           662: 
        !           663: static int  f_set (vec)
        !           664: char  **vec;
        !           665: {
        !           666:     (void) process (new_message (type_SNMP_PDUs_set__request, vec));
        !           667: }
        !           668: 
        !           669: /*  */
        !           670: 
        !           671: static char *errors[] = {
        !           672:     "noError", "tooBig", "noSuchName", "badValue", "readOnly", "genErr"
        !           673: };
        !           674: 
        !           675: 
        !           676: static char *snmp_error (i)
        !           677: int    i;
        !           678: {
        !           679:     static char buffer[BUFSIZ];
        !           680: 
        !           681:     if (0 < i && i < sizeof errors / sizeof errors[0])
        !           682:        return errors[i];
        !           683:     (void) sprintf (buffer, "error %d", i);
        !           684: 
        !           685:     return buffer;
        !           686: }
        !           687: 
        !           688: /*  */
        !           689: 
        !           690: static struct type_SNMP_Message *new_message (offset, vec)
        !           691: int    offset;
        !           692: char  **vec;
        !           693: {
        !           694:     register struct type_SNMP_Message *msg;
        !           695:     register struct type_SNMP_PDUs *pdu;
        !           696:     register struct type_SNMP_PDU *parm;
        !           697:     register struct type_SNMP_VarBindList **vp;
        !           698: 
        !           699:     if ((msg = (struct type_SNMP_Message *) calloc (1, sizeof *msg)) == NULL)
        !           700:        adios (NULLCP, "out of memory");
        !           701: 
        !           702:     msg -> version = int_SNMP_version_version__1;
        !           703: 
        !           704:     if ((msg -> community = str2qb (community, strlen (community), 1)) == NULL)
        !           705:        adios (NULLCP, "out of memory");
        !           706: 
        !           707:     if ((pdu = (struct type_SNMP_PDUs *) calloc (1, sizeof *pdu)) == NULL)
        !           708:        adios (NULLCP, "out of memory");
        !           709:     msg -> data = pdu;
        !           710: 
        !           711:     pdu -> offset = offset;
        !           712:     
        !           713: /* for now, always a PDU... */
        !           714: 
        !           715:     if ((parm = (struct type_SNMP_PDU *) calloc (1, sizeof *parm)) == NULL)
        !           716:        adios (NULLCP, "out of memory");
        !           717:     pdu -> un.get__request = parm;
        !           718: 
        !           719: #ifndef        SYS5
        !           720:     parm -> request__id = ((int) random ()) & 0x7fffffff;
        !           721: #else
        !           722:     parm -> request__id = ((int) rand ()) & 0x7fffffff;
        !           723: #endif
        !           724: 
        !           725:     vp = &parm -> variable__bindings;
        !           726:     for (vec++; *vec; vec++) {
        !           727:        register struct type_SNMP_VarBindList *bind;
        !           728:        register struct type_SNMP_VarBind *v;
        !           729: 
        !           730:        if ((bind = (struct type_SNMP_VarBindList *) calloc (1, sizeof *bind))
        !           731:                    == NULL)
        !           732:            adios (NULLCP, "out of memory");
        !           733:        *vp = bind, vp = &bind -> next;
        !           734: 
        !           735:        if ((v = (struct type_SNMP_VarBind *) calloc (1, sizeof *v)) == NULL)
        !           736:            adios (NULLCP, "out of memory");
        !           737:        bind -> VarBind = v;
        !           738: 
        !           739:        if (get_ava (v, *vec, offset) == NOTOK) {
        !           740:            free_SNMP_Message (msg);
        !           741:            return NULL;
        !           742:        }
        !           743:     }
        !           744:     
        !           745:     return msg;
        !           746: }
        !           747: 
        !           748: /*  */
        !           749: 
        !           750: static int  get_ava (v, ava, offset)
        !           751: register struct type_SNMP_VarBind *v;
        !           752: char   *ava;
        !           753: int    offset;
        !           754: {
        !           755:     int            result;
        !           756:     caddr_t value;
        !           757:     register char *cp;
        !           758:     register OI           oi;
        !           759:     register OT           ot;
        !           760:     register OS           os;
        !           761:     OID            oid;
        !           762: 
        !           763:     if (cp = index (ava, '=')) {
        !           764:        if (offset != type_SNMP_PDUs_set__request)
        !           765:            advise (NULLCP, "value unnecessary for get operation");
        !           766:        *cp++ = NULL;
        !           767:     }
        !           768:     else
        !           769:        if (offset == type_SNMP_PDUs_set__request) {
        !           770:            advise (NULLCP, "need variable=value for set operation");
        !           771:            return NOTOK;
        !           772:        }
        !           773: 
        !           774:     if ((oi = text2inst (ava)) == NULL) {
        !           775:        if (cp || (oid = text2oid (ava)) == NULL) {
        !           776:            advise (NULLCP, "unknown variable \"%s\"", ava);
        !           777:            return NOTOK;
        !           778:        }
        !           779: 
        !           780:        ot = NULLOT;
        !           781:     }
        !           782:     else
        !           783:        ot = oi -> oi_type;
        !           784: 
        !           785:     if ((v -> name = oid_cpy (oi ? oi -> oi_name : oid)) == NULLOID)
        !           786:        adios (NULLCP, "out of memory");
        !           787: 
        !           788:     if (cp == NULL) {
        !           789:        if ((v -> value = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_NULL))
        !           790:                == NULLPE)
        !           791:        adios (NULLCP, "out of memory");
        !           792:     }
        !           793:     else {
        !           794:        if ((os = ot -> ot_syntax) == NULL) {
        !           795:            advise (NULLCP, "no syntax defined for object \"%s\"", ava);
        !           796:            return NOTOK;
        !           797:        }
        !           798: 
        !           799:        if ((*os -> os_parse) (&value, cp) == NOTOK) {
        !           800:            advise (NULLCP, "invalid value for variable \"%s\": \"%s\"",
        !           801:                    ava, cp);
        !           802:            return NOTOK;
        !           803:        }
        !           804:        result = (*os -> os_encode) (value, &v -> value);
        !           805:        (*os -> os_free) (value);
        !           806: 
        !           807:        if (result == NOTOK) {
        !           808:            advise (NULLCP, "encoding error for variable \"%s\"", ava);
        !           809:            return NOTOK;
        !           810:        }       
        !           811:     }
        !           812: 
        !           813:     if (oi == NULL)
        !           814:        oid_free (oid);
        !           815: 
        !           816:     return OK;
        !           817: }
        !           818: 
        !           819: /*  */
        !           820: 
        !           821: static int  process (msg)
        !           822: struct type_SNMP_Message *msg;
        !           823: {
        !           824:     int            request_id;
        !           825:     PE     pe;
        !           826:     register struct type_SNMP_PDU *parm;
        !           827:     register struct type_SNMP_VarBindList *vp;
        !           828: 
        !           829:     if (msg == NULL)
        !           830:        return OK;
        !           831: 
        !           832:     request_id = msg -> data -> un.get__request -> request__id;
        !           833:     if (encode_SNMP_Message (&pe, 1, 0, NULLCP, msg) != NOTOK) {
        !           834:        if (watch)
        !           835:            (void) print_SNMP_Message (pe, 1, NULLIP, NULLVP, NULLCP);
        !           836: 
        !           837:        if (pe2ps (ps, pe) == NOTOK) {
        !           838:            advise (NULLCP, "pe2ps: %s", ps_error (ps -> ps_errno));
        !           839:            goto out;
        !           840:        }
        !           841:     }
        !           842:     else
        !           843:        advise (NULLCP, "encode_SNMP_Message: %s", PY_pepy);
        !           844: 
        !           845: try_again: ;
        !           846:     if (pe)
        !           847:        pe_free (pe);
        !           848:     pe = NULLPE;
        !           849:     
        !           850:     free_SNMP_Message (msg);
        !           851:     msg = NULL;
        !           852: 
        !           853:     if ((pe = ps2pe (ps)) == NULLPE) {
        !           854:        advise (NULLCP, "ps2pe: %s", ps_error (ps -> ps_errno));
        !           855:        goto out;
        !           856:     }
        !           857: 
        !           858:     if (decode_SNMP_Message (pe, 1, NULLIP, NULLVP, &msg) == NOTOK) {
        !           859:        advise (NULLCP, "decode_SNMP_Message: %s", PY_pepy);
        !           860:        goto out;
        !           861:     }
        !           862: 
        !           863:     if (watch)
        !           864:        (void) print_SNMP_Message (pe, 1, NULLIP, NULLVP, NULLCP);
        !           865: 
        !           866:     if (msg -> data -> offset != type_SNMP_PDUs_get__response) {
        !           867:        advise (NULLCP, "unexpected message type %d",
        !           868:                msg -> data -> offset);
        !           869:        goto out;
        !           870:     }
        !           871: 
        !           872:     if ((parm = msg -> data -> un.get__response) -> request__id
        !           873:            != request_id) {
        !           874:        fprintf (stderr, "request-id mismatch (got %d, wanted %d)\n",
        !           875:                 parm -> request__id, request_id);
        !           876:        goto try_again;
        !           877:     }
        !           878:        
        !           879:     if (parm -> error__status != int_SNMP_error__status_noError) {
        !           880:        fprintf (stderr, "%s at position %d\n",
        !           881:                snmp_error (parm -> error__status), parm -> error__index);
        !           882:        goto out;
        !           883:     }
        !           884: 
        !           885:     for (vp = parm -> variable__bindings; vp; vp = vp -> next) {
        !           886:        caddr_t  value;
        !           887:        register OI     oi;
        !           888:        register OS     os;
        !           889:        register struct type_SNMP_VarBind *v = vp -> VarBind;
        !           890: 
        !           891:        if ((oi = name2inst (v -> name)) == NULL) {
        !           892:            advise (NULLCP, "unknown variable \"%s\"", oid2ode (v -> name));
        !           893: no_dice: ;
        !           894:            printf ("%s=", oid2ode (v -> name));
        !           895:            vunknown (v -> value);
        !           896:            continue;
        !           897:        }
        !           898:        if ((os = oi -> oi_type -> ot_syntax) == NULL) {
        !           899:            advise (NULLCP, "unknown syntax for object \"%s\"",
        !           900:                    oi -> oi_type -> ot_text);
        !           901:            goto no_dice;
        !           902:        }
        !           903:        if ((*os -> os_decode) (&value, v -> value) == NOTOK) {
        !           904:            advise (NULLCP, "decode error for variable \"%s\"",
        !           905:                    oid2ode (v -> name));
        !           906:            goto no_dice;
        !           907:        }
        !           908: 
        !           909:        printf ("%s=", oid2ode (v -> name));
        !           910:        (*os -> os_print) (value, os);
        !           911:        printf ("\n");
        !           912: 
        !           913:        (*os -> os_free) (value);
        !           914:     }
        !           915: 
        !           916:  out: ;
        !           917:     if (pe)
        !           918:        pe_free (pe);
        !           919:     if (msg)
        !           920:        free_SNMP_Message (msg);
        !           921: 
        !           922:     return OK;
        !           923: }
        !           924: 
        !           925: /*  */
        !           926: 
        !           927: static int  f_help (vec)
        !           928: char  **vec;
        !           929: {
        !           930:     register int    i,
        !           931:                     j,
        !           932:                     w;
        !           933:     int     columns,
        !           934:             width,
        !           935:             lines;
        !           936:     register struct dispatch   *ds,
        !           937:                                *es;
        !           938: 
        !           939:     for (es = dispatches; es -> ds_name; es++)
        !           940:        continue;
        !           941:     width = helpwidth;
        !           942: 
        !           943:     if (*++vec == NULL) {
        !           944:        if ((columns = ncols (stdout) / (width = (width + 8) & ~7)) == 0)
        !           945:            columns = 1;
        !           946:        lines = ((es - dispatches) + columns - 1) / columns;
        !           947: 
        !           948:        printf ("Operations:\n");
        !           949:        for (i = 0; i < lines; i++)
        !           950:            for (j = 0; j < columns; j++) {
        !           951:                ds = dispatches + j * lines + i;
        !           952:                printf ("%s", ds -> ds_name);
        !           953:                if (ds + lines >= es) {
        !           954:                    printf ("\n");
        !           955:                    break;
        !           956:                }
        !           957:                for (w = strlen (ds -> ds_name); w < width; w = (w + 8) & ~7)
        !           958:                    (void) putchar ('\t');
        !           959:            }
        !           960:        printf ("\n");
        !           961: 
        !           962:        return OK;
        !           963:     }
        !           964: 
        !           965:     if (strcmp (*vec, "-help") == 0) {
        !           966:        printf ("help [commands ...]\n");
        !           967:        printf ("    with no arguments, lists operations which may be invoked\n");
        !           968:        printf ("    otherwise prints help for each operation given\n");
        !           969: 
        !           970:        return OK;
        !           971:     }
        !           972:     
        !           973:     for (; *vec; vec++)
        !           974:        if (strcmp (*vec, "?") == 0) {
        !           975:            for (ds = dispatches; ds -> ds_name; ds++)
        !           976:                printf ("%-*s\t- %s\n", width, ds -> ds_name, ds -> ds_help);
        !           977: 
        !           978:            break;
        !           979:        }
        !           980:        else
        !           981:            if (ds = getds (*vec))
        !           982:                printf ("%-*s\t- %s\n", width, ds -> ds_name, ds -> ds_help);
        !           983: 
        !           984:     return OK;
        !           985: }
        !           986: 
        !           987: /*  */
        !           988: 
        !           989: static int  f_quit (vec)
        !           990: char  **vec;
        !           991: {
        !           992:     if (vec && *++vec != NULL && strcmp (*vec, "-help") == 0) {
        !           993:        printf ("quit\n");
        !           994:        printf ("    terminate fred\n");
        !           995: 
        !           996:        return OK;
        !           997:     }
        !           998: 
        !           999:     return DONE;
        !          1000: }
        !          1001: 
        !          1002: /*  */
        !          1003: 
        !          1004: static int  f_status (vec)
        !          1005: char  **vec;
        !          1006: {
        !          1007:     if (*++vec != NULL && strcmp (*vec, "-help") == 0) {
        !          1008:        printf ("status\n");
        !          1009:        printf ("    report status\n");
        !          1010: 
        !          1011:        return OK;
        !          1012:     }
        !          1013: 
        !          1014:     printf ("Connected to %s using community \"%s\"\n",
        !          1015:            taddr2str (&snmp_ta), community);
        !          1016: 
        !          1017:     return OK;
        !          1018: }
        !          1019: 
        !          1020: /*    SYNTAX */
        !          1021: 
        !          1022: static char *ifType[] = {
        !          1023:     "other", "regular1822", "hdh1822", "ddn-x25", "rfc877-x25",
        !          1024:     "ethernet-csmacd", "iso88023-csmacd", "iso88024-tokenBus",
        !          1025:     "iso88025-tokenRing", "iso88026-man", "starLan", "proteon-10Mbit",
        !          1026:     "proteon-80Mbit", "hyperchannel", "fddi", "lapb", "sdlc", "t1-carrier",
        !          1027:      "cept", "basicISDN", "primaryISDN", "propPointToPointSerial",
        !          1028:     "ppp", "softwareLoopback", "eon", "ethernet-3Mbit",
        !          1029:     "nsip", "slip"
        !          1030: };
        !          1031: 
        !          1032: static char *ifStatus[] = {
        !          1033:     "up", "down", "testing"
        !          1034: };
        !          1035: 
        !          1036: static char *ipForwarding[] = {
        !          1037:     "gateway", "host"
        !          1038: };
        !          1039: 
        !          1040: static char *routeType[] = {
        !          1041:     "other", "invalid", "direct", "remote"
        !          1042: };
        !          1043: 
        !          1044: static char *ipRouteProto[] = {
        !          1045:     "other", "local", "netmgmt", "icmp", "egp", "ggp", "hello", "rip", "is-is",
        !          1046:     "es-is", "ciscoIgrp", "bbnSpfIgp", "ospf", "bgp"
        !          1047: };
        !          1048: 
        !          1049: static char *netToMediaType[] = {
        !          1050:     "other", "invalid", "dynamic", "static"
        !          1051: };
        !          1052: 
        !          1053: static char *tcpRtoAlgorithm[] = {
        !          1054:     "other", "constant", "rsre", "vanj"
        !          1055: };
        !          1056: 
        !          1057: static char *tcpConnState[] = {
        !          1058:     "closed", "listen", "synSent", "synReceived", "established", "finWait1",
        !          1059:     "finWait2", "closeWait", "lastAck", "closing", "timewait"
        !          1060: };
        !          1061: 
        !          1062: static char *egpNeighState[] = {
        !          1063:     "idle", "acquisition", "down", "up", "cease"
        !          1064: };
        !          1065: 
        !          1066: static char *egpNeighMode[] = {
        !          1067:     "active", "passive"
        !          1068: };
        !          1069: 
        !          1070: static char *egpNeighEventTrigger[] = {
        !          1071:     "start", "stop"
        !          1072: };
        !          1073: 
        !          1074: static char *enabled[] = {
        !          1075:     "enabled", "disabled"
        !          1076: };
        !          1077: 
        !          1078: static char *clnpForwarding[] = {
        !          1079:     "is", "es"
        !          1080: };
        !          1081: 
        !          1082: static char *clnpRouteProto[] = {
        !          1083:     "other", "local", "netmgmt", "", "", "", "", "", "is-is", "",
        !          1084:     "ciscoIgrp", "bbnSpfIgp", "ospf", "bgp"
        !          1085: };
        !          1086: 
        !          1087: 
        !          1088: static char *status[] = {
        !          1089:     "valid", "invalid"
        !          1090: };
        !          1091: 
        !          1092: static char *smuxPstatus[] = {
        !          1093:     "valid", "invalid", "connecting"
        !          1094: };
        !          1095: 
        !          1096: 
        !          1097: static struct ivar {
        !          1098:     char   *iv_object;
        !          1099: 
        !          1100:     char  **iv_values;
        !          1101:     int            iv_nvalue;
        !          1102: } ivars[] = {
        !          1103:     "ifType", ifType,
        !          1104:        sizeof ifType / sizeof ifType[0],
        !          1105:     
        !          1106:     "ifAdminStatus", ifStatus,
        !          1107:        sizeof ifStatus / sizeof ifStatus[0],
        !          1108:     
        !          1109:     "ifOperStatus", ifStatus,
        !          1110:        sizeof ifStatus / sizeof ifStatus[0],
        !          1111: 
        !          1112:     "ipForwarding", ipForwarding,
        !          1113:        sizeof ipForwarding / sizeof ipForwarding[0],
        !          1114: 
        !          1115:     "ipRouteType", routeType,
        !          1116:        sizeof routeType / sizeof routeType[0],
        !          1117: 
        !          1118:     "ipRouteProto", ipRouteProto,
        !          1119:        sizeof ipRouteProto / sizeof ipRouteProto[0],
        !          1120: 
        !          1121:     "ipNetToMediaType", netToMediaType,
        !          1122:        sizeof netToMediaType / sizeof netToMediaType[0],
        !          1123: 
        !          1124:     "tcpRtoAlgorithm", tcpRtoAlgorithm,
        !          1125:        sizeof tcpRtoAlgorithm / sizeof tcpRtoAlgorithm[0],
        !          1126: 
        !          1127:     "tcpConnState", tcpConnState,
        !          1128:        sizeof tcpConnState / sizeof tcpConnState[0],
        !          1129: 
        !          1130:     "egpNeighState", egpNeighState,
        !          1131:        sizeof egpNeighState / sizeof egpNeighState[0],
        !          1132: 
        !          1133:     "egpNeighMode", egpNeighMode,
        !          1134:        sizeof egpNeighMode / sizeof egpNeighMode[0],
        !          1135: 
        !          1136:     "egpNeighEventTrigger", egpNeighEventTrigger,
        !          1137:        sizeof egpNeighEventTrigger / sizeof egpNeighEventTrigger[0],
        !          1138: 
        !          1139:     "snmpEnableAuthTraps", enabled,
        !          1140:        sizeof enabled / sizeof enabled[0],
        !          1141: 
        !          1142:     "clnpForwarding", clnpForwarding,
        !          1143:        sizeof clnpForwarding / sizeof clnpForwarding[0],
        !          1144: 
        !          1145:     "clnpRouteType", routeType,
        !          1146:        sizeof routeType / sizeof routeType[0],
        !          1147: 
        !          1148:     "clnpRouteProto", clnpRouteProto,
        !          1149:        sizeof clnpRouteProto / sizeof clnpRouteProto[0],
        !          1150: 
        !          1151:     "clnpNetToMediaType", netToMediaType,
        !          1152:        sizeof netToMediaType / sizeof netToMediaType[0],
        !          1153: 
        !          1154:     "clnpMediaToNetType", netToMediaType,
        !          1155:        sizeof netToMediaType / sizeof netToMediaType[0],
        !          1156: 
        !          1157:     "viewPrimType", status,
        !          1158:        sizeof status / sizeof status[0],
        !          1159: 
        !          1160:     "viewAclType", status,
        !          1161:        sizeof status / sizeof status[0],
        !          1162: 
        !          1163:     "viewTrapType", status,
        !          1164:        sizeof status / sizeof status[0],
        !          1165: 
        !          1166:     "viewTranType", status,
        !          1167:        sizeof status / sizeof status[0],
        !          1168: 
        !          1169:     "smuxPstatus", smuxPstatus,
        !          1170:        sizeof smuxPstatus / sizeof smuxPstatus[0],
        !          1171: 
        !          1172:     "smuxTstatus", status,
        !          1173:        sizeof status / sizeof status[0],
        !          1174: 
        !          1175:     "unixNetstat", enabled,
        !          1176:        sizeof enabled / sizeof enabled[0],
        !          1177: 
        !          1178:     NULL
        !          1179: };
        !          1180: 
        !          1181: /*  */
        !          1182: 
        !          1183: static int  enum_print (x, os)
        !          1184: integer *x;
        !          1185: OS     os;
        !          1186: {
        !          1187:     int            i = *x;
        !          1188: 
        !          1189:     if (i <= 0 || i > os -> os_data2)
        !          1190:        printf ("unknown(%d)", i);
        !          1191:     else
        !          1192:        printf ("%s(%d)", os -> os_data1[i - 1], i);
        !          1193: }
        !          1194: 
        !          1195: 
        !          1196: static moresyntax () {
        !          1197:     register struct ivar *iv;
        !          1198:     register OT           ot;
        !          1199:     register OS           os;
        !          1200: 
        !          1201:     for (iv = ivars; iv -> iv_object; iv++)
        !          1202:        if (ot = text2obj (iv -> iv_object)) {
        !          1203:            if ((os = ot -> ot_syntax) == NULL) {
        !          1204:                advise (NULLCP, "no syntax defined for object \"%s\"",
        !          1205:                        iv -> iv_object);
        !          1206:                continue;
        !          1207:            }
        !          1208: 
        !          1209:            (void) add_syntax (iv -> iv_object, os -> os_encode,
        !          1210:                               os -> os_decode, os -> os_free, os -> os_parse,
        !          1211:                               enum_print);
        !          1212:            if ((os = text2syn (iv -> iv_object)) == NULL)
        !          1213:                adios (NULLCP, "lost syntax for object \"%s\"",
        !          1214:                       iv -> iv_object);
        !          1215:            ot -> ot_syntax = os;
        !          1216:            os -> os_data1 = iv -> iv_values;
        !          1217:            os -> os_data2 = iv -> iv_nvalue;
        !          1218:        }
        !          1219:        else
        !          1220:            advise (NULLCP, "no \"%s\" object", iv -> iv_object);
        !          1221: }
        !          1222: 
        !          1223: /*    MISCELLANY */
        !          1224: 
        !          1225: static arginit (vec)
        !          1226: char    **vec;
        !          1227: {
        !          1228:     int            w;
        !          1229:     register char  *ap,
        !          1230:                   *pp;
        !          1231:     register struct dispatch *ds;
        !          1232: #ifdef TCP
        !          1233:     int            port;
        !          1234:     struct sockaddr_in in_socket;
        !          1235:     register struct sockaddr_in *isock = &in_socket;
        !          1236:     register struct hostent *hp;
        !          1237:     register struct servent *sp;
        !          1238: #endif
        !          1239:     register struct TSAPaddr *ta = &snmp_ta,
        !          1240:                             *tz;
        !          1241:     register struct NSAPaddr *na = ta -> ta_addrs;
        !          1242: 
        !          1243:     if (myname = rindex (*vec, '/'))
        !          1244:        myname++;
        !          1245:     if (myname == NULL || *myname == NULL)
        !          1246:        myname = *vec;
        !          1247: 
        !          1248:     isodetailor (myname, 1);
        !          1249: 
        !          1250:     if (ontty = isatty (fileno (stdin)))
        !          1251:        verbose++;
        !          1252: 
        !          1253:     if ((sp = getservbyname ("snmp", "udp")) == NULL)
        !          1254:        advise (NULLCP, "udp/snmp: unknown service");
        !          1255: 
        !          1256:     bzero ((char *) ta, sizeof *ta);
        !          1257: #ifdef TCP
        !          1258:     na -> na_stack = NA_TCP;
        !          1259:     na -> na_community = ts_comm_tcp_default;
        !          1260:     (void) strncpy (na -> na_domain, getlocalhost (),
        !          1261:                    sizeof na -> na_domain - 1);
        !          1262:     na -> na_port = sp ? sp -> s_port : htons ((u_short) 161);
        !          1263:     na -> na_tset = NA_TSET_UDP;
        !          1264:     ta -> ta_naddr = 1;
        !          1265: #endif
        !          1266: 
        !          1267:     for (vec++; ap = *vec; vec++) {
        !          1268:        if (*ap == '-') {
        !          1269:            while (*++ap)
        !          1270:                switch (*ap) {
        !          1271:                    case 'a':           /* e.g., NS+0504030201 */
        !          1272:                        if ((pp = *++vec) == NULL || *pp == '-')
        !          1273:                            adios (NULLCP, "usage: %s -a agent", myname);
        !          1274: #ifdef TCP
        !          1275:                        if (hp = gethostbystring (pp)) {
        !          1276:                            if (na -> na_stack != NA_TCP)
        !          1277:                                adios (NULLCP, "use -a at most once...");
        !          1278:                            inaddr_copy (hp, isock);
        !          1279:                            (void) strncpy (na -> na_domain,
        !          1280:                                            inet_ntoa (isock -> sin_addr),
        !          1281:                                            sizeof na -> na_domain - 1);
        !          1282:                        }
        !          1283:                        else
        !          1284: #endif
        !          1285:                            if ((tz = str2taddr (pp)) && tz -> ta_naddr > 0) {
        !          1286:                                *ta = *tz;      /* struct copy */
        !          1287:                                if (na -> na_stack == NA_TCP) {
        !          1288:                                    if (na -> na_port == 0)
        !          1289:                                        na -> na_port = sp ? sp -> s_port
        !          1290:                                                       : htons ((u_short) 161);
        !          1291:                                    na -> na_tset = NA_TSET_UDP;
        !          1292:                                }
        !          1293:                            }
        !          1294:                            else
        !          1295:                                adios (NULLCP, "%s: unknown host", pp);
        !          1296:                        break;
        !          1297: 
        !          1298: #ifdef TCP
        !          1299:                    case 'p':
        !          1300:                        if ((pp = *++vec) == NULL
        !          1301:                                || *pp == '-'
        !          1302:                                || (port = atoi (pp)) <= 0)
        !          1303:                            adios (NULLCP, "usage: %s -p portno", myname);
        !          1304:                        if (na -> na_stack != NA_TCP)
        !          1305:                            adios (NULLCP, "-p not allowed with %s",
        !          1306:                                   taddr2str (ta));
        !          1307:                        na -> na_port = htons ((u_short) port);
        !          1308:                        break;
        !          1309: #endif
        !          1310: 
        !          1311:                    case 'c':
        !          1312:                        if ((pp = *++vec) == NULL || *pp == '-')
        !          1313:                            adios (NULLCP, "usage: %s -c community", myname);
        !          1314:                        community = pp;
        !          1315:                        break;
        !          1316: 
        !          1317:                    case 'd':
        !          1318:                        debug++;
        !          1319:                        break;
        !          1320: 
        !          1321:                    case 'v':
        !          1322:                        verbose++;
        !          1323:                        break;
        !          1324: 
        !          1325:                    case 'w':
        !          1326:                        watch++;
        !          1327:                        break;
        !          1328: 
        !          1329:                    case 'f':
        !          1330:                        if ((pp = *++vec) == NULL || *pp == '-')
        !          1331:                            adios (NULLCP, "usage: %s -f file", myname);
        !          1332:                        defs = pp;
        !          1333:                        break;
        !          1334:                        
        !          1335:                    default:
        !          1336:                        adios (NULLCP, "unknown switch -%c", *ap);
        !          1337:                }
        !          1338:            continue;
        !          1339:        }
        !          1340:        if (op == NULL) {
        !          1341:            op = vec;
        !          1342:            break;
        !          1343:        }
        !          1344:     }
        !          1345: 
        !          1346:     helpwidth = 0;
        !          1347:     for (ds = dispatches; ds -> ds_name; ds++)
        !          1348:        if ((w = strlen (ds -> ds_name)) > helpwidth)
        !          1349:            helpwidth = w;
        !          1350: 
        !          1351:     if (ta -> ta_naddr == 0)
        !          1352:        adios (NULLCP, "usage: %s -a string", myname);
        !          1353:     switch (na -> na_stack) {
        !          1354:        case NA_TCP:
        !          1355: #ifdef TCP
        !          1356:            {
        !          1357:                struct sockaddr_in lo_socket;
        !          1358:                register struct sockaddr_in *lsock = &lo_socket;
        !          1359: 
        !          1360:                bzero ((char *) lsock, sizeof *lsock);
        !          1361:                if ((hp = gethostbystring (pp = getlocalhost ())) == NULL)
        !          1362:                    adios (NULLCP, "%s: unknown host", pp);
        !          1363:                lsock -> sin_family = hp -> h_addrtype;
        !          1364:                inaddr_copy (hp, lsock);
        !          1365:                if ((sd = start_udp_client (lsock, 0, 0, 0)) == NOTOK)
        !          1366:                    adios ("failed", "start_udp_client");
        !          1367: 
        !          1368:                bzero ((char *) isock, sizeof *isock);
        !          1369:                if ((hp = gethostbystring (na -> na_domain)) == NULL)
        !          1370:                    adios (NULLCP, "%s: unknown host", na -> na_domain);
        !          1371:                isock -> sin_family = hp -> h_addrtype;
        !          1372:                isock -> sin_port = na -> na_port;
        !          1373:                inaddr_copy (hp, isock);
        !          1374: 
        !          1375:                if (join_udp_server (sd, isock) == NOTOK)
        !          1376:                    adios ("failed", "join_udp_server");
        !          1377: 
        !          1378:                if ((ps = ps_alloc (dg_open)) == NULLPS
        !          1379:                        || dg_setup (ps, sd, MAXDGRAM, read_udp_socket,
        !          1380:                                     write_udp_socket) == NOTOK) {
        !          1381:                    if (ps == NULLPS)
        !          1382:                        adios (NULLCP, "ps_alloc: out of memory");
        !          1383:                    else
        !          1384:                        adios (NULLCP, "dg_setup: %s",
        !          1385:                               ps_error (ps -> ps_errno));
        !          1386:                }
        !          1387:            }
        !          1388:            break;
        !          1389: #else
        !          1390:            adios (NULLCP, "UDP support not configured");
        !          1391: #endif
        !          1392: 
        !          1393:        case NA_X25:
        !          1394: #ifdef X25
        !          1395:            goto cots;
        !          1396: #else
        !          1397:            adios (NULLCP, "X.25 support not configured");
        !          1398: #endif
        !          1399:            
        !          1400:        case NA_NSAP:
        !          1401: #ifdef CLTS
        !          1402:            {
        !          1403:                union sockaddr_osi lo_socket;
        !          1404:                register union sockaddr_osi *lsock = &lo_socket;
        !          1405: 
        !          1406:                bzero ((char *) lsock, sizeof *lsock);
        !          1407:                if ((sd = start_clts_client (lsock, 0, 0, 0)) == NOTOK)
        !          1408:                    adios ("failed", "start_clts_client");
        !          1409: 
        !          1410:                (void) gen2tp4 (ta, lsock);
        !          1411:                if (join_clts_server (sd, lsock) == NOTOK)
        !          1412:                    adios ("failed", "join_udp_server");
        !          1413: 
        !          1414:                if ((ps = ps_alloc (dg_open)) == NULLPS
        !          1415:                        || dg_setup (ps, sd, MAXDGRAM, read_clts_socket,
        !          1416:                                     write_clts_socket) == NOTOK) {
        !          1417:                    if (ps == NULLPS)
        !          1418:                        adios (NULLCP, "ps_alloc: out of memory");
        !          1419:                    else
        !          1420:                        adios (NULLCP, "dg_setup: %s",
        !          1421:                               ps_error (ps -> ps_errno));
        !          1422:                }
        !          1423:            }
        !          1424:            break;
        !          1425: #else
        !          1426: #ifdef TP4
        !          1427:            goto cots;
        !          1428: #else
        !          1429:            adios (NULLCP, "TP4 support not configured");
        !          1430: #endif
        !          1431: #endif
        !          1432: 
        !          1433:        default:
        !          1434:            adios (NULLCP, "unknown network type 0x%x", na -> na_stack);
        !          1435:            /* NOT REACHED */
        !          1436: 
        !          1437: #ifdef COTS
        !          1438: cots: ;
        !          1439:            {
        !          1440:                struct TSAPconnect tcs;
        !          1441:                register struct TSAPconnect *tc = &tcs;
        !          1442:                struct TSAPdisconnect tds;
        !          1443:                register struct TSAPdisconnect *td = &tds;
        !          1444: 
        !          1445:                if (verbose) {
        !          1446:                    fprintf (stderr, "%s... ", taddr2str (ta));
        !          1447:                    (void) fflush (stderr);
        !          1448:                }
        !          1449:                if (TConnRequest (NULLTA, ta, 0, NULLCP, 0, NULLQOS, tc, td)
        !          1450:                        == NOTOK) {
        !          1451:                    if (verbose)
        !          1452:                        fprintf (stderr," failed\n");
        !          1453:                    adios (NULLCP, td -> td_cc > 0
        !          1454:                                        ? "T-CONNECT.REQUEST: [%s] %*.*s"
        !          1455:                                        : "T-CONNECT.REQUEST: [%s]",
        !          1456:                           TErrString (td -> td_reason),
        !          1457:                           td -> td_cc, td -> td_cc, td -> td_data);
        !          1458:                }
        !          1459:                fprintf (stderr, "connected\n");
        !          1460: 
        !          1461:                if ((ps = ps_alloc (dg_open)) == NULLPS
        !          1462:                        || dg_setup (ps, sd = tc -> tc_sd, MAXDGRAM, ts_read,
        !          1463:                                     ts_write) == NOTOK) {
        !          1464:                    if (ps == NULLPS)
        !          1465:                        adios (NULLCP, "ps_alloc: out of memory");
        !          1466:                    else
        !          1467:                        adios (NULLCP, "dg_setup: %s",
        !          1468:                               ps_error (ps -> ps_errno));
        !          1469:                }
        !          1470:            }
        !          1471:            break;
        !          1472: #endif
        !          1473:     }
        !          1474: 
        !          1475: #ifdef SYS5
        !          1476:     (void) srand ((unsigned int) time ((long *) 0));
        !          1477: #else
        !          1478:     (void) srandom ((int) time ((long *) 0));
        !          1479: #endif
        !          1480: 
        !          1481:     ps_len_strategy = PS_LEN_LONG;
        !          1482: 
        !          1483:     if (readobjects (defs) == NOTOK)
        !          1484:        adios (NULLCP, "readobjects: %s", PY_pepy);
        !          1485:     moresyntax ();
        !          1486: }
        !          1487: 
        !          1488: /*    INTERACTIVE */
        !          1489: 
        !          1490: static int  getline (prompt, buffer)
        !          1491: char   *prompt,
        !          1492:        *buffer;
        !          1493: {
        !          1494:     register int    i;
        !          1495:     register char  *cp,
        !          1496:                    *ep;
        !          1497:     static int  sticky = 0;
        !          1498: 
        !          1499:     if (interrupted) {
        !          1500:        interrupted = 0;
        !          1501:        return NOTOK;
        !          1502:     }
        !          1503: 
        !          1504:     if (sticky) {
        !          1505:        sticky = 0;
        !          1506:        return NOTOK;
        !          1507:     }
        !          1508: 
        !          1509:     switch (setjmp (intrenv)) {
        !          1510:        case OK:
        !          1511:            armed++;
        !          1512:            break;
        !          1513: 
        !          1514:        case NOTOK:
        !          1515:            if (ontty)
        !          1516:                printf ("\n");  /* and fall */
        !          1517:        default:
        !          1518:            armed = 0;
        !          1519:            return NOTOK;
        !          1520:     }
        !          1521:        
        !          1522:     if (ontty) {
        !          1523:        printf (prompt, myname);
        !          1524:        (void) fflush (stdout);
        !          1525:     }
        !          1526: 
        !          1527:     for (ep = (cp = buffer) + BUFSIZ - 1; (i = getchar ()) != '\n';) {
        !          1528:        if (i == EOF) {
        !          1529:            if (ontty)
        !          1530:                printf ("\n");
        !          1531:            clearerr (stdin);
        !          1532:            if (cp == buffer)
        !          1533:                longjmp (intrenv, DONE);
        !          1534: 
        !          1535:            sticky++;
        !          1536:            break;
        !          1537:        }
        !          1538: 
        !          1539:        if (cp < ep)
        !          1540:            *cp++ = i;
        !          1541:     }
        !          1542:     *cp = NULL;
        !          1543: 
        !          1544:     armed = 0;
        !          1545:     
        !          1546:     return OK;
        !          1547: }
        !          1548: 
        !          1549: /*  */
        !          1550: 
        !          1551: /* ARGSUSED */
        !          1552: 
        !          1553: static SFD intrser (sig)
        !          1554: int    sig;
        !          1555: {
        !          1556: #ifndef        BSDSIGS
        !          1557:     (void) signal (SIGINT, intrser);
        !          1558: #endif
        !          1559: 
        !          1560:     if (armed)
        !          1561:        longjmp (intrenv, NOTOK);
        !          1562: 
        !          1563:     interrupted++;
        !          1564: }
        !          1565: 
        !          1566: /*  */
        !          1567: 
        !          1568: #ifndef        TIOCGWINSZ
        !          1569: /* ARGSUSED */
        !          1570: #endif
        !          1571: 
        !          1572: static int  ncols (fp)
        !          1573: FILE *fp;
        !          1574: {
        !          1575: #ifdef TIOCGWINSZ
        !          1576:     int            i;
        !          1577:     struct winsize ws;
        !          1578: 
        !          1579:     if (ioctl (fileno (fp), TIOCGWINSZ, (char *) &ws) != NOTOK
        !          1580:            && (i = ws.ws_col) > 0)
        !          1581:        return i;
        !          1582: #endif
        !          1583: 
        !          1584:     return 80;
        !          1585: }
        !          1586: 
        !          1587: /*    ERRORS */
        !          1588: 
        !          1589: #ifndef        lint
        !          1590: void   _advise ();
        !          1591: 
        !          1592: 
        !          1593: static void  adios (va_alist)
        !          1594: va_dcl
        !          1595: {
        !          1596:     va_list ap;
        !          1597: 
        !          1598:     va_start (ap);
        !          1599: 
        !          1600:     _advise (ap);
        !          1601: 
        !          1602:     va_end (ap);
        !          1603: 
        !          1604:     _exit (1);
        !          1605: }
        !          1606: #else
        !          1607: /* VARARGS */
        !          1608: 
        !          1609: static void  adios (what, fmt)
        !          1610: char   *what,
        !          1611:        *fmt;
        !          1612: {
        !          1613:     adios (what, fmt);
        !          1614: }
        !          1615: #endif
        !          1616: 
        !          1617: 
        !          1618: #ifndef        lint
        !          1619: static void  advise (va_alist)
        !          1620: va_dcl
        !          1621: {
        !          1622:     va_list ap;
        !          1623: 
        !          1624:     va_start (ap);
        !          1625: 
        !          1626:     _advise (ap);
        !          1627: 
        !          1628:     va_end (ap);
        !          1629: }
        !          1630: 
        !          1631: 
        !          1632: static void  _advise (ap)
        !          1633: va_list        ap;
        !          1634: {
        !          1635:     char    buffer[BUFSIZ];
        !          1636: 
        !          1637:     asprintf (buffer, ap);
        !          1638: 
        !          1639:     (void) fflush (stdout);
        !          1640: 
        !          1641:     fprintf (stderr, "%s: ", myname);
        !          1642:     (void) fputs (buffer, stderr);
        !          1643:     (void) fputc ('\n', stderr);
        !          1644: 
        !          1645:     (void) fflush (stderr);
        !          1646: }
        !          1647: #else
        !          1648: /* VARARGS */
        !          1649: 
        !          1650: static void  advise (what, fmt)
        !          1651: char   *what,
        !          1652:        *fmt;
        !          1653: {
        !          1654:     advise (what, fmt);
        !          1655: }
        !          1656: #endif

unix.superglobalmegacorp.com

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