/* RPCAgent.c
RPC: Intertface to remote Binding and Authentication services
See [Indigo]<Voice>Agent>Agent.mesa
Last modified by D. Swinehart, October 27, 1982 8:28 PM
L. Stewart, January 1, 1983 4:48 PM, flush CStringToString
L. Stewart, January 2, 1983 6:24 PM, try again
L. Stewart, January 18, 1983 5:10 PM, Bonsai
L. Stewart, January 20, 1983 2:06 PM, bugs
L. Stewart, March 6, 1983 3:51 PM, remove Allocate
L. Stewart, April 18, 1983 11:13 AM, new Agent
L. Stewart, May 4, 1983 2:52 PM, AgentInitialize must be manual
*/
#include <Env.h>
#include <Signal.h>
#include <Context.h>
#include <Queue.h>
#include <rpc.h>
#include <rpcinternal.h>
#include <rpclupine.h>
#include <rpcpkt.h>
#include <rpcbind.h>
/* ---- Imports ---- */
extern int CallFailed;
extern int ImportFailed;
/* Bonsai package */
extern int *StartBonsai();
extern CallBonsai();
extern CleanupCall();
extern AllocWordsFromPkt();
extern StringToPkt();
/* OS */
extern Block();
extern Marshall();
extern MoveBlock();
extern Swab();
extern Zero();
/* signaller */
extern CONT();
extern ENABLE();
/* RPC */
extern struct ShortSTRING *CStringToString();
extern struct ImportInstance *ImportInterface();
extern struct VersionRange *matchAllVersions;
/* ---- Agent interface RPC indices ---- */
#define doAuthenticate 4
#define doVitae 5
/* ---- Types and variables ---- */
static struct ImportInstance agentInstance[1];
static struct ShortSTRING *agentRope;
/* ---- Agent procedures ---- */
/*
Call is [nonceID: INT, caller, callee: ROPE]
Return is
[authentication, authenticator: SEQUENCE OF WORD]
*/
int /* really Authentication */
AgentAuthenticate(nonceId, caller, callee, lvAuthenticator)
int nonceId, caller, callee, *lvAuthenticator;
{
struct Seal sl;
struct Seal1 csr;
int *ap, *sp;
int authentication;
if (ENABLE(CallFailed, &CONT, &sl)) return (0);
sp = ap = StartBonsai(agentInstance, &csr);
*ap++ = Swab(doAuthenticate); /* procedure index */
if (nonceId) Marshall(true, ap, nonceId, 2);
else Zero(ap, 2);
ap += 2;
ap = StringToPkt(ap, caller);
ap = StringToPkt(ap, callee);
CallBonsai(&csr, ap-sp);
ap = sp;
authentication = AllocWordsFromPkt(&ap, false);
*lvAuthenticator = AllocWordsFromPkt(&ap, false);
CleanupCall(&csr);
return (authentication);
};
/* Call is [clientMachine: Machine, range: INT, interfaceType: ROPE] */
/* Return is [Machine, ROPE, ROPE, ROPE] */
int Vitae(clientMachine, range, interfaceType, lvclientRname, lvclientInstance, lvserverInstance)
int clientMachine;
int *range;
struct ShortSTRING *interfaceType;
struct ShortSTRING **lvclientRname;
struct ShortSTRING **lvclientInstance;
struct ShortSTRING **lvserverInstance;
{
struct Seal sl;
struct Seal1 csr;
int serverMachine;
int *ap, *sp;
if (ENABLE(CallFailed, &CONT, &sl)) return (0);
/* this was
if (ENABLE(CallFailed, &CONT, &sl) || (agentInstance==0 && AgentInitialize() == false)) return (0);
*/
sp = ap = StartBonsai(agentInstance, &csr);
*ap++ = Swab(doVitae); /* procedure index */
*ap++ = clientMachine; /* byte pair really */
if (range) Marshall(true, ap, range, 2);
else Zero(ap, 2);
ap += 2;
ap = StringToPkt(ap, interfaceType);
CallBonsai(&csr, ap-sp);
serverMachine = *sp++;
*lvclientRname = AllocStringFromPkt(&sp);
*lvclientInstance = AllocStringFromPkt(&sp);
*lvserverInstance = AllocStringFromPkt(&sp);
CleanupCall(&csr);
return (serverMachine);
};
/* ---- Initialization ---- */
int /*BOOL*/ AgentInitialize()
{
struct InterfaceName interface;
struct Seal sl;
Zero(&interface, lenInterfaceName);
interface.type = agentRope;
interface.instance = 0;
Move2(&interface.version, matchAllVersions);
/* should be more selective? */
if (ENABLE(ImportFailed, &CONT, &sl)) return (false);
ImportInterface(0, &interface, agentInstance);
Block();
return (true);
};
AgentRopes()
{
agentRope = CStringToString("Agent.Lark");
};