Annotation of 43BSDReno/contrib/isode-beta/snmp/syntax.c, revision 1.1.1.1

1.1       root        1: /* syntax.c - SMI syntax handling */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/snmp/RCS/syntax.c,v 7.8 90/07/09 14:49:41 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/snmp/RCS/syntax.c,v 7.8 90/07/09 14:49:41 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:       syntax.c,v $
                     17:  * Revision 7.8  90/07/09  14:49:41  mrose
                     18:  * sync
                     19:  * 
                     20:  * Revision 7.7  90/04/18  08:52:03  mrose
                     21:  * oid_normalize
                     22:  * 
                     23:  * Revision 7.6  90/04/08  03:23:20  mrose
                     24:  * touch-up
                     25:  * 
                     26:  * Revision 7.5  90/03/23  17:27:35  mrose
                     27:  * update
                     28:  * 
                     29:  * Revision 7.4  90/03/08  08:05:25  mrose
                     30:  * touch-up
                     31:  * 
                     32:  * Revision 7.3  90/02/19  19:23:14  mrose
                     33:  * again
                     34:  * 
                     35:  * Revision 7.2  90/02/19  19:17:11  mrose
                     36:  * again
                     37:  * 
                     38:  * Revision 7.1  90/01/11  18:34:48  mrose
                     39:  * real-sync
                     40:  * 
                     41:  * Revision 7.0  89/11/23  22:23:32  mrose
                     42:  * Release 6.0
                     43:  * 
                     44:  */
                     45: 
                     46: /*
                     47:  *                               NOTICE
                     48:  *
                     49:  *    Acquisition, use, and distribution of this module and related
                     50:  *    materials are subject to the restrictions of a license agreement.
                     51:  *    Consult the Preface in the User's Manual for the full terms of
                     52:  *    this agreement.
                     53:  *
                     54:  */
                     55: 
                     56: 
                     57: #include <ctype.h>
                     58: #include <stdio.h>
                     59: #include "SNMP-types.h"
                     60: #include "objects.h"
                     61: #include "tailor.h"
                     62: 
                     63: #include "internet.h"
                     64: #include "clnp.h"
                     65: 
                     66: /*    DATA */
                     67: 
                     68: #define        MAXSYN  50
                     69: 
                     70: static object_syntax syntaxes[MAXSYN + 1];
                     71: static OS    synlast = syntaxes;
                     72: 
                     73: 
                     74: #if    defined(sun) || defined(BSD44)
                     75: #define        HAVE_STRTOL
                     76: 
                     77: long   strtol ();
                     78: #endif
                     79: 
                     80: 
                     81: /*    INTEGER */
                     82: 
                     83: static int  integer_encode (x, pe)
                     84: integer        *x;
                     85: PE     *pe;
                     86: {
                     87:     if ((*pe = int2prim (*x)) == NULLPE)
                     88:        return NOTOK;
                     89: 
                     90:     return OK;
                     91: }
                     92: 
                     93: 
                     94: static int  integer_decode (x, pe)
                     95: integer **x;
                     96: PE     pe;
                     97: {
                     98:     integer    i = prim2num (pe);
                     99: 
                    100:     if (i == NOTOK && pe -> pe_errno != PE_ERR_NONE)
                    101:        return NOTOK;
                    102:     if ((*x = (integer *) malloc (sizeof **x)) == NULL)
                    103:        return NOTOK;
                    104:     **x = i;
                    105: 
                    106:     return OK;
                    107: }
                    108: 
                    109: 
                    110: static int  integer_free (x)
                    111: integer *x;
                    112: {
                    113:     free ((char *) x);
                    114: }
                    115: 
                    116: 
                    117: static int  integer_parse (x, s)
                    118: integer **x;
                    119: char   *s;
                    120: {
                    121:     long    l;
                    122: #ifdef HAVE_STRTOL
                    123:     char   *cp;
                    124: #endif
                    125:     
                    126: #ifdef HAVE_STRTOL
                    127:     if ((l = strtol (s, &cp, 0)) == 0L && cp == s)
                    128:        return NOTOK;
                    129: #else
                    130:     if (sscanf (s, "%ld", &l) != 1)
                    131:        return NOTOK;
                    132: #endif
                    133:     if ((*x = (integer *) malloc (sizeof **x)) == NULL)
                    134:        return NOTOK;
                    135:     **x = (integer) l;
                    136: 
                    137:     return OK;
                    138: }
                    139: 
                    140: 
                    141: /* ARGSUSED */
                    142: 
                    143: static int  integer_print (x, os)
                    144: integer *x;
                    145: OS     os;
                    146: {
                    147:     printf ("%d", *x);
                    148: }
                    149: 
                    150: 
                    151: /* ARGSUSED */
                    152: 
                    153: static int  services_print (x, os)
                    154: integer *x;
                    155: OS     os;
                    156: {
                    157:     printf ("%s", sprintb (*x,
                    158:                           "\020\01physical\02datalink/subnetwork\03internet\04transport\05session\06presentation\07application"));
                    159: }
                    160: 
                    161: 
                    162: /* ARGSUSED */
                    163: 
                    164: static int  privs_print (x, os)
                    165: integer *x;
                    166: OS     os;
                    167: {
                    168:     printf ("%s", sprintb (*x,
                    169:                           "\020\01get\02get-next\03get-response\04set\05trap"));
                    170: }
                    171: 
                    172: 
                    173: static add_integer ()
                    174: {
                    175:     (void) add_syntax ("INTEGER", integer_encode, integer_decode, integer_free,
                    176:                integer_parse, integer_print);
                    177:     (void) add_syntax ("Services", integer_encode, integer_decode,
                    178:                       integer_free, integer_parse, services_print);
                    179:     (void) add_syntax ("Privileges", integer_encode, integer_decode,
                    180:                       integer_free, integer_parse, privs_print);
                    181: }
                    182: 
                    183: /*    OCTET STRING */
                    184: 
                    185: static int  string_encode (x, pe)
                    186: struct qbuf *x;
                    187: PE     *pe;
                    188: {
                    189:     if ((*pe = qb2prim_aux (x, PE_CLASS_UNIV, PE_PRIM_OCTS, 0)) == NULLPE)
                    190:        return NOTOK;
                    191: 
                    192:     return OK;
                    193: }
                    194: 
                    195: 
                    196: static int  string_decode (x, pe)
                    197: struct qbuf **x;
                    198: PE     pe;
                    199: {
                    200:     struct qbuf *qb = prim2qb (pe);
                    201: 
                    202:     if (qb == NULL)
                    203:        return NOTOK;
                    204:     *x = qb;
                    205: 
                    206:     return OK;
                    207: }
                    208: 
                    209: 
                    210: static int  string_parse (x, s)
                    211: struct qbuf **x;
                    212: char   *s;
                    213: {
                    214:     struct qbuf *qb = str2qb (s, strlen (s), 1);
                    215: 
                    216:     if (qb == NULL)
                    217:        return NOTOK;
                    218:     *x = qb;
                    219: 
                    220:     return OK;    
                    221: }
                    222: 
                    223: 
                    224: /* ARGSUSED */
                    225: 
                    226: static int  string_print (x, os)
                    227: struct qbuf *x;
                    228: OS     os;
                    229: {
                    230:     register char *cp,
                    231:                  *ep;
                    232:     char   *p;
                    233:     register struct qbuf *qb;
                    234: 
                    235:     p = "";
                    236:     for (qb = x -> qb_forw; qb != x; qb = qb -> qb_forw)
                    237:        for (ep = (cp = qb -> qb_data) + qb -> qb_len; cp < ep; cp++) {
                    238:            printf ("%s%02x", p, *cp & 0xff);
                    239:            p = ":";
                    240:        }
                    241: }
                    242: 
                    243: 
                    244: /* ARGSUSED */
                    245: 
                    246: static int  string_display (x, os)
                    247: struct qbuf *x;
                    248: OS     os;
                    249: {
                    250:     register struct qbuf *qb;
                    251: 
                    252:     printf ("\"");
                    253:     for (qb = x -> qb_forw; qb != x; qb = qb -> qb_forw)
                    254:        printf ("%*.*s", qb -> qb_len, qb -> qb_len, qb -> qb_data);
                    255:     printf ("\"");
                    256: }
                    257: 
                    258: 
                    259: static add_string ()
                    260: {
                    261:     (void) add_syntax ("OctetString", string_encode, string_decode, qb_free,
                    262:                string_parse, string_print);
                    263:     (void) add_syntax ("DisplayString", string_encode, string_decode, qb_free,
                    264:                string_parse, string_display);
                    265: }
                    266: 
                    267: /*    OBJECT IDENTIFIER */
                    268: 
                    269: static int  object_encode (x, pe)
                    270: OID    x;
                    271: PE     *pe;
                    272: {
                    273:     if ((*pe = oid2prim (x)) == NULLPE)
                    274:        return NOTOK;
                    275: 
                    276:     return OK;
                    277: }
                    278: 
                    279: 
                    280: static int  object_decode (x, pe)
                    281: OID    *x;
                    282: PE     pe;
                    283: {
                    284:     OID    oid = prim2oid (pe);
                    285: 
                    286:     if (oid == NULLOID || (*x = oid_cpy (oid)) == NULLOID)
                    287:        return NOTOK;
                    288: 
                    289:     return OK;
                    290: }
                    291: 
                    292: 
                    293: static int  object_parse (x, s)
                    294: OID   *x;
                    295: char   *s;
                    296: {
                    297:     OID            oid = text2oid (s);
                    298: 
                    299:     if (oid == NULL)
                    300:        return NOTOK;
                    301:     *x = oid;
                    302: 
                    303:     return OK;    
                    304: }
                    305: 
                    306: 
                    307: /* ARGSUSED */
                    308: 
                    309: static int  object_print (x, os)
                    310: OID    x;
                    311: OS     os;
                    312: {
                    313:     char  *cp,
                    314:           ode[BUFSIZ];
                    315: 
                    316:     (void) strcpy (ode, oid2ode (x));
                    317:     printf ("%s", ode);
                    318:     if (strcmp (ode, cp = sprintoid (x)))
                    319:        printf (" (%s)", cp);
                    320: }
                    321: 
                    322: 
                    323: static add_object ()
                    324: {
                    325:     (void) add_syntax ("ObjectID", object_encode, object_decode, oid_free,
                    326:                object_parse, object_print);
                    327: }
                    328: 
                    329: /*    NULL */
                    330: 
                    331: /* ARGSUSED */
                    332: 
                    333: static int  null_encode (x, pe)
                    334: char   *x;
                    335: PE     *pe;
                    336: {
                    337:     if ((*pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_NULL)) == NULLPE)
                    338:        return NOTOK;
                    339: 
                    340:     return OK;
                    341: }
                    342: 
                    343: 
                    344: /* ARGSUSED */
                    345: 
                    346: static int  null_decode (x, pe)
                    347: char  **x;
                    348: PE     pe;
                    349: {
                    350:     if ((*x = (char *) calloc (1, sizeof **x)) == NULL)
                    351:        return NOTOK;
                    352: 
                    353:     return OK;
                    354: }
                    355: 
                    356: 
                    357: static int  null_free (x)
                    358: char *x;
                    359: {
                    360:     free ((char *) x);
                    361: }
                    362: 
                    363: 
                    364: static int  null_parse (x, s)
                    365: char  **x;
                    366: char   *s;
                    367: {
                    368:     if (lexequ (s, "NULL"))
                    369:        return NOTOK;
                    370: 
                    371:     if ((*x = (char *) calloc (1, sizeof **x)) == NULL)
                    372:        return NOTOK;
                    373: 
                    374:     return OK;    
                    375: }
                    376: 
                    377: 
                    378: /* ARGSUSED */
                    379: 
                    380: static int  null_print (x, os)
                    381: char   *x;
                    382: OS     os;
                    383: {
                    384:     printf ("NULL");
                    385: }
                    386: 
                    387: 
                    388: static add_null ()
                    389: {
                    390:     (void) add_syntax ("NULL", null_encode, null_decode, null_free, null_parse,
                    391:                null_print);
                    392: }
                    393: 
                    394: /*    IpAddress */
                    395: 
                    396: static int  ipaddr_encode (x, pe)
                    397: struct sockaddr_in *x;
                    398: PE     *pe;
                    399: {
                    400:     if ((*pe = str2prim ((char *) &x -> sin_addr, 4, PE_CLASS_APPL, 0))
                    401:            == NULLPE)
                    402:        return NOTOK;
                    403: 
                    404:     return OK;
                    405: }
                    406: 
                    407: 
                    408: static int  ipaddr_decode (x, pe)
                    409: struct sockaddr_in **x;
                    410: PE     pe;
                    411: {
                    412:     struct type_SNMP_IpAddress *ip;
                    413:     struct qbuf *qb;
                    414:     struct sockaddr_in *isock;
                    415: 
                    416:     if (decode_SNMP_IpAddress (pe, 1, NULLIP, NULLVP, &ip) == NOTOK)
                    417:        return NOTOK;
                    418:     if (qb_pullup (ip) == NOTOK
                    419:            || (isock = (struct sockaddr_in *) calloc (1, sizeof *isock))
                    420:                    == NULL) {
                    421:        free_SNMP_IpAddress (ip);
                    422:        return NOTOK;
                    423:     }
                    424:     if ((qb = ip -> qb_forw) -> qb_len != 4) {
                    425:        free_SNMP_IpAddress (ip);
                    426:        return NOTOK;
                    427:     }
                    428:     isock -> sin_family = AF_INET;
                    429:     bcopy (qb -> qb_data,
                    430:           (char *) &isock -> sin_addr,
                    431:           sizeof isock -> sin_addr);
                    432: 
                    433:     *x = isock;
                    434: 
                    435:     free_SNMP_IpAddress (ip);
                    436:     return OK;
                    437: }
                    438: 
                    439: 
                    440: static int  ipaddr_free (x)
                    441: struct sockaddr_in *x;
                    442: {
                    443:     free ((char *) x);
                    444: }
                    445: 
                    446: 
                    447: static int  ipaddr_parse (x, s)
                    448: struct sockaddr_in **x;
                    449: char   *s;
                    450: {
                    451:     register struct hostent *hp = gethostbystring (s);
                    452:     register struct sockaddr_in *isock;
                    453: 
                    454:     if (hp == NULL)
                    455:        return NOTOK;
                    456: 
                    457:     if ((isock = (struct sockaddr_in *) calloc (1, sizeof *isock)) == NULL)
                    458:        return NOTOK;
                    459:     isock -> sin_family = AF_INET;
                    460:     inaddr_copy (hp, isock);
                    461:     *x = isock;
                    462: 
                    463:     return OK;    
                    464: }
                    465: 
                    466: 
                    467: /* ARGSUSED */
                    468: 
                    469: static int  ipaddr_print (x, os)
                    470: struct sockaddr_in *x;
                    471: OS     os;
                    472: {
                    473:     printf ("%s", inet_ntoa (x -> sin_addr));
                    474: }
                    475: 
                    476: 
                    477: static add_ipaddr ()
                    478: {
                    479:     (void) add_syntax ("IpAddress", ipaddr_encode, ipaddr_decode, ipaddr_free,
                    480:                ipaddr_parse, ipaddr_print);
                    481: }
                    482: 
                    483: /*    NetworkAddress */
                    484: 
                    485: /* good enough for now (and probably forever)... */
                    486: 
                    487: static add_netaddr ()
                    488: {
                    489:     (void) add_syntax ("NetworkAddress", ipaddr_encode, ipaddr_decode,
                    490:                       ipaddr_free, ipaddr_parse, ipaddr_print);
                    491: }
                    492: 
                    493: /*    Counter */
                    494: 
                    495: static int  counter_encode (x, pe)
                    496: integer        *x;
                    497: PE     *pe;
                    498: {
                    499:     if ((*pe = num2prim (*x, PE_CLASS_APPL, 1)) == NULLPE)
                    500:        return NOTOK;
                    501: 
                    502:     return OK;
                    503: }
                    504: 
                    505: 
                    506: static int  counter_parse (x, s)
                    507: integer **x;
                    508: char   *s;
                    509: {
                    510:     long    l;
                    511:     char   *cp;
                    512: 
                    513: #ifdef HAVE_STRTOL
                    514:     if ((l = strtol (s, &cp, 0)) == 0L && cp == s)
                    515:        return NOTOK;
                    516: #else
                    517:     if (sscanf (s, "%ld", &l) != 1)
                    518:        return NOTOK;
                    519: #endif
                    520:     if (l < 0 || l > 4294967295L)
                    521:        return NOTOK;
                    522:     if ((*x = (integer *) malloc (sizeof **x)) == NULL)
                    523:        return NOTOK;
                    524:     **x = (integer) l;
                    525: 
                    526:     return OK;    
                    527: }
                    528: 
                    529: 
                    530: static add_counter ()
                    531: {
                    532:     (void) add_syntax ("Counter", counter_encode, integer_decode, integer_free,
                    533:                counter_parse, integer_print);
                    534: }
                    535: 
                    536: /*    Gauge */
                    537: 
                    538: static int  gauge_encode (x, pe)
                    539: integer        *x;
                    540: PE     *pe;
                    541: {
                    542:     if ((*pe = num2prim (*x, PE_CLASS_APPL, 2)) == NULLPE)
                    543:        return NOTOK;
                    544: 
                    545:     return OK;
                    546: }
                    547: 
                    548: 
                    549: static add_gauge ()
                    550: {
                    551:     (void) add_syntax ("Gauge", gauge_encode, integer_decode, integer_free,
                    552:                counter_parse, integer_print);
                    553: }
                    554: 
                    555: /*    TimeTicks */
                    556: 
                    557: static int  timeticks_encode (x, pe)
                    558: integer        *x;
                    559: PE     *pe;
                    560: {
                    561:     if ((*pe = num2prim (*x, PE_CLASS_APPL, 3)) == NULLPE)
                    562:        return NOTOK;
                    563: 
                    564:     return OK;
                    565: }
                    566: 
                    567: 
                    568: /* ARGSUSED */
                    569: 
                    570: static int  timeticks_print (x, os)
                    571: integer *x;
                    572: OS     os;
                    573: {
                    574:     int            d,
                    575:            h,
                    576:            m,
                    577:            s,
                    578:            ds;
                    579: 
                    580:     ds = *x;
                    581:     s = ds / 100, ds = ds % 100;
                    582:     m = s / 60, s = s % 60;
                    583:     h = m / 60, m = m % 60;
                    584:     d = h / 24, h = h % 24;
                    585: 
                    586:     if (d > 0)
                    587:        printf ("%d days, ", d);
                    588:     if (d > 0 || h > 0)
                    589:        printf ("%d hours, ", h);
                    590:     if (d > 0 || h > 0 || m > 0)
                    591:        printf ("%d minutes, ", m);
                    592:     printf ("%d", s);
                    593:     if (ds > 0)
                    594:        printf (".%02d", ds);
                    595:     printf (" seconds (%d timeticks)", *x);
                    596: }
                    597: 
                    598: 
                    599: static add_timeticks ()
                    600: {
                    601:     (void) add_syntax ("TimeTicks", timeticks_encode, integer_decode,
                    602:                       integer_free, integer_parse, timeticks_print);
                    603: }
                    604: 
                    605: /*    CnlpAddress */
                    606: 
                    607: static int  clnpaddr_encode (x, pe)
                    608: struct sockaddr_iso *x;
                    609: PE     *pe;
                    610: {
                    611:     char    buffer[sizeof x -> siso_data + 1];
                    612: 
                    613:     buffer[0] = x -> siso_nlen & 0xff;
                    614:     bcopy (x -> siso_data, buffer + 1, (int) x -> siso_nlen);
                    615: 
                    616:     if ((*pe = str2prim (buffer, (int) (x -> siso_nlen + 1), PE_CLASS_APPL,
                    617:                         5)) == NULLPE)
                    618:        return NOTOK;
                    619: 
                    620:     return OK;
                    621: }
                    622: 
                    623: 
                    624: static int  clnpaddr_decode (x, pe)
                    625: struct sockaddr_iso **x;
                    626: PE     pe;
                    627: {
                    628:     int            len;
                    629:     struct type_SNMP_ClnpAddress *clnp;
                    630:     struct qbuf *qb;
                    631:     struct sockaddr_iso *isock;
                    632: 
                    633:     if (decode_SNMP_ClnpAddress (pe, 1, NULLIP, NULLVP, &clnp) == NOTOK)
                    634:        return NOTOK;
                    635:     if (qb_pullup (clnp) == NOTOK
                    636:            || (isock = (struct sockaddr_iso *) calloc (1, sizeof *isock))
                    637:                    == NULL) {
                    638:        free_SNMP_ClnpAddress (clnp);
                    639:        return NOTOK;
                    640:     }
                    641:     qb = clnp -> qb_forw;
                    642:     isock -> siso_family = AF_ISO;
                    643:     if ((len = qb -> qb_data[0] & 0xff) >= qb -> qb_len)
                    644:        len = qb -> qb_len - 1;
                    645:     bcopy (qb -> qb_data + 1, isock -> siso_data,
                    646:           (int) (isock -> siso_nlen = len));
                    647: 
                    648:     *x = isock;
                    649: 
                    650:     free_SNMP_ClnpAddress (clnp);
                    651:     return OK;
                    652: }
                    653: 
                    654: 
                    655: static int  clnpaddr_free (x)
                    656: struct sockaddr_iso *x;
                    657: {
                    658:     free ((char *) x);
                    659: }
                    660: 
                    661: 
                    662: static int  clnpaddr_parse (x, s)
                    663: struct sockaddr_iso **x;
                    664: char   *s;
                    665: {
                    666:     register struct sockaddr_iso *isock;
                    667: 
                    668:     if ((isock = (struct sockaddr_iso *) calloc (1, sizeof *isock)) == NULL)
                    669:        return NOTOK;
                    670:     isock -> siso_family = AF_ISO;
                    671:     isock -> siso_nlen = implode ((u_char *) isock -> siso_data, s,
                    672:                                  strlen (s));
                    673:     *x = isock;
                    674: 
                    675:     return OK;    
                    676: }
                    677: 
                    678: 
                    679: /* ARGSUSED */
                    680: 
                    681: static int  clnpaddr_print (x, os)
                    682: struct sockaddr_iso *x;
                    683: OS     os;
                    684: {
                    685:     char    buffer[sizeof x -> siso_data * 2 + 1];
                    686: 
                    687:     buffer[explode (buffer, (u_char *) x -> siso_data, (int) x -> siso_nlen)] =
                    688:        NULL;
                    689:     printf ("NS+%s", buffer);
                    690: }
                    691: 
                    692: 
                    693: static add_clnpaddr ()
                    694: {
                    695:     (void) add_syntax ("ClnpAddress", clnpaddr_encode, clnpaddr_decode,
                    696:                       clnpaddr_free, clnpaddr_parse, clnpaddr_print);
                    697: }
                    698: 
                    699: /*  */
                    700: 
                    701: int    readsyntax ()
                    702: {
                    703:     add_integer ();
                    704:     add_string ();
                    705:     add_object ();
                    706:     add_null ();
                    707:     add_ipaddr ();
                    708:     add_netaddr ();
                    709:     add_counter ();
                    710:     add_gauge ();
                    711:     add_timeticks ();
                    712: 
                    713:     add_clnpaddr ();
                    714: }
                    715: 
                    716: /*  */
                    717: 
                    718: int    add_syntax (name, f_encode, f_decode, f_free, f_parse, f_print)
                    719: char   *name;
                    720: IFP    f_encode,
                    721:        f_decode,
                    722:        f_free,
                    723:        f_parse,
                    724:        f_print;
                    725: {
                    726:     int            i;
                    727:     register OS            os = synlast++;
                    728: 
                    729:     if ((i = synlast - syntaxes) >= MAXSYN)
                    730:        return NOTOK;
                    731:     os -> os_name = name;
                    732:     os -> os_encode = f_encode;
                    733:     os -> os_decode = f_decode;
                    734:     os -> os_free = f_free;
                    735:     os -> os_parse = f_parse;
                    736:     os -> os_print = f_print;
                    737: 
                    738:     return i;
                    739: }
                    740: 
                    741: /*  */
                    742: 
                    743: OS     text2syn (name)
                    744: char   *name;
                    745: {
                    746:     register OS            os;
                    747: 
                    748:     for (os = syntaxes; os < synlast; os++)
                    749:        if (lexequ (os -> os_name, name) == 0)
                    750:            return os;
                    751: 
                    752:     return NULLOS;
                    753: }

unix.superglobalmegacorp.com

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