Annotation of 43BSDReno/contrib/isode-beta/compat/isoaddrs.c, revision 1.1.1.1

1.1       root        1: /* isoaddrs.c - simple parsing of ISODE addresses */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/compat/RCS/isoaddrs.c,v 7.2 90/07/09 14:31:51 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/compat/RCS/isoaddrs.c,v 7.2 90/07/09 14:31:51 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       isoaddrs.c,v $
                     12:  * Revision 7.2  90/07/09  14:31:51  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.1  90/01/11  18:35:10  mrose
                     16:  * real-sync
                     17:  * 
                     18:  * Revision 7.0  89/11/23  21:23:05  mrose
                     19:  * Release 6.0
                     20:  * 
                     21:  */
                     22: 
                     23: /*
                     24:  *                               NOTICE
                     25:  *
                     26:  *    Acquisition, use, and distribution of this module and related
                     27:  *    materials are subject to the restrictions of a license agreement.
                     28:  *    Consult the Preface in the User's Manual for the full terms of
                     29:  *    this agreement.
                     30:  *
                     31:  */
                     32: 
                     33: 
                     34: /* LINTLIBRARY */
                     35: 
                     36: #include <ctype.h>
                     37: #include <stdio.h>
                     38: #include "general.h"
                     39: #include "manifest.h"
                     40: #include "isoaddrs.h"
                     41: #include "internet.h"
                     42: #include "tailor.h"
                     43: 
                     44: /*    DATA */
                     45: 
                     46: static char *isomacros = "isomacros";
                     47: 
                     48: #define        MBUCKETS        128
                     49: #define        MHASH(nm) \
                     50:     (((nm)[1]) ? (((chrcnv[((nm)[0])] - chrcnv[((nm)[1])]) & 0x1f) \
                     51:                        + ((chrcnv[(nm)[2]]) & 0x5f)) \
                     52:               : (chrcnv[(nm)[0]]) & 0x7f)
                     53: 
                     54: struct macro {
                     55:     char   *m_name;
                     56:     char   *m_value;
                     57: 
                     58:     struct macro *m_chain;
                     59: };
                     60: 
                     61: static int inited = 0;
                     62: static struct macro *Mbuckets[MBUCKETS];
                     63: 
                     64: /*    MACROS */
                     65: 
                     66: static struct macro *name2macro (name)
                     67: char   *name;
                     68: {
                     69:     register struct macro *m;
                     70: 
                     71:     read_macros ();
                     72: 
                     73:     for (m = Mbuckets[MHASH (name)];
                     74:             m && lexequ (m -> m_name, name);
                     75:             m = m -> m_chain)
                     76:        continue;
                     77: 
                     78:     if (m)
                     79:        LLOG (addr_log, LLOG_DEBUG,
                     80:              ("MACRO \"%s\" VALUE \"%s\"", m -> m_name, m -> m_value));
                     81:     else
                     82:        LLOG (addr_log, LLOG_DEBUG,
                     83:              ("lookup of MACRO \"%s\" failed", name));
                     84: 
                     85:     return m;
                     86: }
                     87: 
                     88: /*  */
                     89: 
                     90: static struct macro *value2macro (value)
                     91: char   *value;
                     92: {
                     93:     register int   i,
                     94:                   j,
                     95:                   k;
                     96:     register struct macro *m,
                     97:                          *p,
                     98:                         **np,
                     99:                         **pp;
                    100: 
                    101:     read_macros ();
                    102: 
                    103:     p = NULL, i = 0;
                    104:     k = strlen (value);
                    105:     for (pp = (np = Mbuckets) + MBUCKETS; np < pp; np++)
                    106:        for (m = *np; m; m = m -> m_chain)
                    107:            if ((j = strlen (m -> m_value)) <= k
                    108:                    &&  j > i
                    109:                    && strncmp (value, m -> m_value, j) == 0)
                    110:                p = m, i = j;
                    111: 
                    112:     if (p)
                    113:        LLOG (addr_log, LLOG_DEBUG,
                    114:              ("MACRO \"%s\" VALUE \"%s\" differential %d",
                    115:               p -> m_name, p -> m_value, k - strlen (p -> m_value)));
                    116:     else
                    117:        LLOG (addr_log, LLOG_DEBUG,
                    118:              ("lookup of VALUE \"%s\" failed", value));
                    119: 
                    120:     return p;
                    121: }
                    122: 
                    123: /*  */
                    124: 
                    125: static int  read_macros ()
                    126: {
                    127:     register char *hp;
                    128:     char    buffer[BUFSIZ];
                    129: 
                    130:     if (inited)
                    131:        return;
                    132:     inited = 1;
                    133: 
                    134:     bzero ((char *) Mbuckets, sizeof Mbuckets);
                    135: 
                    136:     read_file (isodefile (isomacros, 0));
                    137: 
                    138:     if ((hp = getenv ("HOME")) == NULL)
                    139:        hp = ".";
                    140:     (void) sprintf (buffer, "%s/.isode_macros", hp);
                    141:     read_file (buffer);
                    142: }
                    143: 
                    144: /*  */
                    145: 
                    146: static int  read_file (file)
                    147: char   *file;
                    148: {
                    149:     register char *cp;
                    150:     char    buffer[BUFSIZ + 1],
                    151:           *vec[NVEC + NSLACK + 1];
                    152:     register FILE *fp;
                    153: 
                    154:     if ((fp = fopen (file, "r")) == NULL)
                    155:        return;
                    156: 
                    157:     while (fgets (buffer, sizeof buffer, fp)) {
                    158:        if (*buffer == '#')
                    159:            continue;
                    160:        if (cp = index (buffer, '\n'))
                    161:            *cp  = NULL;
                    162:        if (str2vec (buffer, vec) < 2)
                    163:            continue;
                    164: 
                    165:        if (add_macro (vec[0], vec[1]) == NOTOK)
                    166:            break;
                    167:     }
                    168: 
                    169:     (void) fclose (fp);
                    170: }
                    171: 
                    172: /*  */
                    173: 
                    174: static int  add_macro (name, value)
                    175: char   *name,
                    176:        *value;
                    177: {
                    178:     int            i;
                    179:     register char  *cp;
                    180:     char    buffer[BUFSIZ];
                    181:     register struct macro *m,
                    182:                          *p;
                    183: 
                    184:     if (cp = index (value, '=')) {
                    185:        *cp++ = NULL;
                    186:        if ((p = name2macro (value)) == NULL) {
                    187:            SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    188:                  ("macro \"%s\" references non-existant macro \"%s\"",
                    189:                   name, value));
                    190:            return OK;
                    191:        }
                    192: 
                    193:        (void) sprintf (value = buffer, "%s%s", p -> m_value, cp);
                    194:     }
                    195: 
                    196:     if ((m = (struct macro *) calloc (1, sizeof *m)) == NULL) {
                    197:        SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    198:              ("calloc of macro structure failed"));
                    199:        return NOTOK;
                    200:     }
                    201:     if ((m -> m_name = malloc ((unsigned) (strlen (name) + 1))) == NULL
                    202:                || (m -> m_value = malloc ((unsigned) (strlen (value) + 1)))
                    203:            == NULL) {
                    204:        SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    205:              ("malloc of alias structure failed"));
                    206:        if (m -> m_name)
                    207:            free (m -> m_name);
                    208:        free ((char *) m);
                    209:        return NOTOK;
                    210:     }
                    211:     (void) strcpy (m -> m_name, name);
                    212:     (void) strcpy (m -> m_value, value);
                    213: 
                    214:     m -> m_chain = Mbuckets[i = MHASH (m -> m_name)];
                    215:     Mbuckets[i] = m;
                    216: 
                    217:     return OK;
                    218: }
                    219: 
                    220: /*  */
                    221: 
                    222: char   *macro2str (name)
                    223: char   *name;
                    224: {
                    225:     register struct macro *m = name2macro (name);
                    226: 
                    227:     return (m ? m -> m_value : NULLCP);
                    228: }
                    229: 
                    230: /*    STR2PADDR */
                    231: 
                    232: #define        PS_INIT 0       /* <selector> or <network-address> */
                    233: #define        PS_SEL1 1       /*   .. got one selector already */
                    234: #define        PS_SEL2 2       /*   .. got two selectors already */
                    235: #define        PS_SEL3 3       /* <network-address> */
                    236: 
                    237: 
                    238: static struct pair {
                    239:     char   *p_name;
                    240:     char   *p_value;
                    241: }      afi_entries[] = {
                    242:     "X121",  "36",
                    243:     "DCC",   "38",
                    244:     "TELEX", "54",
                    245:     "PSTN",  "56",
                    246:     "ISDN",  "58",
                    247:     "ICD",   "46",
                    248:     "LOCAL", "48",
                    249: 
                    250:     NULL
                    251: };
                    252: 
                    253: 
                    254: static char sel1[TSSIZE];
                    255: static char sel2[TSSIZE];
                    256: static char sel3[TSSIZE];
                    257: static char *sels[3] = {
                    258:     sel1, sel2, sel3
                    259: };
                    260: 
                    261: 
                    262: #define        IMPLODE(intres,octres,octval,intval) \
                    263: { \
                    264:     register int   z = (intval); \
                    265:     register char *y = (octval); \
                    266:     register char *zp = y + z; \
                    267:  \
                    268:     while (zp-- > y) \
                    269:        if (!isxdigit (*zp)) { \
                    270:            SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, \
                    271:                  ("invalid hexstring: \"%*.*s\"", \
                    272:                   z, z, y)); \
                    273:        } \
                    274:     (intres) = implode ((u_char *) (octres), y, z); \
                    275: }
                    276: 
                    277: /*  */
                    278: 
                    279: #ifdef notdef
                    280: /* An interim approach to use of Network Addresses... */
                    281: 
                    282: #define        INTERIM_IDP             "5400728722"
                    283: #endif
                    284: 
                    285: 
                    286: struct PSAPaddr *str2paddr (str)
                    287: char   *str;
                    288: {
                    289:     register int    state,
                    290:                   *lp;
                    291:     int            j,
                    292:            lens[3];
                    293:     register char  *cp,
                    294:                   *dp,
                    295:                   *ep,
                    296:                   *np,
                    297:                  **sp;
                    298:     char    buf1[BUFSIZ],
                    299:            buf2[BUFSIZ],
                    300:            nsap[NASIZE * 2 + 1];
                    301:     register struct macro *m;
                    302:     register struct pair *pp;
                    303:     static int i = 0;
                    304:     static struct PSAPaddr pas[2];
                    305:     register struct PSAPaddr *pa = &pas[i++];
                    306:     register struct SSAPaddr *sa = &pa -> pa_addr;
                    307:     register struct TSAPaddr *ta = &sa -> sa_addr;
                    308:     register struct NSAPaddr *na = ta -> ta_addrs;
                    309: 
                    310:     i = i % 2;
                    311: 
                    312:     bzero ((char *) pa, sizeof *pa);
                    313:     (void) strcpy (buf1, str);
                    314: 
                    315:     state = PS_INIT;
                    316:     sp = sels, lp = lens;
                    317: 
                    318:     for (cp = buf1; *cp; )
                    319:        switch (state) {
                    320:            case PS_INIT:       
                    321:            case PS_SEL1:
                    322:            case PS_SEL2:
                    323:                switch (*cp) {
                    324:                    case '"':           /* '"' <otherstring> '"' */
                    325:                        if ((cp = index (dp = cp + 1, '"')) == NULL) {
                    326:                            SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    327:                                  ("missing double-quote in selector: %s",
                    328:                                   str));
                    329:                            return NULLPA;
                    330:                        }
                    331:                        *cp++ = NULL;
                    332:                        (void) strcpy (*sp, dp);
                    333:                        *lp = strlen (dp);
                    334:                        break;
                    335: 
                    336:                    case '#':           /* '#' <digitstring> */
                    337:                        j = 0;
                    338:                        for (cp++; isdigit (*cp); cp++)
                    339:                            j = j * 10 + *cp - '0';
                    340:                        if (j > 0xffff) {
                    341:                            SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    342:                                  ("invalid #-style selector: %s", str));
                    343:                            return NULLPA;
                    344:                        }
                    345:                        (*sp)[0] = (j >> 8) & 0xff;
                    346:                        (*sp)[1] = j & 0xff;
                    347:                        *lp = 2;
                    348:                        break;
                    349: 
                    350:                    case '\'':          /* "'" <hexstring> "'H" */
                    351:                        if ((cp = index (dp = cp + 1, '\'')) == NULL) {
                    352: missing_quoteH: ;
                    353:                            SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    354:                                  ("missing 'H in selector: %s",str));
                    355:                            return NULLPA;
                    356:                        }
                    357:                        *cp++ = NULL;
                    358:                        if (*cp++ != 'H')
                    359:                            goto missing_quoteH;
                    360:                        IMPLODE (*lp, *sp, dp, strlen (dp));
                    361:                        break;
                    362: 
                    363:                    case '/':           /* empty selector */
                    364:                        *lp = 0;
                    365:                        break;
                    366: 
                    367:                    default:
                    368:                        goto stuff_selectors;
                    369:                }
                    370:                sp++, lp++;
                    371:                if (*cp++ != '/') {
                    372:                    SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    373:                          ("missing selector seperator at position %d: %s",
                    374:                           cp - buf1, str));
                    375:                    return NULLPA;
                    376:                }
                    377:                state++;
                    378:                break;
                    379: 
                    380: stuff_selectors: ;
                    381:                state = PS_SEL3;
                    382:                /* and fall */
                    383: 
                    384:            case PS_SEL3:
                    385:                if ((cp = index (ep = cp, '|')) == NULL)
                    386:                    cp = ep + strlen (ep);
                    387:                else
                    388:                    *cp++ = NULL;
                    389: 
                    390:                if (dp = index (ep, '=')) {
                    391:                    *dp++ = NULL;
                    392:                    if ((m = name2macro (ep)) == NULL) {
                    393:                        SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    394:                              ("non-existant macro \"%s\"", ep));
                    395:                        return NULLPA;
                    396:                    }
                    397:                    (void) sprintf (ep = buf2, "%s%s", m -> m_value, dp);
                    398:                }
                    399: 
                    400:                {
                    401:                    register int    k,
                    402:                                    l,
                    403:                                    n;
                    404:                    register struct ts_interim *ts,
                    405:                                               *tp;
                    406: 
                    407:                    tp = NULL, n = 0;
                    408:                    k = strlen (ep);
                    409:                    for (ts = ts_interim; ts -> ts_name; ts++)
                    410:                        if (ts -> ts_value
                    411:                                && (l = strlen (ts -> ts_value)) <= k
                    412:                                && l > n
                    413:                                && strncmp (ep, ts -> ts_value, l) == 0)
                    414:                            tp = ts, n = l;
                    415:                    if (tp)
                    416:                        na -> na_community = tp -> ts_subnet;
                    417:                    else
                    418:                                                        /* XXX: what a hack! */
                    419:                        if (strncmp (ep, "X121+", sizeof "X121+" - 1) == 0)
                    420:                            na -> na_community = SUBNET_INT_X25;
                    421:                        else {
                    422:                            SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    423:                                  ("unable to determine community for %s",ep));
                    424:                            return NULLPA;
                    425:                        }
                    426:                }
                    427: 
                    428:                if ((ep = index (dp = ep, '+')) == NULL) {
                    429: missing_seperator: ;
                    430:                    SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    431:                          ("missing network-address seperator: %s", str));
                    432:                    return NULLPA;
                    433:                }
                    434:                *ep++ = NULL;
                    435:                if (ta -> ta_naddr >= NTADDR) {
                    436: #ifdef h_addr
                    437: too_many: ;
                    438: #endif
                    439:                    SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    440:                          ("too many network addresses starting at position %d: %s",
                    441:                           dp - buf1 + 1, str));
                    442:                    return pa;
                    443:                }
                    444: 
                    445:                na -> na_stack = NA_NSAP;
                    446:                if (lexequ (dp, "NS") == 0) {
                    447:                    IMPLODE (na -> na_addrlen, na -> na_address, ep,
                    448:                             strlen (ep));
                    449:                }
                    450:                else {
                    451:                    for (pp = afi_entries; pp -> p_name; pp++)
                    452:                        if (lexequ (pp -> p_name, dp) == 0)
                    453:                            break;
                    454:                    if (!pp -> p_name) {
                    455:                        SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    456:                              ("unknown AFI \"%s\": %s", dp, str));
                    457:                        return NULLPA;
                    458:                    }
                    459:                    if ((ep = index (dp = ep, '+')) == NULL)
                    460:                        ep = dp + strlen (dp);
                    461:                    else
                    462:                        *ep++ = NULL;
                    463:                    if (lexequ (pp -> p_name, "X121") == 0) {
                    464:                        /* X121 form -- should be more general */
                    465:                        (void) strcpy (nsap, dp);
                    466:                        if ((na -> na_dtelen = strlen (nsap)) > NSAP_DTELEN) {
                    467:                            dp = nsap;
                    468:                            goto invalid_dte;
                    469:                        }
                    470:                        (void) strcpy (na -> na_dte, nsap);
                    471: #ifdef BRIDGE_X25
                    472:                        na -> na_stack = bridgediscrim (na) ? NA_BRG : NA_X25;
                    473: #else
                    474:                        na -> na_stack = NA_X25;
                    475: #endif
                    476:                        na -> na_community = SUBNET_INT_X25;
                    477:                        if (*ep != NULL) {
                    478:                            SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    479:                                  ("bad X121 form \"%s\"", ep));
                    480:                            return NULLPA;
                    481:                        }
                    482:                        goto next;
                    483:                    }
                    484:                    else
                    485:                        (void) sprintf (nsap, "%s%s", pp -> p_value, dp);
                    486:                    switch (*ep) {
                    487:                        case 'd':
                    488:                            (void) strcpy (nsap + strlen (nsap), ep + 1);
                    489:                            /* and fall */
                    490:                        case 'x':
                    491:                        case 'l':
                    492:                        case NULL:
                    493:                            np = nsap, dp = na -> na_address;
                    494:                            while (*np) {
                    495:                                *dp = (*np++ - '0') << 4;
                    496:                                if (*np)
                    497:                                    *dp++ |= (*np++ - '0') & 0x0f;
                    498:                                else
                    499:                                    *dp++ |= 0x0f;
                    500:                            }
                    501:                            na -> na_addrlen = dp - na -> na_address;
                    502:                            if (*ep == 'x') {
                    503:                                IMPLODE (j, dp, ep + 1, strlen (ep + 1));
                    504:                                na -> na_addrlen += j;
                    505:                            }
                    506:                            else
                    507:                                if (*ep == 'l') {
                    508:                                    (void) strcpy (dp, ep + 1);
                    509:                                    na -> na_addrlen += strlen (ep + 1);
                    510:                                }
                    511:                            break;
                    512: 
                    513:                        default:
                    514:                            if (strncmp ("RFC-1006+", ep,
                    515:                                         sizeof "RFC-1006+" - 1) == 0) {
                    516: #ifdef h_addr
                    517:                                register char **ap;
                    518: #endif
                    519:                                register struct hostent *hp;
                    520: 
                    521:                                na -> na_stack = NA_TCP;
                    522: #ifdef notdef
                    523:                                if (strcmp (nsap, INTERIM_IDP)) {
                    524: wrong_idp: ;
                    525:                                    SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    526:                                          ("wrong IDP \"%s\" for DSP \"%s\"",
                    527:                                           nsap, ep));
                    528:                                    return NULLPA;
                    529:                                }
                    530: #endif
                    531:                                ep += sizeof "RFC-1006+" - 1;
                    532:                                if ((ep = index (dp = ep, '+')) == NULL)
                    533:                                    goto missing_seperator;
                    534:                                *ep++ = NULL;
                    535: #ifdef notdef
                    536:                                na -> na_community = atoi (dp);
                    537: #endif
                    538:                                if ((ep = index (dp = ep, '+')) == NULL)
                    539:                                    ep = dp + strlen (dp);
                    540:                                else
                    541:                                    *ep++ = NULL;
                    542: 
                    543:                                if ((hp = gethostbystring (dp)) == NULL) {
                    544:                                    SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    545:                                          ("%s: unknown host", dp));
                    546:                                    return NULLPA;
                    547:                                }
                    548:                                (void) strcpy (na -> na_domain,
                    549:                                               inet_ntoa (*(struct in_addr *)
                    550:                                                                hp -> h_addr));
                    551:                                if (*ep) {
                    552:                                    if ((ep = index (dp = ep, '+')) == NULL)
                    553:                                        ep = dp + strlen (dp);
                    554:                                    else
                    555:                                        *ep++ = NULL;
                    556:                                    na -> na_port = htons ((u_short) atoi(dp));
                    557: 
                    558:                                    if (*ep)
                    559:                                        na -> na_tset = atoi (ep);
                    560:                                }
                    561: #ifdef h_addr
                    562:                                for (ap = hp -> h_addr_list + 1; *ap; ap++) {
                    563:                                    ta -> ta_naddr++, na++;
                    564: 
                    565:                                    if (ta -> ta_naddr >= NTADDR)
                    566:                                        goto too_many;
                    567:                                    bcopy ((char *) (na - 1), (char *) na,
                    568:                                           sizeof *na);
                    569:                                    (void) strcpy (na -> na_domain,
                    570:                                          inet_ntoa (*(struct in_addr *) *ap));
                    571:                                }
                    572: #endif
                    573:                                break;
                    574:                            }
                    575:                            if (strncmp ("X.25(80)+", ep,
                    576:                                         sizeof "X.25(80)+" - 1) == 0) {
                    577:                                na -> na_stack = NA_X25;
                    578: #ifdef notdef
                    579:                                if (strcmp (nsap, INTERIM_IDP))
                    580:                                    goto wrong_idp;
                    581: #endif
                    582:                                ep += sizeof "X.25(80)+" - 1;
                    583:                                if ((ep = index (dp = ep, '+')) == NULL)
                    584:                                    goto missing_seperator;
                    585:                                *ep++ = NULL;
                    586: #ifdef notdef
                    587:                                na -> na_community = atoi (dp);
                    588: #endif
                    589:                                if ((ep = index (dp = ep, '+')) == NULL)
                    590:                                    ep = dp + strlen (dp);
                    591:                                else
                    592:                                    *ep++ = NULL;
                    593:                                for (np = dp; *np; np++)
                    594:                                    if (!isdigit (*np)) {
                    595: invalid_dte: ;
                    596:                                        SLOG (addr_log, LLOG_EXCEPTIONS,
                    597:                                              NULLCP,
                    598:                                              ("invalid DTE \"%s\": %s",
                    599:                                               dp, str));
                    600:                                        return NULLPA;
                    601:                                    }
                    602:                                if (np - dp > NSAP_DTELEN + 1)
                    603:                                    goto invalid_dte;
                    604:                                (void) strcpy (na -> na_dte, dp);
                    605:                                na -> na_dtelen = strlen (na -> na_dte);
                    606:                                if (*ep) {
                    607:                                    char   *cudf,
                    608:                                           *clen;
                    609: 
                    610:                                    if ((ep = index (dp = ep, '+')) == NULL)
                    611:                                        goto missing_seperator;
                    612:                                    *ep++ = NULL;
                    613:                                    
                    614:                                    if (lexequ (dp, "CUDF") == 0) {
                    615:                                        cudf = na -> na_cudf;
                    616:                                        clen = &na -> na_cudflen;
                    617:                                        j = sizeof na -> na_cudf;
                    618:                                    }
                    619:                                    else
                    620:                                        if (lexequ (dp, "PID") == 0) {
                    621:                                            cudf = na -> na_pid;
                    622:                                            clen = &na -> na_pidlen;
                    623:                                            j = sizeof na -> na_pid;
                    624:                                        }
                    625:                                        else {
                    626: invalid_field: ;
                    627:                                            SLOG (addr_log, LLOG_EXCEPTIONS,
                    628:                                                  NULLCP,
                    629:                                                  ("invalid field \"%s\": %s",
                    630:                                                   dp, str));
                    631:                                            return NULLPA;
                    632:                                        }
                    633:                                    if (j * 2 < strlen (ep))
                    634:                                        goto invalid_field;
                    635:                                    IMPLODE (j, cudf, ep, strlen (ep));
                    636:                                    *clen = j & 0xff;
                    637:                                }
                    638: #ifdef BRIDGE_X25
                    639:                                na -> na_stack = bridgediscrim (na) ? NA_BRG
                    640:                                                                   : NA_X25;
                    641: #endif
                    642:                                break;
                    643:                            }
                    644: #ifdef notdef
                    645:                            if (lexequ ("ECMA-117-Binary", ep) == 0) {
                    646:                                /* some day support this... */
                    647:                                break;
                    648:                            }
                    649:                            if (lexequ ("ECMA-117-Decimal", ep) == 0) {
                    650:                                /* some day support this... */
                    651:                                break;
                    652:                            }
                    653: #endif
                    654:                            SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    655:                                  ("unknown DSP \"%s\": %s", ep, str));
                    656:                            return NULLPA;
                    657:                    }
                    658:                }
                    659: next: ;
                    660:                ta -> ta_naddr++, na++;
                    661:                break;
                    662:        }
                    663:     
                    664:     switch (sp - sels) {
                    665:         case 3:        /* PSEL+SSEL+TSEL */
                    666:            bcopy (*--sp, ta -> ta_selector,
                    667:                   ta -> ta_selectlen = *--lp);
                    668:            bcopy (*--sp, sa -> sa_selector,
                    669:                   sa -> sa_selectlen = *--lp);
                    670:            bcopy (*--sp, pa -> pa_selector,
                    671:                   pa -> pa_selectlen = *--lp);
                    672:            break;
                    673: 
                    674:        case 2: /* SSEL+TSEL */
                    675:            bcopy (*--sp, ta -> ta_selector,
                    676:                   ta -> ta_selectlen = *--lp);
                    677:            bcopy (*--sp, sa -> sa_selector,
                    678:                   sa -> sa_selectlen = *--lp);
                    679:            break;
                    680: 
                    681:        case 1: /* TSEL */
                    682:            bcopy (*--sp, ta -> ta_selector,
                    683:                   ta -> ta_selectlen = *--lp);
                    684:            break;
                    685: 
                    686:        default:
                    687:            break;
                    688:     }
                    689:     
                    690:     return pa;
                    691: }
                    692: 
                    693: /*  */
                    694: 
                    695: int    macro2comm (name, ts)
                    696: char   *name;
                    697: register struct ts_interim *ts;
                    698: {
                    699:     int            j;
                    700:     register char  *ap,
                    701:                   *cp,
                    702:                   *dp,
                    703:                   *ep,
                    704:                   *fp,
                    705:                   *np;
                    706:     char    addr[NASIZE * 2 + 1],
                    707:            buffer[BUFSIZ];
                    708:     register struct pair *pp;
                    709: 
                    710:     ts -> ts_length = 0, ts -> ts_syntax = NA_NSAP;
                    711:     if ((cp = macro2str (name)) == NULLCP)
                    712:        return NOTOK;
                    713:     ts -> ts_value = cp;
                    714:     (void) strcpy (buffer, cp);
                    715:     ap = addr;
                    716: 
                    717:     if ((ep = index (dp = buffer, '+')) == NULL)
                    718:        ep = dp + strlen (dp);
                    719:     else
                    720:        *ep++ = NULL;
                    721: 
                    722:     if (lexequ (dp, "NS") == 0) {
                    723:        IMPLODE (ts -> ts_length, ts -> ts_prefix, ep, strlen (ep));
                    724: 
                    725:        return OK;
                    726:     }
                    727:     
                    728:     for (pp = afi_entries; pp -> p_name; pp++)
                    729:        if (lexequ (pp -> p_name, dp) == 0)
                    730:            break;
                    731:     if (!pp -> p_name) {
                    732:        SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    733:              ("unknown AFI \"%s\": %s", dp, cp));
                    734:        return NOTOK;
                    735:     }
                    736: 
                    737:     (void) strcpy (ap, pp -> p_value);
                    738:     ap += strlen (ap);
                    739: 
                    740:     if (!ep)
                    741:        goto out;
                    742: 
                    743:     if ((ep = index (dp = ep, '+')) == NULL)
                    744:        ep = dp + strlen (dp);
                    745:     else
                    746:        *ep++ = NULL;
                    747: 
                    748:     for (fp = dp; *fp; fp++)
                    749:        if (!isdigit (*fp))
                    750:            break;
                    751:     if (*fp) {
                    752:        SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    753:              ("invalid AFI suffix \"%s\": %s", dp, cp));
                    754:        return NOTOK;
                    755:     }
                    756:     (void) strcpy (ap, dp);
                    757:     ap += strlen (ap);
                    758: 
                    759:     if (lexequ (pp -> p_name, "X121") == 0) {
                    760:        if (*ep) {
                    761:            SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    762:                  ("invalid DTE \"%s\": %s", dp, cp));
                    763:            return NOTOK;
                    764:        }
                    765: 
                    766:        ts -> ts_syntax = NA_X25;
                    767:        ts -> ts_subnet = SUBNET_INT_X25;
                    768:        goto out;
                    769:     }
                    770: 
                    771:     switch (*ep) {
                    772:        case 'd':
                    773:            (void) strcpy (ap, ep + 1);
                    774:            /* and fall */
                    775:        case 'x':
                    776:        case 'l':
                    777:        case NULL:
                    778:            break;
                    779: 
                    780:        default:
                    781:            if ((ep = index (dp = ep, '+')) == NULL)
                    782:                ep = dp + strlen (dp);
                    783:            else
                    784:                *ep++ = NULL;
                    785:            if (lexequ (dp, "RFC-1006") == 0)
                    786:                ts -> ts_syntax = NA_TCP;
                    787:            else
                    788:                if (lexequ (dp, "X.25(80)") == 0)
                    789:                    ts -> ts_syntax = NA_X25;
                    790:                else {
                    791:                    SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    792:                          ("unknown DSP \"%s\": %s", dp, cp));
                    793:                    return NOTOK;
                    794:                }
                    795:            if ((ep = index (dp = ep, '+')) == NULL)
                    796:                ep = dp + strlen (dp);
                    797:            else
                    798:                *ep++ = NULL;
                    799: 
                    800:            (void) strcpy (ap, dp);
                    801:            ap += strlen (ap);
                    802: 
                    803:            if (*ep) {
                    804:                SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    805:                      ("invalid MACRO for community \"%s\": %s", name, cp));
                    806:                return NOTOK;
                    807:            }
                    808:            break;
                    809:     }
                    810: 
                    811: out: ;
                    812:     ap = addr, np = ts -> ts_prefix;
                    813:     while (*ap) {
                    814:        *np = (*ap++ - '0') << 4;
                    815:        if (*ap)
                    816:            *np++ |= (*ap++ - '0') & 0x0f;
                    817:        else
                    818:            *np++ |= 0x0f;
                    819:     }
                    820:     switch (*ep) {
                    821:        case 'x':
                    822:            IMPLODE (j, np, ep + 1, strlen (ep + 1));
                    823:            np += j;
                    824:            break;
                    825: 
                    826:        case 'l':
                    827:            (void) strcpy (np, ep + 1);
                    828:            np += strlen (ep + 1);
                    829:            break;
                    830: 
                    831:        default:
                    832:            break;
                    833:     }
                    834:     ts -> ts_length = np - ts -> ts_prefix;
                    835: 
                    836:     return OK;
                    837: }
                    838: 
                    839: /*    PADDR2STR */
                    840: 
                    841: static char   *SEL2STR (sel, len)
                    842: char   *sel;
                    843: int    len;
                    844: {
                    845:     register char  *cp,
                    846:                   *dp,
                    847:                   *ep;
                    848:     static char buffer[PSSIZE * 2 + 4];
                    849: 
                    850:     if (len <= 0)
                    851:        return "";
                    852: 
                    853:     cp = buffer;
                    854:     *cp++ = '"';
                    855:     for (ep = (dp = sel) + len; dp < ep; dp++) {
                    856:        switch (*dp) {
                    857:            case '+':
                    858:            case '-':
                    859:            case '.':
                    860:                break;
                    861: 
                    862:            default:
                    863:                if (!isalnum (*dp)) {
                    864:                    cp = buffer;
                    865:                    *cp++ = '\'';
                    866:                    cp += explode (cp, (u_char *) sel, len);
                    867:                    (void) strcpy (cp, "'H");
                    868:                    return buffer;
                    869:                }               
                    870:                break;
                    871:        }
                    872: 
                    873:        *cp++ = *dp;
                    874:     }
                    875:     *cp++ = '"';
                    876:     *cp = NULL;
                    877: 
                    878:     return buffer;
                    879: }
                    880: 
                    881: /*  */
                    882: 
                    883: char    *_paddr2str (pa, na, compact)
                    884: register struct PSAPaddr *pa;
                    885: register struct NSAPaddr *na;
                    886: int    compact;
                    887: {
                    888:     register int   n;
                    889:     int            first;
                    890:     register char *bp,
                    891:                  *cp,
                    892:                  *dp;
                    893:     register struct macro *m;
                    894:     register struct SSAPaddr *sa;
                    895:     register struct TSAPaddr *ta;
                    896:     register struct NSAPaddr *ca;
                    897:     static int    i = 0;
                    898:     static char buf1[BUFSIZ],
                    899:                buf2[BUFSIZ];
                    900:     static char *bufs[] = { buf1, buf2 };
                    901: 
                    902:     bp = cp = bufs[i++];
                    903:     i = i % 2;
                    904: 
                    905:     if (pa == NULLPA) {
                    906: bad_pa: ;
                    907:        (void) strcpy (bp, "NULLPA");
                    908:        return bp;
                    909:     }
                    910:     sa = &pa -> pa_addr;
                    911:     ta = &sa -> sa_addr;
                    912: 
                    913:     if (na)
                    914:        n = 1;
                    915:     else
                    916:        if ((n = ta -> ta_naddr) > 0)
                    917:            na = ta -> ta_addrs;
                    918: 
                    919:     if (pa -> pa_selectlen > 0) {
                    920:        (void) sprintf (cp, "%s/",
                    921:                        SEL2STR (pa -> pa_selector, pa -> pa_selectlen));
                    922:        cp += strlen (cp);
                    923:     }
                    924:     if (sa -> sa_selectlen > 0 || bp != cp) {
                    925:        (void) sprintf (cp, "%s/",
                    926:                        SEL2STR (sa -> sa_selector, sa -> sa_selectlen));
                    927:        cp += strlen (cp);
                    928:     }
                    929:     if (ta -> ta_selectlen > 0 || bp != cp) {
                    930:        (void) sprintf (cp, "%s/",
                    931:                        SEL2STR (ta -> ta_selector, ta -> ta_selectlen));
                    932:        cp += strlen (cp);
                    933:     }
                    934: 
                    935:     for (first = 1; n > 0; na++, n--) {
                    936:        register struct ts_interim *ts;
                    937: 
                    938:        if (first)
                    939:            first = 0;
                    940:        else
                    941:            *cp++ = '|';
                    942: 
                    943:        if (compact > 0) {
                    944:            if ((ca = na2norm (na)) == NULLNA)
                    945:                goto bad_pa;
                    946: 
                    947:            (void) strcpy (cp, "NS+");
                    948:            cp += strlen (cp);
                    949: 
                    950:            cp += explode (cp, (u_char *) ca -> na_address, ca -> na_addrlen);
                    951:            *cp = NULL;
                    952:            continue;
                    953:        }
                    954:        
                    955:        for (ts = ts_interim; ts -> ts_name; ts++)
                    956:            if (ts -> ts_subnet == na -> na_community)
                    957:                break;
                    958:        if (!ts -> ts_name) {
                    959:            SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    960:                  ("unable to find community #%d", na -> na_community));
                    961:            goto bad_pa;
                    962:        }
                    963:        if (!ts -> ts_value) {
                    964:            SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    965:                  ("community \"%s\" (subnet #%d) has no corresponding MACRO",
                    966:                   ts -> ts_name, na -> na_community));
                    967:            goto bad_pa;
                    968:        }
                    969:        (void) strcpy (dp = cp, ts -> ts_value);
                    970:        cp += strlen (cp) - 1;
                    971:        if (*cp != '+')
                    972:            *++cp = '+', *++cp = NULL;
                    973:        else
                    974:            cp++;
                    975: 
                    976:        switch (na -> na_stack) {
                    977:            case NA_NSAP:
                    978:                (void) strcpy (cp = dp, "NS+");
                    979:                cp += strlen (cp);
                    980: 
                    981:                cp += explode (cp, (u_char *) na -> na_address, na -> na_addrlen);
                    982:                *cp = NULL;
                    983:                break;
                    984: 
                    985:            case NA_TCP:
                    986:                (void) strcpy (cp, na -> na_domain);
                    987:                cp += strlen (cp);
                    988:                if (na -> na_port) {
                    989:                    (void) sprintf (cp, "+%d", (int) ntohs (na -> na_port));
                    990:                    cp += strlen (cp);
                    991: 
                    992:                    if (na -> na_tset) {
                    993:                        (void) sprintf (cp, "+%d", (int) na -> na_tset);
                    994:                        cp += strlen (cp);
                    995:                    }
                    996:                }
                    997:                break;
                    998: 
                    999:            case NA_X25:
                   1000:            case NA_BRG:
                   1001:                if (na -> na_community == SUBNET_INT_X25
                   1002:                        && na -> na_cudflen == 0
                   1003:                        && na -> na_pidlen == 0
                   1004:                        && na -> na_dte[0] != '0') {
                   1005:                    (void) sprintf (cp = dp, "X121+%s", na -> na_dte);
                   1006:                    cp += strlen (cp);
                   1007:                }
                   1008:                else {
                   1009:                    (void) strcpy (cp, na -> na_dte);
                   1010:                    cp += strlen (cp);
                   1011:                    if (na -> na_pidlen > 0) {
                   1012:                        (void) strcpy (cp, "+PID+");
                   1013:                        cp += strlen (cp);
                   1014: 
                   1015:                        cp += explode (cp, (u_char *) na -> na_pid,
                   1016:                                       (int) na -> na_pidlen);
                   1017:                    }
                   1018:                    else
                   1019:                        if (na -> na_cudflen > 0) {
                   1020:                            (void) strcpy (cp, "+CUDF+");
                   1021:                            cp += strlen (cp);
                   1022: 
                   1023:                            cp += explode (cp, (u_char *) na -> na_cudf,
                   1024:                                           (int) na -> na_cudflen);
                   1025:                        }
                   1026:                    *cp = NULL;
                   1027:                }
                   1028:                break;
                   1029: 
                   1030:            default:
                   1031:                SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                   1032:                      ("unknown address type 0x%x", na -> na_stack));
                   1033:                goto bad_pa;
                   1034:        }
                   1035: 
                   1036:        SLOG (addr_log, LLOG_DEBUG, NULLCP, ("dp = %s",dp));
                   1037: 
                   1038:        if (!compact && (m = value2macro (dp))) {
                   1039:            char    buffer[BUFSIZ];
                   1040: 
                   1041:            (void) sprintf (buffer, "%s=%s", m -> m_name,
                   1042:                            dp + strlen (m -> m_value));
                   1043:            (void) strcpy (dp, buffer);
                   1044:            cp = dp + strlen (dp);
                   1045:        }
                   1046:     }
                   1047:     *cp = NULL;
                   1048: 
                   1049:     return bp;
                   1050: }

unix.superglobalmegacorp.com

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