|
|
BSD 4.3reno
#include <stdio.h>
#include "generic.h" /* defines OPERATIONS and ERRORS */
#include <isode/rtsap.h>
#include <isode/rosap.h>
#define error printf
/* e.g., "directory" */
static char *myservice = "ROSRTTEST";
/* e.g., "directory services" */
static char *mycontext = "isode chic read";
static char *mypci = "isode chic read pci";
#define INVOKE 1 /* do a RoInvokeRequest */
#define INTREQ 2 /* do a RoIntrRequest */
#define INVERR 3 /* request an error */
#define INVURJ 4 /* request a user reject */
#define INVPRJ 5 /* request a provider reject */
#define TIMEOUT 30 /* seconds before RtWait times out */
main (argc, argv, envp)
int argc;
char **argv,
**envp;
{
int sd;
struct SSAPref sfs;
register struct SSAPref *sf;
register struct PSAPaddr *pa;
struct AcSAPconnect accs;
register struct AcSAPconnect *acc = &accs;
struct AcSAPrelease acrs;
register struct AcSAPrelease *acr = &acrs;
struct AcSAPindication acis;
register struct AcSAPindication *aci = &acis;
register struct AcSAPabort *aca = &aci -> aci_abort;
struct RoSAPindication rois;
register struct RoSAPpreject *rop = &rois.roi_preject;
register AEI aei;
register OID ctx, pci;
struct PSAPctxlist pcs;
register struct PSAPctxlist *pc = &pcs;
struct RtSAPindication rtis;
register struct RtSAPindication *rti = &rtis;
struct RtSAPconnect rtcs;
register struct RtSAPconnect *rtc = &rtcs;
register struct RtSAPabort *rta = &rti -> rti_abort;
if ((aei = str2aei (argv[1], myservice)) == NULLAEI)
error ("%s-%s: unknown application-entity", argv[1], myservice);
if ((pa = aei2addr (aei)) == NULLPA)
error ("address translation failed");
if ((ctx = ode2oid (mycontext)) == NULLOID)
error ("%s: unknown object descriptor", mycontext);
if ((ctx = oid_cpy (ctx)) == NULLOID)
error ("oid_cpy");
if ((pci = ode2oid (mypci)) == NULLOID)
error ("%s: unknown object descriptor", mypci);
if ((pci = oid_cpy (pci)) == NULLOID)
error ("oid_cpy");
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);
}
fprintf(stderr, "RT-OPEN.REQUEST:\n");
if (RtOpenRequest (RTS_TWA, RTS_INITIATOR, ctx, NULLAEI, NULLAEI,
NULLPA, pa, pc, NULLOID, 0, NULLQOS, rtc, rti)
== NOTOK)
fprintf(stderr, "RT-OPEN.REQUEST: %s", RtErrString (rta -> rta_reason));
if (rtc -> rtc_result != RTS_ACCEPT)
fprintf(stderr, "association rejected: %s",
RtErrString (rta->rta_reason));
sd = rtc -> rtc_sd;
RTCFREE (rtc);
if (RoSetService (sd, RoRtService, &rois) == NOTOK)
error ("RoSetService: %s", RoErrString (rop -> rop_reason));
invoke (sd, INVOKE); /* invoke the operations, etc. */
invoke (sd, INTREQ); /* invoke the operations, etc. */
invoke (sd, INVERR); /* invoke the operations, etc. */
invoke (sd, INVURJ); /* invoke the operations, etc. */
invoke (sd, INVPRJ); /* invoke the operations, etc. */
/* All this appears to be neccessary because you need the turn to terminate
* nicely. But we don't have the turn, I presume the responder has kept it
* from when they replyed to our request
*/
if (RtPTurnRequest(sd, 0, &rtis) == NOTOK) {
fprintf(stderr, "SEND_PLS:RT-PLEASE-TURN.REQUEST: %s\n",
RtErrString (rtis.rti_abort.rta_reason));
exit(6);
}
if (RtWaitRequest(sd, TIMEOUT, &rtis) == NOTOK) {
fprintf(stderr, "RtWaitRequest: %s\n",
RtErrString (rtis.rti_abort.rta_reason));
exit(1);
}
switch (rtis.rti_type) {
case RTI_TURN:
/* Okay we got it */
break;
default:
fprintf(stderr, "unexpected response %d\n", rtis.rti_type);
exit(6);
}
/* Now we can close */
fprintf (stderr, "RT-CLOSE.REQUEST:\n");
if (RtCloseRequest (sd, ACF_NORMAL, NULLPE, acr, &rtis) == NOTOK)
fprintf (stderr, "RT-CLOSE.REQUEST: %s\n",
RtErrString (rtis.rti_abort.rta_reason));
exit (0);
}
/*
* Test example
*/
invoke(sd, type)
int sd;
int type; /* of invocation */
{
int invoke;
struct RoSAPindication rind;
int res;
invoke = 1;
switch (type) {
case INVOKE:
res = RoInvokeRequest(sd, APDU_OP1, ROS_SYNC, NULLPE, invoke, NULLIP,
ROS_NOPRIO, &rind);
break;
case INTREQ:
res = RoIntrRequest(sd, APDU_OP1, NULLPE, invoke, NULLIP, ROS_NOPRIO,
&rind);
break;
case INVERR:
res = RoInvokeRequest(sd, APDU_ERR, ROS_SYNC, NULLPE, invoke, NULLIP,
ROS_NOPRIO, &rind);
break;
case INVURJ:
res = RoInvokeRequest(sd, APDU_URJ, ROS_SYNC, NULLPE, invoke, NULLIP,
ROS_NOPRIO, &rind);
break;
case INVPRJ:
res = RoInvokeRequest(sd, APDU_PRJ, ROS_SYNC, NULLPE, invoke, NULLIP,
ROS_NOPRIO, &rind);
break;
default:
fprintf(stderr, "invoke called with illegal type %d\n", type);
exit(1);
}
switch (res) {
case NOTOK:
if (rind.roi_type == ROI_PREJECT)
error("RO-INVOKE.REQUEST: %s\n",
RoErrString(rind.roi_preject.rop_reason));
else
error("RO-INVOKE.REQUEST:failed: unexpected returned type %d\n",
rind.roi_type);
exit(1);
case OK:
break;
default:
error("RO-INVOKE.REQUEST:failed(%d): unexpected returned type %d\n",
res, rind.roi_type);
exit(2);
}
switch (rind.roi_type) {
case ROI_RESULT:
if (rind.roi_result.ror_id == invoke)
printf("Result received\n");
else
printf("Result for wrong request %d\n", rind.roi_result.ror_id);
break;
case ROI_ERROR:
if (rind.roi_error.roe_id == invoke)
printf("Error received\n");
else
printf("Error for wrong request %d\n", rind.roi_error.roe_id);
break;
case ROI_UREJECT:
if (rind.roi_ureject.rou_id == invoke)
printf("User Reject received reason %d\n",
rind.roi_ureject.rou_reason);
else
printf("User Reject for wrong request %d\n",
rind.roi_ureject.rou_id);
break;
case ROI_PREJECT:
if (rind.roi_preject.rop_id == invoke)
printf("Provider Reject received %s\n",
RoErrString(rind.roi_preject.rop_reason));
else
printf("Provider Reject for wrong request %d\n",
rind.roi_preject.rop_id);
break;
default:
printf("Unexpected reply received %d\n", rind.roi_type);
break;
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.