DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T r

⟦8f9dad68d⟧ TextFile

    Length: 11337 (0x2c49)
    Types: TextFile
    Names: »rt2psinitiat.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Chans/x40088/rt2psinitiat.c« 

TextFile

/* rt2psinitiat.c - RTPM: initiator */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/x40088/RCS/rt2psinitiat.c,v 5.0 90/09/20 15:57:53 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Chans/x40088/RCS/rt2psinitiat.c,v 5.0 90/09/20 15:57:53 pp Exp Locker: pp $
 *
 * $Log:	rt2psinitiat.c,v $
 * Revision 5.0  90/09/20  15:57:53  pp
 * rcsforce : 5.0 public release
 * 
 */



/*
 *				  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 <isode/rtpkt.h>
#include <isode/tailor.h>

#if ISODE < 65
/* \f

   RT-OPEN.REQUEST */

int	RtOpenRequest (mode, turn, context, callingtitle, calledtitle,
	callingaddr, calledaddr, ctxlist, defctxname, data, qos,
	rtc, rti)
int	mode,
	turn;
OID	context;
AEI	callingtitle,
	calledtitle;
struct PSAPaddr *callingaddr,
		*calledaddr;
struct PSAPctxlist *ctxlist;
OID	defctxname;
PE	data;
struct QOStype *qos;
struct RtSAPconnect *rtc;
struct RtSAPindication *rti;
{
    SBV	    smask;
	int result;

    isodetailor (NULLCP, 0);

    switch (mode) {
	case RTS_MONOLOGUE:
	case RTS_TWA:
	    break;

	default:
	    return rtsaplose (rti, RTS_PARAMETER, NULLCP,
		    "bad value for mode parameter");
    }
    switch (turn) {
	case RTS_INITIATOR:
	case RTS_RESPONDER:
	    break;

	default:
	    return rtsaplose (rti, RTS_PARAMETER, NULLCP,
		    "bad value for turn parameter");
    }
    if (!ctxlist) {
	static struct PSAPctxlist ctxs;

	ctxlist = &ctxs;
	bzero ((char *) ctxlist, sizeof *ctxlist);
    }
    missingP (rtc);
    bzero ((char *) rtc, sizeof *rtc);
    missingP (rti);

    smask = sigioblock ();

    result = RtOpenRequestAux (mode, turn, context, callingtitle, calledtitle,
	callingaddr, calledaddr, ctxlist, defctxname, data, qos,
			       NULLOID, rtc, rti);

    (void) sigiomask (smask);

    return result;
}

RtOpenRequest2 (mode, turn, context, callingtitle, calledtitle,
	callingaddr, calledaddr, ctxlist, defctxname, data, qos,
	ctx, rtc, rti)
int	mode,
	turn;
OID	context;
AEI	callingtitle,
	calledtitle;
struct PSAPaddr *callingaddr,
		*calledaddr;
struct PSAPctxlist *ctxlist;
OID	defctxname;
PE	data;
OID	ctx;
struct QOStype *qos;
struct RtSAPconnect *rtc;
struct RtSAPindication *rti;
{
    SBV	    smask;
	int result;

    isodetailor (NULLCP, 0);

    switch (mode) {
	case RTS_MONOLOGUE:
	case RTS_TWA:
	    break;

	default:
	    return rtsaplose (rti, RTS_PARAMETER, NULLCP,
		    "bad value for mode parameter");
    }
    switch (turn) {
	case RTS_INITIATOR:
	case RTS_RESPONDER:
	    break;

	default:
	    return rtsaplose (rti, RTS_PARAMETER, NULLCP,
		    "bad value for turn parameter");
    }
    if (!ctxlist) {
	static struct PSAPctxlist ctxs;

	ctxlist = &ctxs;
	bzero ((char *) ctxlist, sizeof *ctxlist);
    }
    missingP (rtc);
    bzero ((char *) rtc, sizeof *rtc);
    missingP (rti);

    smask = sigioblock ();

    result = RtOpenRequestAux (mode, turn, context, callingtitle, calledtitle,
	callingaddr, calledaddr, ctxlist, defctxname, data, qos,
			       ctx, rtc, rti);

    (void) sigiomask (smask);

    return result;
}


/* \f

 */

static int  RtOpenRequestAux (mode, turn, context, callingtitle, calledtitle, 
	callingaddr, calledaddr, ctxlist, defctxname, data, qos,
	tctx, rtc, rti)
int	mode,
	turn;
OID	context;
AEI	callingtitle,
	calledtitle;
struct PSAPaddr *callingaddr,
		*calledaddr;
