|
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 t
Length: 7822 (0x1e8e) Types: TextFile Names: »tsapinitiate.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/tsap/tsapinitiate.c«
/* tsapinitiate.c - TPM: initiator */ #ifndef lint static char *rcsid = "$Header: /f/osi/tsap/RCS/tsapinitiate.c,v 6.0 89/03/18 23:45:31 mrose Rel $"; #endif /* * $Header: /f/osi/tsap/RCS/tsapinitiate.c,v 6.0 89/03/18 23:45:31 mrose Rel $ * * * $Log: tsapinitiate.c,v $ * Revision 6.0 89/03/18 23:45:31 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 <stdio.h> #include <signal.h> #include "tpkt.h" #include "isoservent.h" #include "tailor.h" static struct nsapent { int ns_type; int ns_stack; IFP ns_open; } nsaps[] = { #ifdef TCP NA_TCP, TS_TCP, tcpopen, #endif #ifdef X25 NA_X25, TS_X25, x25open, #endif #ifdef CONS NA_NSAP, TS_CONS, consopen, #endif #ifdef BRIDGE_X25 NA_BRG, TS_BRG, bridgeopen, #endif #ifdef TP4 NA_NSAP, TS_TP4, tp4open, #endif NOTOK, TS_NONE, NULL }; struct TSAPaddr *newtaddr (), *ta2norm (); /* \f T-(ASYN-)CONNECT.REQUEST */ int TAsynConnRequest (calling, called, expedited, data, cc, qos, tc, td, async) struct TSAPaddr *calling, *called; int expedited, cc, async; char *data; struct QOStype *qos; struct TSAPconnect *tc; struct TSAPdisconnect *td; { register int n; SBV smask; int result; register struct NSAPaddr *na; register struct nsapent *ns; isodetailor (NULLCP, 0); #ifdef notdef missingP (calling); #endif missingP (called); if ((n = called -> ta_naddr) <= 0) return tsaplose (td, DR_PARAMETER, NULLCP, "no NSAP addresses in called parameter"); if (n > NTADDR) return tsaplose (td, DR_PARAMETER, NULLCP, "too many NSAP addresses in called parameter"); if ((called = ta2norm (called)) == NULLTA) return tsaplose (td, DR_PARAMETER, "invalid called parameter"); for (na = called -> ta_addrs, n = called -> ta_naddr - 1; n >= 0; na++, n--) { for (ns = nsaps; ns -> ns_open; ns++) if (ns -> ns_type == na -> na_type && (ns -> ns_stack & ts_stacks)) break; if (ns -> ns_open) break; } if (!ns -> ns_open) return tsaplose (td, DR_PARAMETER, NULLCP, "no supported NSAP addresses in called parameter"); toomuchP (data, cc, TS_SIZE, "initial"); #ifdef notdef missingP (qos); #endif missingP (td); smask = sigioblock (); result = TConnRequestAux (calling, called, expedited, data, cc, qos, tc, td, async); (void) sigiomask (smask); return result; } /* \f */ static int TConnRequestAux (calling, called, expedited, data, cc, qos, tc, td, async) struct TSAPaddr *calling, *called; char *data; int expedited, cc, async; struct QOStype *qos; register struct TSAPconnect *tc; register struct TSAPdisconnect *td; { int result; register int n; register struct NSAPaddr *na; register int l; register struct NSAPaddr *la; register struct tsapblk *tb; register struct TSAPdisconnect *te = td; struct TSAPdisconnect tds; if ((tb = newtblk ()) == NULL) return tsaplose (td, DR_CONGEST, NULLCP, "out of memory"); if (calling == NULLTA) { static struct TSAPaddr tas; calling = &tas; bzero ((char *) calling, sizeof *calling); } if (called -> ta_selectlen > 0 && calling -> ta_selectlen == 0) { calling -> ta_port = htons ((u_short) (0x8000 | (getpid () & 0x7fff))); calling -> ta_selectlen = sizeof calling -> ta_port; } if (qos) tb -> tb_qos = *qos; /* struct copy */ for (na = called -> ta_addrs, n = called -> ta_naddr - 1; n >= 0; na++, n--) { register struct nsapent *ns; for (l = calling -> ta_naddr - 1, la = calling -> ta_addrs; l >= 0; la++, l--) if (la -> na_type == na -> na_type) break; if (l < 0) la = NULLNA; for (ns = nsaps; ns -> ns_open; ns++) if (ns -> ns_type == na -> na_type && (ns -> ns_stack & ts_stacks)) break; if (!ns -> ns_open) continue; switch (ns -> ns_type) { case NA_NSAP: if ((result = (*ns -> ns_open) (tb, calling, la, called, na, te, async)) == NOTOK) { te = &tds; continue; } break; default: if ((result = (*ns -> ns_open) (tb, la, na, te, async)) == NOTOK) { te = &tds; continue; } break; } break; } if (tb -> tb_fd == NOTOK) goto out; if (te != td) *td = *te; /* struct copy */ tb -> tb_initiating = *newtaddr (calling, la); /* struct copy */ tb -> tb_responding = *newtaddr (called, na); /* struct copy */ if ((*tb -> tb_connPfnx) (tb, expedited, data, cc, td) == NOTOK) goto out; if (async) { tc -> tc_sd = tb -> tb_fd; if (result == OK) return OK; } if ((result = (*tb -> tb_retryPfnx) (tb, async, tc, td)) == DONE && !async) result = OK; return result; out: ; freetblk (tb); return NOTOK; } /* \f T-ASYN-RETRY.REQUEST (pseudo) */ int TAsynRetryRequest (sd, tc, td) int sd; struct TSAPconnect *tc; struct TSAPdisconnect *td; { SBV smask; int result; register struct tsapblk *tb; missingP (tc); missingP (td); smask = sigioblock (); if ((tb = findtblk (sd)) == NULL) { (void) sigiomask (smask); return tsaplose (td, DR_PARAMETER, NULLCP, "invalid transport descriptor"); } if (tb -> tb_flags & TB_CONN) { (void) sigiomask (smask); return tsaplose (td, DR_OPERATION, NULLCP, "transport descriptor connected"); } result = (*tb -> tb_retryPfnx) (tb, 1, tc, td); (void) sigiomask (smask); return result; } /* \f */ static struct TSAPaddr *newtaddr (ta, na) register struct TSAPaddr *ta; register struct NSAPaddr *na; { static struct TSAPaddr tzs; register struct TSAPaddr *tz = &tzs; register struct NSAPaddr *nz = tz -> ta_addrs; bzero ((char *) tz, sizeof *tz); if (tz -> ta_selectlen = ta -> ta_selectlen) bcopy (ta -> ta_selector, tz -> ta_selector, ta -> ta_selectlen); if (na) { *nz = *na; tz -> ta_naddr = 1; } return tz; } /* \f */ struct TSAPaddr *ta2norm (ta) register struct TSAPaddr *ta; { register int n, *ip; static struct TSAPaddr tzs; register struct TSAPaddr *tz = &tzs; register struct NSAPaddr *na, *ca; SLOG (addr_log, LLOG_TRACE, NULLCP, ("ta2norm %s", taddr2str (ta))); for (na = ta -> ta_addrs, n = ta -> ta_naddr - 1; n >= 0; na++, n--) if (na -> na_subnet == 0) switch (na -> na_type) { case NA_NSAP: na -> na_subnet = SUBNET_REALNS; break; case NA_TCP: na -> na_subnet = SUBNET_INTERNET; break; case NA_X25: case NA_BRG: na -> na_subnet = SUBNET_INTL_X25; break; default: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ("ta2norm: invalid NSAP address at offset %d", na - ta -> ta_addrs)); return NULLTA; } bzero ((char *) tz, sizeof *tz); bcopy (ta -> ta_selector, tz -> ta_selector, tz -> ta_selectlen = ta -> ta_selectlen); ca = tz -> ta_addrs; for (ip = ts_communities; *ip; ip++) for (na = ta -> ta_addrs, n = ta -> ta_naddr - 1; n >= 0; na++, n--) if (*ip == na -> na_subnet) { *ca++ = *na; /* struct copy */ tz -> ta_naddr++; } for (na = ta -> ta_addrs, n = ta -> ta_naddr - 1; n >= 0; na++, n--) { for (ip = ts_communities; *ip; ip++) if (*ip == na -> na_subnet) break; if (!*ip) { *ca++ = *na; /* struct copy */ tz -> ta_naddr++; } } SLOG (addr_log, LLOG_TRACE, NULLCP, ("ta2norm returns %s", taddr2str (tz))); return tz; } /* \f */