|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "generic.h" /* defines OPERATIONS and ERRORS */ ! 3: #include <isode/rosap.h> ! 4: ! 5: #define error printf ! 6: ! 7: /* e.g., "directory" */ ! 8: static char *myservice = "ROSPTEST"; ! 9: ! 10: /* e.g., "directory services" */ ! 11: static char *mycontext = "isode chic read"; ! 12: static char *mypci = "isode chic read pci"; ! 13: ! 14: ! 15: #define INVOKE 1 /* do a RoInvokeRequest */ ! 16: #define INTREQ 2 /* do a RoIntrRequest */ ! 17: #define INVERR 3 /* request an error */ ! 18: #define INVURJ 4 /* request a user reject */ ! 19: #define INVPRJ 5 /* request a provider reject */ ! 20: ! 21: main (argc, argv, envp) ! 22: int argc; ! 23: char **argv, ! 24: **envp; ! 25: { ! 26: int sd; ! 27: struct SSAPref sfs; ! 28: register struct SSAPref *sf; ! 29: register struct PSAPaddr *pa; ! 30: struct AcSAPconnect accs; ! 31: register struct AcSAPconnect *acc = &accs; ! 32: struct AcSAPrelease acrs; ! 33: register struct AcSAPrelease *acr = &acrs; ! 34: struct AcSAPindication acis; ! 35: register struct AcSAPindication *aci = &acis; ! 36: register struct AcSAPabort *aca = &aci -> aci_abort; ! 37: struct RoSAPindication rois; ! 38: register struct RoSAPpreject *rop = &rois.roi_preject; ! 39: register AEI aei; ! 40: register OID ctx, pci; ! 41: struct PSAPctxlist pcs; ! 42: register struct PSAPctxlist *pc = &pcs; ! 43: int servicetype = RoP; ! 44: ! 45: if ((aei = str2aei (argv[1], myservice)) == NULLAEI) ! 46: error ("%s-%s: unknown application-entity", argv[1], myservice); ! 47: if ((pa = aei2addr (aei)) == NULLPA) ! 48: error ("address translation failed"); ! 49: if ((ctx = ode2oid (mycontext)) == NULLOID) ! 50: error ("%s: unknown object descriptor", mycontext); ! 51: if ((ctx = oid_cpy (ctx)) == NULLOID) ! 52: error ("oid_cpy"); ! 53: if ((pci = ode2oid (mypci)) == NULLOID) ! 54: error ("%s: unknown object descriptor", mypci); ! 55: if ((pci = oid_cpy (pci)) == NULLOID) ! 56: error ("oid_cpy"); ! 57: pc -> pc_nctx = 1; ! 58: pc -> pc_ctx[0].pc_id = 1; ! 59: pc -> pc_ctx[0].pc_asn = pci; ! 60: pc -> pc_ctx[0].pc_atn = NULLOID; ! 61: ! 62: ! 63: if ((sf = addr2ref (PLocalHostName ())) == NULL) { ! 64: sf = &sfs; ! 65: (void) bzero ((char *) sf, sizeof *sf); ! 66: } ! 67: ! 68: if (AcAssocRequest (ctx, NULLAEI, NULLAEI, NULLPA, pa, pc, NULLOID, ! 69: 0, ROS_MYREQUIRE, SERIAL_NONE, 0, sf, NULLPEP, 0, NULLQOS, ! 70: acc, aci) ! 71: == NOTOK) ! 72: error ("A-ASSOCIATE.REQUEST: %s", AcErrString (aca -> aca_reason)); ! 73: ! 74: if (acc -> acc_result != ACS_ACCEPT) ! 75: error ("association rejected: %s", AcErrString (aca -> aca_reason)); ! 76: ! 77: sd = acc -> acc_sd; ! 78: ! 79: if (RoSetService (sd, RoPService, &rois) == NOTOK) ! 80: error ("RoSetService: %s", RoErrString (rop -> rop_reason)); ! 81: ! 82: invoke (sd, INVOKE); /* invoke the operations, etc. */ ! 83: ! 84: invoke (sd, INTREQ); /* invoke the operations, etc. */ ! 85: ! 86: invoke (sd, INVERR); /* invoke the operations, etc. */ ! 87: ! 88: invoke (sd, INVURJ); /* invoke the operations, etc. */ ! 89: ! 90: invoke (sd, INVPRJ); /* invoke the operations, etc. */ ! 91: ! 92: if (AcRelRequest (sd, ACF_NORMAL, NULLPEP, 0, NOTOK, acr, aci) == NOTOK) ! 93: error ("A-RELEASE.REQUEST: %s", AcErrString (aca -> aca_reason)); ! 94: ! 95: if (!acr -> acr_affirmative) { ! 96: (void) AcUAbortRequest (sd, NULLPEP, 0, aci); ! 97: error ("release rejected by peer: %d", acr -> acr_reason); ! 98: } ! 99: ! 100: ACRFREE (acr); ! 101: ! 102: exit (0); ! 103: } ! 104: ! 105: /* ! 106: * Test example ! 107: */ ! 108: invoke(sd, type) ! 109: int sd; ! 110: int type; /* of invocation */ ! 111: { ! 112: int invoke; ! 113: struct RoSAPindication rind; ! 114: int res; ! 115: ! 116: invoke = 1; ! 117: ! 118: switch (type) { ! 119: case INVOKE: ! 120: res = RoInvokeRequest(sd, APDU_OP1, ROS_SYNC, NULLPE, invoke, NULLIP, ! 121: ROS_NOPRIO, &rind); ! 122: break; ! 123: ! 124: case INTREQ: ! 125: res = RoIntrRequest(sd, APDU_OP1, NULLPE, invoke, NULLIP, ROS_NOPRIO, ! 126: &rind); ! 127: break; ! 128: ! 129: case INVERR: ! 130: res = RoInvokeRequest(sd, APDU_ERR, ROS_SYNC, NULLPE, invoke, NULLIP, ! 131: ROS_NOPRIO, &rind); ! 132: break; ! 133: ! 134: case INVURJ: ! 135: res = RoInvokeRequest(sd, APDU_URJ, ROS_SYNC, NULLPE, invoke, NULLIP, ! 136: ROS_NOPRIO, &rind); ! 137: break; ! 138: ! 139: case INVPRJ: ! 140: res = RoInvokeRequest(sd, APDU_PRJ, ROS_SYNC, NULLPE, invoke, NULLIP, ! 141: ROS_NOPRIO, &rind); ! 142: break; ! 143: ! 144: default: ! 145: fprintf(stderr, "invoke called with illegal type %d\n", type); ! 146: exit(1); ! 147: ! 148: } ! 149: ! 150: switch (res) { ! 151: case NOTOK: ! 152: if (rind.roi_type == ROI_PREJECT) ! 153: error("RO-INVOKE.REQUEST: %s\n", ! 154: RoErrString(rind.roi_preject.rop_reason)); ! 155: else ! 156: error("RO-INVOKE.REQUEST:failed: unexpected returned type %d\n", ! 157: rind.roi_type); ! 158: exit(1); ! 159: ! 160: case OK: ! 161: break; ! 162: ! 163: default: ! 164: error("RO-INVOKE.REQUEST:failed(%d): unexpected returned type %d\n", ! 165: res, rind.roi_type); ! 166: exit(2); ! 167: ! 168: } ! 169: ! 170: switch (rind.roi_type) { ! 171: case ROI_RESULT: ! 172: if (rind.roi_result.ror_id == invoke) ! 173: printf("Result received\n"); ! 174: else ! 175: printf("Result for wrong request %d\n", rind.roi_result.ror_id); ! 176: break; ! 177: ! 178: case ROI_ERROR: ! 179: if (rind.roi_error.roe_id == invoke) ! 180: printf("Error received\n"); ! 181: else ! 182: printf("Error for wrong request %d\n", rind.roi_error.roe_id); ! 183: break; ! 184: ! 185: case ROI_UREJECT: ! 186: if (rind.roi_ureject.rou_id == invoke) ! 187: printf("User Reject received reason %d\n", ! 188: rind.roi_ureject.rou_reason); ! 189: else ! 190: printf("User Reject for wrong request %d\n", ! 191: rind.roi_ureject.rou_id); ! 192: break; ! 193: ! 194: case ROI_PREJECT: ! 195: if (rind.roi_preject.rop_id == invoke) ! 196: printf("Provider Reject received %s\n", ! 197: RoErrString(rind.roi_preject.rop_reason)); ! 198: else ! 199: printf("Provider Reject for wrong request %d\n", ! 200: rind.roi_preject.rop_id); ! 201: break; ! 202: ! 203: default: ! 204: printf("Unexpected reply received %d\n", rind.roi_type); ! 205: break; ! 206: } ! 207: ! 208: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.