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 a

⟦f2c18b28f⟧ TextFile

    Length: 4853 (0x12f5)
    Types: TextFile
    Names: »assoc.c«

Derivation

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

TextFile

/* assoc.c: association functions for clients */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Src/qmgr/RCS/assoc.c,v 5.0 90/09/20 16:20:59 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Src/qmgr/RCS/assoc.c,v 5.0 90/09/20 16:20:59 pp Exp Locker: pp $
 *
 * $Log:	assoc.c,v $
 * Revision 5.0  90/09/20  16:20:59  pp
 * rcsforce : 5.0 public release
 * 
 */



#include "util.h"
#include <isode/rosy.h>
#include "types.h"
#include "qmgr.h"

int	assoc_start (myservice, fd)
char	*myservice;
int	*fd;
{
	extern char *pptsapd_addr;
	struct PSAPctxlist pcs;
	register struct PSAPctxlist *pc = &pcs;
	struct SSAPref sfs;
	register struct SSAPref *sf;
	struct TSAPaddr *ta;
	static struct PSAPaddr pas, *pa;
	OID     ctx,
		pci;
	struct AcSAPconnect accs;
	register struct AcSAPconnect   *acc = &accs;
	struct AcSAPindication  acis;
	register struct AcSAPindication *aci = &acis;
	register struct AcSAPabort *aca = &aci -> aci_abort;
	struct RoSAPindication rois;
	register struct RoSAPindication *roi = &rois;
	register struct RoSAPpreject *rop = &roi -> roi_preject;
	int	result;

	if (pa == NULLPA) {
		if ((pa = str2paddr (pptsapd_addr)) == NULLPA) {
			advise (LLOG_EXCEPTIONS, NULLCP, "Can't translate %s",
				pptsapd_addr);
			return NOTOK;
		}
		pas = *pa;
		pa = &pas;
	}
        ta = &pa -> pa_addr.sa_addr;
	ta -> ta_selectlen = str2sel (myservice, 1, ta -> ta_selector, TSSIZE);

	if ((ctx = oid_cpy (CHANNEL_AC)) == NULLOID) {
		advise (LLOG_EXCEPTIONS, NULLCP, "out of memory");
		return NOTOK;
	}
	if ((pci = oid_cpy (CHANNEL_PCI)) == NULLOID) {
		advise (LLOG_EXCEPTIONS, NULLCP, "out of memory");
		return NOTOK;
	}
	pc -> pc_nctx = 1;
	pc -> pc_ctx[0].pc_id = 1;
	pc -> pc_ctx[0].pc_asn = pci;
	pc -> pc_ctx[0].pc_atn = NULLOID;

	if ((sf = addr2ref (PLocalHostName ())) == NULL) {
		sf = &sfs;
		(void) bzero ((char *) sf, sizeof *sf);
	}
	switch (result = AcAsynAssocRequest (ctx, NULLAEI, NULLAEI, NULLPA,
					     pa, pc, NULLOID, 0, ROS_MYREQUIRE,
					     SERIAL_NONE, 0, sf, NULLPEP, 0,
					     NULLQOS, acc, aci, 1)) {
	    case NOTOK:
		acs_advise (aca, "A-ASSOCIATE.REQUEST");
		return NOTOK;
#ifdef CONNECTING_1
	    case CONNECTING_1:
	    case CONNECTING_2:
		*fd = acc -> acc_sd;
		ACCFREE (acc);
		PP_TRACE (("Association initiated"));
		return result;
#else
	    case OK:
		*fd = acc -> acc_sd;
		ACCFREE (acc);
		PP_TRACE (("Association initiated"));
		return OK;
#endif
	    case DONE:
		if (acc -> acc_result != ACS_ACCEPT) {
			advise (LLOG_EXCEPTIONS, NULLCP,
				"Association rejected: [%s]",
				AcErrString (acc -> acc_result));
			return NOTOK;
		}
		*fd = acc -> acc_sd;
		ACCFREE (acc);
		PP_TRACE (("Association established"));
		if (RoSetService (*fd, RoPService, roi) == NOTOK) {
			ros_advise (rop, "set RO/PS fails");
			return NOTOK;
		}
		PP_TRACE (("Service set"));
		return DONE;
	    default:
		adios (NULLCP, "Bad response from AcAsynAssocRequest");
		return NOTOK;
	}
}

int acsap_retry (fd)
int	fd;
{
	struct AcSAPconnect accs;
	register struct AcSAPconnect   *acc = &accs;
	struct AcSAPindication  acis;
	register struct AcSAPindication *aci = &acis;
	register struct AcSAPabort *aca = &aci -> aci_abort;
	struct RoSAPindication rois;
	register struct RoSAPindication *roi = &rois;
	register struct RoSAPpreject *rop = &roi -> roi_preject;
	int	result;

	PP_TRACE (("acsap_retry(%d)", fd));
	switch (result = AcAsynRetryRequest (fd, acc, aci)) {
#ifdef CONNECTING_1
	    case CONNECTING_1:
	    case CONNECTING_2:
		ACCFREE (acc);
		return result;
#else
	    case OK:
		ACCFREE (acc);
		return OK;
#endif
	    case NOTOK:
		acs_advise (aca, "A-ASSOCIATE.REQUEST");
		return NOTOK;
	    case DONE:
		if (acc -> acc_result != ACS_ACCEPT) {
			advise (LLOG_EXCEPTIONS, NULLCP,
				"Association Rejected: [%s]",
				AcErrString (acc -> acc_result));
			return NOTOK;
		}
		ACCFREE (acc);
		if (RoSetService (fd, RoPService, roi) == NOTOK) {
			ros_advise (rop, "set RO/PS fails");
			return NOTOK;
		}
		return DONE;
	    default:
		adios (NULLCP, "Bad response from AcAsynRetryRequest");
		return NOTOK;
	}
}

int  assoc_release (sd)
int     sd;
{
	struct AcSAPrelease acrs;
	register struct AcSAPrelease   *acr = &acrs;
	struct AcSAPindication  acis;
	register struct AcSAPindication *aci = &acis;
	register struct AcSAPabort *aca = &aci -> aci_abort;

#ifdef CONNECTING_1
	if (AcRelRequest (sd, ACF_NORMAL, NULLPEP, 0, NOTOK, acr, aci) == NOTOK) {
#else
	if (AcRelRequest (sd, ACF_NORMAL, NULLPEP, 0, acr, aci) == NOTOK) {
#endif
		acs_advise (aca, "A-RELEASE.REQUEST");
		return DONE;
	}

	if (!acr -> acr_affirmative) {
		(void) AcUAbortRequest (sd, NULLPEP, 0, aci);
		advise (LLOG_NOTICE, NULLCP, "Release rejected by peer: %d",
			acr -> acr_reason);
	}

	ACRFREE (acr);
	PP_TRACE (("Association released"));

	return DONE;
}