|
|
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 r
Length: 8484 (0x2124)
Types: TextFile
Names: »ryinitiator.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/others/idist/ryinitiator.c«
/* ryinitiator.c - remote association initiator */
#ifndef lint
static char *rcsid = "$Header: /f/osi/others/idist/RCS/ryinitiator.c,v 6.0 89/03/18 23:36:59 mrose Rel $";
#endif
/*
* $Header: /f/osi/others/idist/RCS/ryinitiator.c,v 6.0 89/03/18 23:36:59 mrose Rel $
*
* Severely hacked to give embedded functionality for client.
*
* Julian Onions <jpo@cs.nott.ac.uk>
* Nottingham University Computer Science
*
* $Log: ryinitiator.c,v $
* Revision 6.0 89/03/18 23:36:59 mrose
* Release 5.0
*
*/
#include <stdio.h>
#include <varargs.h>
#include "Idist-ops.h"
#include "Idist-types.h"
#include "defs.h"
/* \f
DATA */
void adios (), advise (), ros_adios (), ros_advise (),
acs_advise (), acs_adios ();
char *getstring ();
static char *myservice = "isode idist";
static char *mycontext = "isode idist";
static char *mypci = "isode idist pci";
extern char *isodeversion;
static int ryconnect ();
/* \f
INITIATOR */
makeconn (thehost)
char *thehost;
{
int result;
PE data;
struct type_Idist_Initiate *initial;
char *cp;
char buf[BUFSIZ];
char ruser[128], *rhost;
static char lasthost[BUFSIZ];
if (lasthost[0] != 0) {
if (strcmp (thehost, lasthost) == 0)
return 1;
closeconn ();
}
(void) strcpy (lasthost, thehost);
if ((initial = (struct type_Idist_Initiate *)
malloc (sizeof *initial)) == NULL)
adios ("memory", "out of");
initial -> version = VERSION;
if (cp = index(thehost, '@')) {
rhost = cp + 1;
(void) strncpy (ruser, thehost, cp - thehost);
ruser[cp - thehost] = 0;
}
else {
(void) strcpy (ruser, user);
rhost = thehost;
}
if (!qflag)
printf ("updating host %s\n", rhost);
(void) sprintf (buf, "user (%s:%s): ", rhost, ruser);
cp = getstring (buf);
if (cp == NULL)
cp = ruser;
initial -> user = str2qb (cp, strlen (cp), 1);
(void) sprintf (buf, "password (%s:%s): ", rhost, cp);
cp = getpassword (buf);
initial -> passwd = str2qb (cp, strlen(cp), 1);
bzero (cp, strlen (cp)); /* in case of cores */
if (encode_Idist_Initiate (&data, 1, 0, NULLCP, initial) == NOTOK) {
advise (NULLCP, "Error encoding data");
return 0;
}
data -> pe_context = 3; /* hack */
result = ryconnect (rhost, data, myservice, mycontext, mypci);
free_Idist_Initiate (initial);
return result == OK ? 1 : 0;
}
static int ry_sd = NOTOK;
static int ryconnect (thehost, data, theservice, thecontext, thepci)
char *thehost,
*theservice,
*thecontext,
*thepci;
PE data;
{
struct SSAPref sfs;
register struct SSAPref *sf;
register struct PSAPaddr *pa;
struct AcSAPconnect accs;
register struct AcSAPconnect *acc = &accs;
struct AcSAPindication acis;
register struct AcSAPindication *aci = &acis;
register struct AcSAPabort *aca = &aci -> aci_abort;
AEI aei;
OID ctx,
pci;
struct PSAPctxlist pcs;
register struct PSAPctxlist *pc = &pcs;
struct RoSAPindication rois;
register struct RoSAPindication *roi = &rois;
register struct RoSAPpreject *rop = &roi -> roi_preject;
if ((aei = str2aei (thehost, theservice)) == NULLAEI)
adios (NULLCP, "%s-%s: unknown application-entity",
thehost, theservice);
if ((pa = aei2addr (aei)) == NULLPA)
adios (NULLCP, "address translation failed");
if ((ctx = ode2oid (thecontext)) == NULLOID)
adios (NULLCP, "%s: unknown object descriptor", thecontext);
if ((ctx = oid_cpy (ctx)) == NULLOID)
adios (NULLCP, "out of memory");
if ((pci = ode2oid (thepci)) == NULLOID)
adios (NULLCP, "%s: unknown object descriptor", thepci);
if ((pci = oid_cpy (pci)) == NULLOID)
adios (NULLCP, "out of memory");
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);
}
if (AcAssocRequest (ctx, NULLAEI, aei, NULLPA, pa, pc, NULLOID,
0, ROS_MYREQUIRE, SERIAL_NONE, 0, sf, &data, 1, NULLQOS,
acc, aci)
== NOTOK)
acs_adios (aca, "A-ASSOCIATE.REQUEST");
if (acc -> acc_result != ACS_ACCEPT) {
int slen;
char *str;
if (acc -> acc_ninfo > 0 && (str = prim2str(acc->acc_info[0], &slen)))
adios (NULLCP, "association rejected: [%s] %*.*s",
AcErrString (acc -> acc_result),
slen, slen, str);
else
adios (NULLCP, "association rejected: [%s]",
AcErrString (acc -> acc_result));
}
ry_sd = acc -> acc_sd;
ACCFREE (acc);
if (RoSetService (ry_sd, RoPService, roi) == NOTOK)
ros_adios (rop, "set RO/PS fails");
return OK;
}
closeconn ()
{
struct AcSAPrelease acrs;
register struct AcSAPrelease *acr = &acrs;
struct AcSAPindication acis;
register struct AcSAPindication *aci = &acis;
register struct AcSAPabort *aca = &aci -> aci_abort;
if (ry_sd == NOTOK)
return;
if (AcRelRequest (ry_sd, ACF_NORMAL, NULLPEP, 0, acr, aci) == NOTOK)
acs_adios (aca, "A-RELEASE.REQUEST");
if (!acr -> acr_affirmative) {
(void) AcUAbortRequest (ry_sd, NULLPEP, 0, aci);
adios (NULLCP, "release rejected by peer: %d", acr -> acr_reason);
}
ACRFREE (acr);
}
/* \f
*/
invoke (op, arg, ffx, rfx, efx)
int op;
caddr_t arg;
IFP ffx, rfx, efx;
{
int result;
struct RoSAPindication rois;
register struct RoSAPindication *roi = &rois;
register struct RoSAPpreject *rop = &roi -> roi_preject;
extern int result_value;
switch (result = RyStub (ry_sd, table_Idist_Operations, op,
RyGenID (ry_sd), NULLIP, arg, rfx, efx,
ROS_SYNC, roi)) {
case NOTOK: /* failure */
if (ROS_FATAL (rop -> rop_reason))
ros_adios (rop, "STUB");
ros_advise (rop, "STUB");
break;
case OK: /* got a result/error response */
break;
case DONE: /* got RO-END? */
adios (NULLCP, "got RO-END.INDICATION");
/* NOTREACHED */
default:
adios (NULLCP, "unknown return from RyStub=%d", result);
/* NOTREACHED */
}
if (ffx && arg)
(*ffx) (arg);
return result_value;
}
/* \f
*/
/* \f
*/
void ros_adios (rop, event)
register struct RoSAPpreject *rop;
char *event;
{
ros_advise (rop, event);
cleanup ();
_exit (1);
}
void ros_advise (rop, event)
register struct RoSAPpreject *rop;
char *event;
{
char buffer[BUFSIZ];
if (rop -> rop_cc > 0)
(void) sprintf (buffer, "[%s] %*.*s", RoErrString (rop -> rop_reason),
rop -> rop_cc, rop -> rop_cc, rop -> rop_data);
else
(void) sprintf (buffer, "[%s]", RoErrString (rop -> rop_reason));
advise (NULLCP, "%s: %s", event, buffer);
}
/* \f
*/
void acs_adios (aca, event)
register struct AcSAPabort *aca;
char *event;
{
acs_advise (aca, event);
cleanup ();
_exit (1);
}
void acs_advise (aca, event)
register struct AcSAPabort *aca;
char *event;
{
char buffer[BUFSIZ];
if (aca -> aca_cc > 0)
(void) sprintf (buffer, "[%s] %*.*s",
AcErrString (aca -> aca_reason),
aca -> aca_cc, aca -> aca_cc, aca -> aca_data);
else
(void) sprintf (buffer, "[%s]", AcErrString (aca -> aca_reason));
advise (NULLCP, "%s: %s (source %d)", event, buffer,
aca -> aca_source);
}
/* \f
*/
#ifndef lint
void _advise ();
void adios (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
cleanup ();
va_end (ap);
_exit (1);
}
#else
/* VARARGS */
void adios (what, fmt)
char *what,
*fmt;
{
adios (what, fmt);
}
#endif
#ifndef lint
void advise (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
}
static void _advise (ap)
va_list ap;
{
char buffer[BUFSIZ];
asprintf (buffer, ap);
(void) fflush (stdout);
fprintf (stderr, "%s: ", myname);
(void) fputs (buffer, stderr);
(void) fputc ('\n', stderr);
(void) fflush (stderr);
}
#else
/* VARARGS */
void advise (what, fmt)
char *what,
*fmt;
{
advise (what, fmt);
}
#endif
#ifndef lint
void ryr_advise (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
}
#else
/* VARARGS */
void ryr_advise (what, fmt)
char *what,
*fmt;
{
ryr_advise (what, fmt);
}
#endif
char *getstring (prompt)
char *prompt;
{
static char buffer[BUFSIZ];
char *cp;
fputs (prompt, stdout);
(void) fflush (stdout);
if (fgets (buffer, sizeof buffer, stdin) == NULL)
return NULLCP;
if (cp = index (buffer, '\n'))
*cp = '\0';
if (buffer[0] == '\0')
return NULLCP;
return buffer;
}