struct PSAPctxlist *ctxlist;
OID	defctxname;
PE	data;
struct QOStype *qos;
OID	tctx;
struct RtSAPconnect *rtc;
struct RtSAPindication *rti;
{
    register int    i;
    int	    result,
	    requirements,
	    offset,
	    rtsid,
	    settings;
    PE	    pe,
	    p,
	    q;
    register struct assocblk *acb;
    struct SSAPref *sr;
    register struct PSAPcontext *pp;
    register struct AcSAPconnect *acc = &rtc -> rtc_connect;
    register struct PSAPconnect *pc = &acc -> acc_connect;
    struct AcSAPindication acis;
    register struct AcSAPindication *aci = &acis;
    register struct AcSAPabort *aca = &aci -> aci_abort;
    int ct1, ct2;

/* begin RTORQ APDU */
    if ((pe = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS, 16)) == NULLPE) {
no_mem: ;
	result = rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");
	goto out1;
    }
    if ((DEFAULT_CKPOINT != PCONN_CK_DFLT
		&& set_add (pe, num2prim (DEFAULT_CKPOINT, PE_CLASS_CONT,
					  RTORQ_CKPOINT)) == NOTOK)
	    || (DEFAULT_WINDOW != PCONN_WD_DFLT
			&& set_add (pe, num2prim (DEFAULT_WINDOW,
						  PE_CLASS_CONT, RTORQ_WINDOW))
				== NOTOK)
	    || set_add (pe, num2prim (mode == RTS_TWA ? RTORQ_DM_TWA
			: RTORQ_DM_MONO, PE_CLASS_CONT, RTORQ_DIALOGUE))
		    == NOTOK
	    || set_add (pe, p = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
		    RTORQ_CONNDATA)) == NOTOK
	    || set_add (p, q = pe_alloc (PE_CLASS_CONT, PE_FORM_CONS,
		    RTORQ_CD_OPEN)) == NOTOK
	    || set_add (q, data ? data : pe_alloc (PE_CLASS_CONT,
		    PE_FORM_PRIM, 0)) == NOTOK)
	goto no_mem;
/* end RTORQ APDU */

    requirements = RTS_MYREQUIRE;
    settings = 0;
#define dotoken(requires,shift,bit,type) \
{ \
    if (requirements & requires) \
	if (turn == RTS_INITIATOR) \
	    settings |= ST_INIT_VALUE << shift; \
	else \
	    settings |= ST_RESP_VALUE << shift; \
}
    dotokens ();
#undef	dotoken

    if ((sr = addr2ref (PLocalHostName ())) == NULL) {
	result = rtsaplose (rti, RTS_CONGEST, NULLCP, "out of memory");
	goto out1;
    }

    if (ctxlist -> pc_nctx >= NPCTX) {
	result = rtsaplose (rti, RTS_PARAMETER, NULLCP,
			    "too many contexts");
	goto out1;
    }

    {
	register int ctx;
	register OID oid;

	if (tctx)
		oid = tctx;
	else if ((oid = ode2oid (RT_ASN)) == NULLOID) {
	    result = rtsaplose (rti, RTS_PARAMETER, NULLCP,
				"%s: unknown", RT_ASN);
	    goto out1;
	}

	i = ctxlist -> pc_nctx - 1, ctx = 1;
	for (pp = ctxlist -> pc_ctx; i >= 0; i--, pp++) {
	    if (oid_cmp (pp -> pc_asn, oid) == 0) {
		rtsid = pp -> pc_id;
		offset = pp - ctxlist -> pc_ctx;

		pp = NULL;
		goto ready;
	    }
	    if (ctx <= pp -> pc_id)
		ctx = pp -> pc_id + 2;
	}
	pp -> pc_id = ctx;
	if ((pp -> pc_asn = oid_cpy (oid)) == NULLOID)
	    goto no_mem;
	pp -> pc_atn = NULLOID;

	rtsid = pp -> pc_id;
	offset = -1;

	ctxlist -> pc_nctx++;
    }
