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

1.1       root        1: /* na2norm.c - normalize NSAPaddr */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/compat/RCS/na2norm.c,v 7.1 90/07/09 14:32:04 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/compat/RCS/na2norm.c,v 7.1 90/07/09 14:32:04 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       na2norm.c,v $
                     12:  * Revision 7.1  90/07/09  14:32:04  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.0  89/11/23  21:23:18  mrose
                     16:  * Release 6.0
                     17:  * 
                     18:  */
                     19: 
                     20: /*
                     21:  *                               NOTICE
                     22:  *
                     23:  *    Acquisition, use, and distribution of this module and related
                     24:  *    materials are subject to the restrictions of a license agreement.
                     25:  *    Consult the Preface in the User's Manual for the full terms of
                     26:  *    this agreement.
                     27:  *
                     28:  */
                     29: 
                     30: 
                     31: /* LINTLIBRARY */
                     32: 
                     33: #include <stdio.h>
                     34: #include "general.h"
                     35: #include "manifest.h"
                     36: #include "isoaddrs.h"
                     37: #include "internet.h"
                     38: #include "tailor.h"
                     39: 
                     40: /*  */
                     41: 
                     42: struct NSAPaddr *na2norm (na)
                     43: register struct NSAPaddr *na;
                     44: {
                     45:     int            ilen;
                     46:     register char  *cp,
                     47:                   *dp;
                     48:     char    nsap[NASIZE * 2 + 1];
                     49:     register struct hostent *hp;
                     50:     register struct ts_interim *ts;
                     51:     static struct NSAPaddr nas;
                     52:     register struct NSAPaddr *ca = &nas;
                     53: 
                     54:     if (na -> na_stack == NA_NSAP) {
                     55:        *ca = *na;      /* struct copy */
                     56:        return ca;
                     57:     }
                     58: 
                     59:     bzero ((char *) ca, sizeof *ca);
                     60:     ca -> na_stack = NA_NSAP;
                     61: 
                     62:     for (ts = ts_interim; ts -> ts_name; ts++)
                     63:        if (ts -> ts_subnet == na -> na_community)
                     64:            break;
                     65:     if (!ts -> ts_name) {
                     66:        SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                     67:              ("unable to find community #%d", na -> na_community));
                     68:        return NULLNA;
                     69:     }
                     70:     
                     71:     cp = nsap;
                     72:     switch (na -> na_stack) {
                     73:        case NA_TCP:
                     74:            if ((hp = gethostbystring (na -> na_domain)) == NULL) {
                     75:                SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                     76:                      ("%s: unknown host", na -> na_domain));
                     77:                return NULLNA;
                     78:            }
                     79: #define        s2a(b)  (((int) (b)) & 0xff)
                     80:            (void) sprintf (cp, "%03d%03d%03d%03d",
                     81:                            s2a (hp -> h_addr[0]),
                     82:                            s2a (hp -> h_addr[1]),
                     83:                            s2a (hp -> h_addr[2]),
                     84:                            s2a (hp -> h_addr[3]));
                     85:            cp += strlen (cp);
                     86: #undef s2a
                     87: 
                     88:            if (na -> na_port) {
                     89:                (void) sprintf (cp, "%05d", (int) ntohs (na -> na_port));
                     90:                cp += strlen (cp);
                     91: 
                     92:                if (na -> na_tset || na -> na_tset != NA_TSET_TCP) {
                     93:                    (void) sprintf (cp, "%05d", (int) na -> na_tset);
                     94:                    cp += strlen (cp);
                     95:                }
                     96:            }
                     97:            break;
                     98: 
                     99:        case NA_X25:
                    100:        case NA_BRG:
                    101:            if (na -> na_community == SUBNET_INT_X25
                    102:                    && na -> na_cudflen == 0
                    103:                    && na -> na_pidlen == 0
                    104:                    && na -> na_dte[0] != '0') {        /* SEK - X121 form */
                    105:                                                /* should be more general */
                    106:                (void) sprintf (nsap, "36%014s", na -> na_dte);
                    107:                ts = NULL;
                    108:                break;
                    109:            }
                    110: 
                    111:            if (ilen = na -> na_pidlen & 0xff)
                    112:                *cp++ = '1', dp = na -> na_pid;
                    113:            else
                    114:                if (ilen = na -> na_cudflen & 0xff)
                    115:                    *cp++ = '2', dp = na -> na_cudf;
                    116:                else
                    117:                    *cp++ = '0';
                    118:            if (ilen) {
                    119:                (void) sprintf (cp, "%01d", ilen);
                    120:                cp += strlen (cp);
                    121: 
                    122:                for (; ilen-- > 0; cp += 3)
                    123:                    (void) sprintf (cp, "%03d", *dp++ & 0xff);
                    124:            }
                    125:            (void) strcpy (cp, na -> na_dte);
                    126:            break;
                    127: 
                    128:        default:
                    129:            SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP,
                    130:                  ("unknown address type 0x%x", na -> na_stack));
                    131:            return NULLNA;
                    132:     }
                    133: 
                    134:     cp = nsap, dp = ca -> na_address;
                    135:     if (ts) {
                    136:        bcopy (ts -> ts_prefix, dp, ts -> ts_length);
                    137:        dp += ts -> ts_length;
                    138:     }
                    139:     while (*cp) {
                    140:        *dp = (*cp++ - '0') << 4;
                    141:        if (*cp)
                    142:            *dp++ |= (*cp++ - '0') & 0x0f;
                    143:        else
                    144:            *dp++ |= 0x0f;
                    145:     }
                    146:     ca -> na_addrlen = dp - ca -> na_address;
                    147: 
                    148:     return ca;    
                    149: }

unix.superglobalmegacorp.com

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