|
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 i
Length: 6977 (0x1b41) Types: TextFile Names: »isoentity.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/acsap/isoentity.c«
/* isoentity.c - application entity titles -- sequential lookup utilities */ #ifndef lint static char *rcsid = "$Header: /f/osi/acsap/RCS/isoentity.c,v 6.0 89/03/18 23:24:42 mrose Rel $"; #endif /* * $Header: /f/osi/acsap/RCS/isoentity.c,v 6.0 89/03/18 23:24:42 mrose Rel $ * * * $Log: isoentity.c,v $ * Revision 6.0 89/03/18 23:24:42 mrose * Release 5.0 * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ /* LINTLIBRARY */ #include <ctype.h> #include <stdio.h> #include "psap.h" #include "isoaddrs.h" #include "tailor.h" /* \f DATA */ static char *isoentities = "isoentities"; static FILE *servf = NULL; static int stayopen = 0; static int mask; static int vecp; static char buffer[BUFSIZ + 1]; static char *vec[NVEC + NSLACK + 1]; static struct isoentity ies; struct nsap_entry { char *ns_service; IFP ns_parse; }; int tcpparse (), x25parse (), nsapparse (); struct nsap_entry _nsap_entries[] = { "NS", nsapparse, "TCP", tcpparse, "X.25", x25parse, NULL }; /* \f */ int setisoentity (f) int f; { if (servf == NULL) servf = fopen (isodefile (isoentities), "r"); else rewind (servf); stayopen |= f; return (servf != NULL); } int endisoentity () { if (servf && !stayopen) { (void) fclose (servf); servf = NULL; } return 1; } /* \f */ struct isoentity *getisoentity () { static char descriptor[BUFSIZ]; if (servf == NULL && (servf = fopen (isodefile (isoentities), "r")) == NULL) return NULL; while (_startisoentity (descriptor) == OK) if (_stopisoentity (descriptor, (struct isoentity *) NULL) == OK) return (&ies); return NULL; } /* \f */ int _startisoentity (descriptor) char *descriptor; { register char *cp, *dp; char *ep; register struct isoentity *ie = &ies; bzero ((char *) ie, sizeof *ie); ep = (dp = buffer) + sizeof buffer; while (fgets (dp, ep - dp, servf) != NULL) { if (*buffer == '#') continue; if (cp = index (buffer, '\n')) { *cp-- = NULL; if (*cp == '\\') { if ((dp = cp) + 1 >= ep) dp = buffer; continue; } } switch (vecp = str2vecX (buffer, vec, 5 + 1, &mask, NULL)) { case 3: /* no address */ case 4: /* new-style */ case 6: /* old-style */ break; default: continue; } (void) sprintf (descriptor, "%s-%s", vec[0], vec[1]); return OK; } return DONE; } /* \f */ int _stopisoentity (descriptor, iep) char *descriptor; struct isoentity *iep; { register int i; register char **ap; register struct nsap_entry *ns; register struct isoentity *ie = &ies; OID oid = &ie -> ie_identifier; struct PSAPaddr *pa = &ie -> ie_addr; struct SSAPaddr *sa = &pa -> pa_addr; struct TSAPaddr *ta = &sa -> sa_addr; struct NSAPaddr *na = ta -> ta_addrs; static unsigned int elements[NELEM + 1]; if (strcmp (vec[2], "NULL") == 0) elements[i = 0] = 0; else if ((i = str2elem (vec[2], elements)) <= 1) return NOTOK; oid -> oid_elements = elements; oid -> oid_nelem = i; ie -> ie_descriptor = descriptor; if (vecp == 3) /* no address */ goto out; if (vecp == 4) { /* new-style */ struct PSAPaddr *pz; if (pz = str2paddr (vec[3])) *pa = *pz; /* struct copy */ goto out; } pa -> pa_selectlen = str2sel (vec[3], (mask & (1 << 3)) ? 1 : 0, pa -> pa_selector, PSSIZE); sa -> sa_selectlen = str2sel (vec[4], (mask & (1 << 4)) ? 1 : 0, sa -> sa_selector, SSSIZE); ta -> ta_selectlen = str2sel (vec[5], (mask & (1 << 5)) ? 1 : 0, ta -> ta_selector, TSSIZE); if (vecp == 6) goto again; ap = vec + 6; for (;;) { if (ta -> ta_naddr < NTADDR) for (ns = _nsap_entries; ns -> ns_service; ns++) if (strcmp (ns -> ns_service, *ap) == 0) { bzero ((char *) na, sizeof *na); if ((*ns -> ns_parse) (na, ap + 1) == OK) na++, ta -> ta_naddr++; else bzero ((char *) na, sizeof *na); break; } again: ; if (fgets (buffer, sizeof buffer, servf) == NULL) break; if (*buffer == '#') goto again; /* yuk! */ if ((vecp = str2vec (buffer, vec)) == 0) break; if (vecp < 2) goto again; ap = vec; } out: ; if (iep) *iep = *ie; /* struct copy */ return OK; } /* \f */ int _scanisoentity () { for (;;) { if (fgets (buffer, sizeof buffer, servf) == NULL) break; if (*buffer == '#') continue; /* yuk! */ if ((vecp = str2vec (buffer, vec)) == 0) break; } } /* \f */ _printent (ie) register struct isoentity *ie; { LLOG (addr_log, LLOG_DEBUG, ("Entity: %s (%s)", ie -> ie_descriptor, oid2ode (&ie -> ie_identifier))); (void) ll_printf (addr_log, "Address: %s\n", paddr2str (&ie -> ie_addr, NULLNA)); (void) ll_printf (addr_log, "///////\n"); (void) ll_sync (addr_log); } /* \f OLD-STYLE */ /* \f */ static int nsapparse (na, args) register struct NSAPaddr *na; char **args; { char *cp; na -> na_type = NA_NSAP; if ((cp = *args++) == NULL) { na -> na_addrlen = 0; return OK; } na -> na_addrlen = implode ((u_char *) na -> na_address, cp, strlen (cp)); return OK; } /* \f */ static int tcpparse (na, args) register struct NSAPaddr *na; char **args; { int i; if (*args == NULL) return NOTOK; na -> na_type = NA_TCP; na -> na_subnet = SUBNET_INTERNET; (void) strncpy (na -> na_domain, *args++, sizeof na -> na_domain); if (*args && (i = atoi (*args++)) > 0) { na -> na_port = htons ((u_short) i); if (*args) na -> na_tset = atoi (*args++); } return OK; } /* \f */ static int x25parse (na, args) register struct NSAPaddr *na; char **args; { register char *cp; if (*args == NULL) return NOTOK; for (cp = *args; *cp; cp++) if (!isxdigit (*cp)) return NOTOK; if (cp - *args > (NSAP_DTELEN + 1) /* Maximum X.121 DTE address length */ ) return NOTOK; (void) strcpy (na -> na_dte, *args++); na -> na_dtelen = strlen (na -> na_dte); /* The only optional argument is the Protocol ID. * This may be a hex string (e.g. 03010100) or a (quoted) string. */ if (*args) { #ifdef DEBUG int len; if ((len = strlen (*args)) != NPSIZE * 2) SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ("invalid PID string \"%s\" length %d (should be %d)", *args, len, NPSIZE * 2)); #endif /* bogus use of -1 for "quoted" argument, really should be told if quoted or not */ na -> na_pidlen = str2sel (*args, -1, na -> na_pid, NPSIZE); } #ifdef BRIDGE_X25 na -> na_type = bridgediscrim (na) ? NA_BRG : NA_X25; #else na -> na_type = NA_X25; #endif na -> na_subnet = SUBNET_INTL_X25; return OK; }