ready: ;
    pe -> pe_context = rtsid;

    PLOG (rtsap_log, print_RTS_RTSE__apdus, pe, "RTORQapdu", 0);

    result = AcAssocRequest (context, callingtitle, calledtitle, callingaddr,
	    calledaddr, ctxlist, defctxname, 0, requirements,
	    SERIAL_NONE, settings, sr, &pe, 1, qos, acc, aci);

    if (pp) {
	oid_free (pp -> pc_asn);
	pp -> pc_asn = NULLOID;
    }

    if (data)
	(void) pe_extract (pe, data);
    pe_free (pe);
    pe = NULLPE;

    if (result == NOTOK) {
	(void) acs2rtslose (NULLACB, rti, "AcAssocRequest", aca);
	goto out1;
    }

    if (acc -> acc_result == ACS_ACCEPT) {
	if ((acb = findacblk (acc -> acc_sd)) == NULLACB) {
	    result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP, "ACSE mangled");
	    goto out2;
	}
    }
    else
	if (acc -> acc_result == ACS_ABORTED) {
	    (void) acs2rtsabort (acb, aca, rti);

	    rtc -> rtc_sd = NOTOK;
	    rtc -> rtc_result = RTS_ABORTED;

	    result = OK;
	    goto out2;
	}
	else
	    acb = NULLACB;

    if ((pe = acc -> acc_info[0]) == NULLPE) {
	if (acc -> acc_result != ACS_ACCEPT) {
	    aca -> aca_reason = acc -> acc_result;
	    (void) acs2rtslose (acb, rti, "AcAssocRequest(pseudo)", aca);

	    rtc -> rtc_sd = NOTOK;
	    rtc -> rtc_result = rti -> rti_abort.rta_reason;

	    result = OK;
	}
	else
	    if (acb)
		result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP, NULLCP);
	    else
		result = rtsaplose (rti, RTS_PROTOCOL, NULLCP, NULLCP);
	goto out2;
    }

    if (acc -> acc_result != ACS_ACCEPT) {
	acsap_data = NULLPE;
	if (PE_ID (pe -> pe_class, pe -> pe_id) != PE_ID (PE_CLASS_CONT, 18)) {
	    (void) rtsaplose (rti, RTS_PROTOCOL, NULLCP, NULLCP);
	    goto out2;
	}
	if (parse_RTS_RTSE__apdus (pe, 1, NULLIP, NULLVP, NULLCP) == NOTOK) {
	    result = pylose ();
	    goto out2;
	}

	PLOG (rtsap_log, print_RTS_RTSE__apdus, pe, "RTORJapdu", 1);

	rtc -> rtc_sd = NOTOK;
	rtc -> rtc_result = RTS_REJECT;
	(void) pe_extract (pe, rtc -> rtc_data = acsap_data);

	for (i = acc -> acc_ninfo - 1; i >= 0; i--) 
	    if (acc -> acc_info[i]) {
		pe_free (acc -> acc_info[i]);
		acc -> acc_info[i] = NULLPE;
	    }
	acc -> acc_ninfo = 0;

	return OK;
    }

    acb -> acb_flags |= ACB_RTS | ACB_INIT;
    acb -> acb_uabort = AcUAbortRequest;
    SetPS2RtService (acb);
    if (turn == RTS_INITIATOR)
	acb -> acb_flags |= ACB_TURN;
    if (mode == RTS_TWA)
	acb -> acb_flags |= ACB_TWA;
    acb -> acb_connect = *sr;	/* struct copy */
    if ((acb -> acb_requirements = pc -> pc_srequirements) != RTS_MYREQUIRE) {
	result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
		    "desired session requirements denied");
	goto out2;
    }
#define dotoken(requires,shift,bit,type) \
{ \
    if (acb -> acb_requirements & requires) \
	switch (pc -> pc_settings & (ST_MASK << shift)) { \
	    case ST_INIT_VALUE << shift: \
		acb -> acb_owned |= bit; \
		acb -> acb_avail |= bit; \
		break; \
 \
	    case ST_RESP_VALUE << shift: \
		acb -> acb_avail |= bit; \
		break; \
 \
	    default: \
		result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP, \
			    "%s token management botched", type); \
		goto out2; \
	} \
}
	dotokens ();
#undef	dotoken
    switch (turn) {
	case RTS_INITIATOR:
	    if (acb -> acb_owned == acb -> acb_avail)
		break;
	    result = rtsaplose (rti, RTS_PROTOCOL, NULLCP,
		    "token management botched");
	    goto out2;

	case RTS_RESPONDER:
	    if (acb -> acb_owned == 0)
		break;
	    result = rtsaplose (rti, RTS_PROTOCOL, NULLCP,
		    "token management botched");
	    goto out2;
    }
    acb -> acb_ssdusize = pc -> pc_ssdusize;

    acsap_ckpoint = RTOAC_CK_DFLT, acsap_window = RTOAC_WD_DFLT;
    acsap_data = NULLPE;
    if (parse_RTS_RTSE__apdus (pe, 1, NULLIP, NULLVP, NULLCP) == NOTOK) {
	result = pylose ();
	goto out2;
    }

    PLOG (rtsap_log, print_RTS_RTSE__apdus, pe, "RTOACapdu", 1);

    acb -> acb_ckpoint = acsap_ckpoint;
    acb -> acb_window = acsap_window;

    if ((i = offset) < 0)
	i = pc -> pc_ctxlist.pc_nctx - 1;
    pp = pc -> pc_ctxlist.pc_ctx + i;
    if (pp -> pc_id != rtsid) {
	result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
			    "RTSE PCI not found");
	goto out2;
    }
    if (pp -> pc_result != PC_ACCEPT) {
	result = rtpktlose (acb, rti, RTS_PROTOCOL, NULLCP,
			    "RTSE PCI rejected");
	goto out2;
    }

    if (offset < 0)
	pc -> pc_ctxlist.pc_nctx--;

    acb -> acb_rtsid = rtsid;
	
    rtc -> rtc_sd = acb -> acb_fd;
    rtc -> rtc_result = RTS_ACCEPT;
    (void) pe_extract (pe, rtc -> rtc_data = acsap_data);

    for (i = acc -> acc_ninfo - 1; i >= 0; i--) 
	if (acc -> acc_info[i]) {
	    pe_free (acc -> acc_info[i]);
	    acc -> acc_info[i] = NULLPE;
	}
    acc -> acc_ninfo = 0;
    if (tctx) oid_free (tctx);

    return OK;

out2: ;
    ACCFREE (acc);
    if (acb)
	freeacblk (acb);
	
out1: ;
    if (tctx) oid_free (tctx);
    if (pe) {
	if (data)
	    (void) pe_extract (pe, data);
	pe_free (pe);
    }

    return result;
}
#endif