|
|
BSD 4.3reno
#include <stdio.h>
#include "generic.h" /* defines OPERATIONS and ERRORS */
#include <isode/rosap.h>
#define error printf
/* e.g., "directory" */
static char *myservice = "ROSPTEST";
/* 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 */
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;
int servicetype = RoP;
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);
}
if (AcAssocRequest (ctx, NULLAEI, NULLAEI, NULLPA, pa, pc, NULLOID,
0, ROS_MYREQUIRE, SERIAL_NONE, 0, sf, NULLPEP, 0, NULLQOS,
acc, aci)
== NOTOK)
error ("A-ASSOCIATE.REQUEST: %s", AcErrString (aca -> aca_reason));
if (acc -> acc_result != ACS_ACCEPT)
error ("association rejected: %s", AcErrString (aca -> aca_reason));
sd = acc -> acc_sd;
if (RoSetService (sd, RoPService, &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. */
if (AcRelRequest (sd, ACF_NORMAL, NULLPEP, 0, NOTOK, acr, aci) == NOTOK)
error ("A-RELEASE.REQUEST: %s", AcErrString (aca -> aca_reason));
if (!acr -> acr_affirmative) {
(void) AcUAbortRequest (sd, NULLPEP, 0, aci);
error ("release rejected by peer: %d", acr -> acr_reason);
}
ACRFREE (acr);
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.