|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 6692 (0x1a24) Types: TextFile Names: »dse2psap.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦041b9c0f8⟧ »EurOpenD22/isode/pepsy.system-6.0.Z« └─⟦d49939f05⟧ └─⟦6a28ec38e⟧ »pepsy.tar« └─⟦this⟧ »acsap/dse2psap.c«
/* Copyright 1989 CSIRO Division of Information Technology * May be given away but not sold for profit - See Copyright file for details */ /* * Routine to convert a type_DSE_PSAPaddr structure into PSAPaddr structure * which pepsy generated decoder accepts */ #include <stdio.h> #include "psap.h" #include "isoaddrs.h" #include "tailor.h" #include "DSE-types.h" #define advise PY_advise #define new(x) (x *) malloc(sizeof (x)) #define getstr(ss,sl,ds,dl,dn,w) \ if (sl > dn) { \ advise (NULLCP, "%s too long", w); \ return NOTOK; \ } \ bcopy (ss, ds, dl = sl); struct PSAPaddr * dse2psap(dse) struct type_DSE_PSAPaddr *dse; { struct PSAPaddr *psap; struct member_DSE_0 *nDSE; struct SSAPaddr *sa; struct TSAPaddr *ta; char *p; if ((psap = new(struct PSAPaddr)) == NULL) { return (NULL); } bzero(psap, sizeof (struct PSAPaddr)); sa = &psap -> pa_addr; ta = &sa -> sa_addr; psap->pa_selectlen = gstring(psap->pa_selector, sizeof (psap->pa_selector), dse->pSelector, "psap selector"); sa->sa_selectlen = gstring(sa->sa_selector, sizeof (sa->sa_selector), dse->sSelector, "ssap selector"); ta->ta_selectlen = gstring(ta->ta_selector, sizeof (ta->ta_selector), dse->tSelector, "tsap selector"); for (nDSE = dse->nAddress; nDSE != NULL; nDSE = nDSE->next) { if (ta -> ta_naddr >= NTADDR) { advise (NULLCP, "too many network addresses"); return (NULL); } p = qb2str(nDSE->member_DSE_1); str2nsap(p, nDSE->member_DSE_1->qb_len, &ta->ta_addrs[ta->ta_naddr++]); } return (psap); } static int gstring(buf, buflen, qb, mesg) char buf[]; int buflen; struct qbuf *qb; char *mesg; { char *p; if (qb->qb_len > buflen) { advise(NULLCP, "%s too long", mesg); return (NULL); } p = qb2str(qb); bcopy(p, buf, qb->qb_len); return (qb->qb_len); } str2nsap(p, len, na) char *p; int len; struct NSAPaddr *na; { #define x(a,b) ((char) (((a) << 4) | b)) static char interim_idp[] = { x (5, 4), x (0, 0), x (7, 2), x (8, 7), x (2, 2) }; #undef x na -> na_type = NA_NSAP; if ((len == 8) && ((p[0] == 0x36) || (p[0] == 0x37))) { int xlen; /* SEK - X121 form */ register char *cp, *cp2, *dp; char nsap[14]; dp = nsap; for (cp2 = (cp = p + 1) + 7; cp < cp2; cp++) { register int j; if ((j = ((*cp & 0xf0) >> 4)) > 9) goto concrete; *dp++ = j + '0'; if ((j = (*cp & 0x0f)) > 9) { if (j != 0x0f) goto concrete; } else *dp++ = j + '0'; } for (cp = nsap, xlen = 14; *cp == '0'; cp++, xlen--) continue; na -> na_dtelen = xlen; for (cp2 = na -> na_dte; xlen-- > 0; ) *cp2++ = *cp++; *cp2 = NULL; #ifdef BRIDGE_X25 na -> na_type = bridgediscrim (na) ? NA_BRG : NA_X25; #else na -> na_type = NA_X25; #endif na -> na_subnet = SUBNET_INT_X25; } else if (len > sizeof interim_idp && bcmp (p, interim_idp, sizeof interim_idp) == 0) { int i, ilen, rlen; register char *cp, *dp, *ep; char nsap[NASIZE * 2 + 1]; dp = nsap; for (cp = p + sizeof interim_idp, ep = p + len; cp < ep; cp++) { register int j; if ((j = ((*cp & 0xf0) >> 4)) > 9) { concrete: ; LLOG (addr_log, LLOG_EXCEPTIONS, ("invalid concrete encoding")); goto realNS; } *dp++ = j + '0'; if ((j = (*cp & 0x0f)) > 9) { if (j != 0x0f) goto concrete; } else *dp++ = j + '0'; } *dp = NULL; cp = nsap; if (strlen (cp) < 2) { LLOG (addr_log, LLOG_EXCEPTIONS, ("missing DSP prefix")); goto realNS; } (void) sscanf (cp, "%2d", &i); cp += 2; switch (na -> na_subnet = i) { case SUBNET_INT_X25: case SUBNET_JANET: if (strlen (cp) < 1) { LLOG (addr_log, LLOG_EXCEPTIONS, ("missing DTE+CUDF indicator: %s", nsap)); goto realNS; } (void) sscanf (cp, "%1d", &i); cp += 1; switch (i) { case 0: /* DTE only */ break; case 1: /* DTE+PID */ case 2: /* DTE+CUDF */ if (strlen (cp) < 1) { LLOG (addr_log, LLOG_EXCEPTIONS, ("missing DTE+CUDF indicator: %s", nsap)); goto realNS; } (void) sscanf (cp, "%1d", &ilen); cp += 1; rlen = ilen * 3; if (strlen (cp) < rlen) { LLOG (addr_log, LLOG_EXCEPTIONS, ("bad DTE+CUDF length: %s", nsap)); goto realNS; } if (i == 1) { if (ilen > NPSIZE) { LLOG (addr_log, LLOG_EXCEPTIONS, ("PID too long: %s", nsap)); goto realNS; } dp = na -> na_pid; na -> na_pidlen = ilen; } else { if (ilen > CUDFSIZE) { LLOG (addr_log, LLOG_EXCEPTIONS, ("CUDF too long: %s", nsap)); goto realNS; } dp = na -> na_cudf; na -> na_cudflen = ilen; } for (; rlen > 0; rlen -= 3) { (void) sscanf (cp, "%3d", &i); cp += 3; if (i > 255) { LLOG (addr_log, LLOG_EXCEPTIONS, ("invalid PID/CUDF: %s", nsap)); goto realNS; } *dp++ = i & 0xff; } break; default: LLOG (addr_log, LLOG_EXCEPTIONS, ("invalid DTE+CUDF indicator: %s", nsap)); goto realNS; } (void) strcpy (na -> na_dte, cp); na -> na_dtelen = strlen (na -> na_dte); #ifdef BRIDGE_X25 na -> na_type = bridgediscrim (na) ? NA_BRG : NA_X25; #else na -> na_type = NA_X25; #endif break; case SUBNET_INTERNET: if (strlen (cp) < 12) { LLOG (addr_log, LLOG_EXCEPTIONS, ("missing IP address: %s", nsap)); goto realNS; } { int q[4]; (void) sscanf (cp, "%3d%3d%3d%3d", q, q + 1, q + 2, q + 3); (void) sprintf (na -> na_domain, "%d.%d.%d.%d", q[0], q[1], q[2], q[3]); } cp += 12; if (*cp) { if (strlen (cp) < 5) { LLOG (addr_log, LLOG_EXCEPTIONS, ("missing port: %s", nsap)); goto realNS; } (void) sscanf (cp, "%5d", &i); cp += 5; na -> na_port = htons ((u_short) i); if (*cp) { if (strlen (cp) < 5) { LLOG (addr_log, LLOG_EXCEPTIONS, ("missing tset: %s", nsap)); goto realNS; } (void) sscanf (cp, "%5d", &i); cp += 5; na -> na_tset = (u_short) i; if (*cp) LLOG (addr_log, LLOG_EXCEPTIONS, ("extra TCP information: %s", nsap)); } } na -> na_type = NA_TCP; break; default: LLOG (addr_log, LLOG_EXCEPTIONS, ("unknown DSP prefix for interim IDP: %s", nsap)); goto realNS; } } else { realNS: ; getstr (p, len, na -> na_address, na -> na_addrlen, sizeof na -> na_address, "NSAP address"); } }