|
|
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 a
Length: 4853 (0x12f5)
Types: TextFile
Names: »assoc.c«
└─⟦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«
/* 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;
}