|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <ctype.h> ! 3: #include "generic.h" /* defines OPERATIONS and ERRORS */ ! 4: #include <isode/rtsap.h> ! 5: #include <isode/rosap.h> ! 6: #include <isode/isoservent.h> ! 7: ! 8: #define error printf ! 9: ! 10: /* e.g., "directory" */ ! 11: static char *myservice = "ROSRTBTEST"; ! 12: ! 13: /* e.g., "directory services" */ ! 14: static char *mycontext = "isode chic read"; ! 15: static char *mypci = "isode chic read pci"; ! 16: ! 17: ! 18: #define INVOKE 1 /* do a RoInvokeRequest */ ! 19: #define INTREQ 2 /* do a RoIntrRequest */ ! 20: #define INVERR 3 /* request an error */ ! 21: #define INVURJ 4 /* request a user reject */ ! 22: #define INVPRJ 5 /* request a provider reject */ ! 23: ! 24: #define TIMEOUT 30 /* seconds before RtWait times out */ ! 25: ! 26: extern struct isoservent *getisoserventbyname(); ! 27: extern PE mkpelist(); ! 28: ! 29: main (argc, argv, envp) ! 30: int argc; ! 31: char **argv, ! 32: **envp; ! 33: { ! 34: int sd; ! 35: #if 0 ! 36: struct SSAPref sfs; ! 37: register struct SSAPref *sf; ! 38: register struct PSAPaddr *pa; ! 39: struct AcSAPconnect accs; ! 40: register struct AcSAPconnect *acc = &accs; ! 41: struct AcSAPrelease acrs; ! 42: register struct AcSAPrelease *acr = &acrs; ! 43: struct AcSAPindication acis; ! 44: register struct AcSAPindication *aci = &acis; ! 45: register struct AcSAPabort *aca = &aci -> aci_abort; ! 46: register AEI aei; ! 47: register OID ctx, pci; ! 48: struct PSAPctxlist pcs; ! 49: register struct PSAPctxlist *pc = &pcs; ! 50: #endif ! 51: struct RtSAPaddr rtas; ! 52: struct isoservent *is; ! 53: struct SSAPaddr *psa; ! 54: struct RtSAPindication rtis; ! 55: register struct RtSAPindication *rti = &rtis; ! 56: struct RtSAPconnect rtcs; ! 57: register struct RtSAPconnect *rtc = &rtcs; ! 58: register struct RtSAPabort *rta = &rti -> rti_abort; ! 59: struct RoSAPindication rois; ! 60: register struct RoSAPpreject *rop = &rois.roi_preject; ! 61: ! 62: if ((is = getisoserventbyname(myservice, "rtsap")) == NULL) { ! 63: fprintf(stderr, "can't find %s/rosap", myservice); ! 64: exit(1); ! 65: } ! 66: rtas.rta_port = is->is_port; ! 67: if (argc < 2) { ! 68: fprintf(stderr, "Need an arguement of a hostname\n"); ! 69: exit(1); ! 70: } ! 71: /* This is an different to the manual which is wrong! ! 72: */ ! 73: if ((is = getisoserventbyname("rts", "ssap")) == NULL) { ! 74: fprintf(stderr, "can't find ssap/rts"); ! 75: exit(1); ! 76: } ! 77: if ((psa = is2saddr(argv[1], NULLCP, (struct isoservent *) is)) == NULLSA) { fprintf(stderr, "Can't compute address to %s\n", argv[1]); ! 78: exit(2); ! 79: } ! 80: ! 81: rtas.rta_addr = *psa; /* struct copy */ ! 82: ! 83: fprintf(stderr, "RT-OPEN.REQUEST:\n"); ! 84: if (RtBeginRequest (&rtas, RTS_TWA, RTS_INITIATOR, NULLPE, rtc, rti) ! 85: == NOTOK) ! 86: fprintf(stderr, "RT-OPEN.REQUEST: %s", RtErrString (rta -> rta_reason)); ! 87: ! 88: if (rtc -> rtc_result != RTS_ACCEPT) ! 89: fprintf(stderr, "association rejected: %s", ! 90: RtErrString (rta->rta_reason)); ! 91: ! 92: sd = rtc -> rtc_sd; ! 93: RTCFREE (rtc); ! 94: ! 95: if (RoSetService (sd, RoRtService, &rois) == NOTOK) ! 96: error ("RoSetService: %s", RoErrString (rop -> rop_reason)); ! 97: ! 98: invoke (sd, INVOKE); /* invoke the operations, etc. */ ! 99: ! 100: invoke (sd, INTREQ); /* invoke the operations, etc. */ ! 101: ! 102: invoke (sd, INVERR); /* invoke the operations, etc. */ ! 103: ! 104: invoke (sd, INVURJ); /* invoke the operations, etc. */ ! 105: ! 106: invoke (sd, INVPRJ); /* invoke the operations, etc. */ ! 107: ! 108: /* All this appears to be neccessary because you need the turn to terminate ! 109: * nicely. But we don't have the turn, I presume the responder has kept it ! 110: * from when they replyed to our request ! 111: */ ! 112: ! 113: if (RtPTurnRequest(sd, 0, &rtis) == NOTOK) { ! 114: fprintf(stderr, "SEND_PLS:RT-PLEASE-TURN.REQUEST: %s\n", ! 115: RtErrString (rtis.rti_abort.rta_reason)); ! 116: exit(6); ! 117: } ! 118: if (RtWaitRequest(sd, TIMEOUT, &rtis) == NOTOK) { ! 119: fprintf(stderr, "RtWaitRequest: %s\n", ! 120: RtErrString (rtis.rti_abort.rta_reason)); ! 121: exit(1); ! 122: } ! 123: switch (rtis.rti_type) { ! 124: case RTI_TURN: ! 125: /* Okay we got it */ ! 126: break; ! 127: ! 128: default: ! 129: fprintf(stderr, "unexpected response %d\n", rtis.rti_type); ! 130: exit(6); ! 131: } ! 132: ! 133: /* Now we can close */ ! 134: fprintf (stderr, "RT-CLOSE.REQUEST:\n"); ! 135: if (RtEndRequest (sd, &rtis) == NOTOK) ! 136: fprintf (stderr, "RT-CLOSE.REQUEST: %s\n", ! 137: RtErrString (rtis.rti_abort.rta_reason)); ! 138: ! 139: exit (0); ! 140: } ! 141: ! 142: /* ! 143: * Test example ! 144: */ ! 145: invoke(sd, type) ! 146: int sd; ! 147: int type; /* of invocation */ ! 148: { ! 149: int invoke; ! 150: struct RoSAPindication rind; ! 151: int res; ! 152: PE data; ! 153: ! 154: invoke = 1; ! 155: ! 156: data = mkpelist(2); ! 157: switch (type) { ! 158: case INVOKE: ! 159: res = RoInvokeRequest(sd, APDU_OP1, ROS_SYNC, data, invoke, NULLIP, ! 160: ROS_NOPRIO, &rind); ! 161: break; ! 162: ! 163: case INTREQ: ! 164: res = RoIntrRequest(sd, APDU_OP1, data, invoke, NULLIP, ROS_NOPRIO, ! 165: &rind); ! 166: break; ! 167: ! 168: case INVERR: ! 169: res = RoInvokeRequest(sd, APDU_ERR, ROS_SYNC, data, invoke, NULLIP, ! 170: ROS_NOPRIO, &rind); ! 171: break; ! 172: ! 173: case INVURJ: ! 174: res = RoInvokeRequest(sd, APDU_URJ, ROS_SYNC, data, invoke, NULLIP, ! 175: ROS_NOPRIO, &rind); ! 176: break; ! 177: ! 178: case INVPRJ: ! 179: res = RoInvokeRequest(sd, APDU_PRJ, ROS_SYNC, data, invoke, NULLIP, ! 180: ROS_NOPRIO, &rind); ! 181: break; ! 182: ! 183: default: ! 184: fprintf(stderr, "invoke called with illegal type %d\n", type); ! 185: exit(1); ! 186: ! 187: } ! 188: ! 189: switch (res) { ! 190: case NOTOK: ! 191: if (rind.roi_type == ROI_PREJECT) ! 192: error("RO-INVOKE.REQUEST: %s\n", ! 193: RoErrString(rind.roi_preject.rop_reason)); ! 194: else ! 195: error("RO-INVOKE.REQUEST:failed: unexpected returned type %d\n", ! 196: rind.roi_type); ! 197: exit(1); ! 198: ! 199: case OK: ! 200: break; ! 201: ! 202: default: ! 203: error("RO-INVOKE.REQUEST:failed(%d): unexpected returned type %d\n", ! 204: res, rind.roi_type); ! 205: exit(2); ! 206: ! 207: } ! 208: ! 209: switch (rind.roi_type) { ! 210: case ROI_RESULT: ! 211: if (rind.roi_result.ror_id == invoke) ! 212: printf("Result received\n"); ! 213: else ! 214: printf("Result for wrong request %d\n", rind.roi_result.ror_id); ! 215: break; ! 216: ! 217: case ROI_ERROR: ! 218: if (rind.roi_error.roe_id == invoke) ! 219: printf("Error received\n"); ! 220: else ! 221: printf("Error for wrong request %d\n", rind.roi_error.roe_id); ! 222: break; ! 223: ! 224: case ROI_UREJECT: ! 225: if (rind.roi_ureject.rou_id == invoke) ! 226: printf("User Reject received reason %d\n", ! 227: rind.roi_ureject.rou_reason); ! 228: else ! 229: printf("User Reject for wrong request %d\n", ! 230: rind.roi_ureject.rou_id); ! 231: break; ! 232: ! 233: case ROI_PREJECT: ! 234: if (rind.roi_preject.rop_id == invoke) ! 235: printf("Provider Reject received %s\n", ! 236: RoErrString(rind.roi_preject.rop_reason)); ! 237: else ! 238: printf("Provider Reject for wrong request %d\n", ! 239: rind.roi_preject.rop_id); ! 240: break; ! 241: ! 242: default: ! 243: printf("Unexpected reply received %d\n", rind.roi_type); ! 244: break; ! 245: } ! 246: pe_free(data); ! 247: ! 248: } ! 249: /* ! 250: * General routines useful for supporting the tests of rtsap library routines ! 251: */ ! 252: ! 253: #define PE_SIZE 3 /* size to build pe's for testing transfer */ ! 254: #define MKMASK 0x7 ! 255: #define MKSHIFT 6 ! 256: ! 257: extern PE mkpe(); ! 258: /* ! 259: * Generate a randomish list of PElement s for use as ANY or SET OF ANY .... ! 260: */ ! 261: PE ! 262: mkpelist(i) ! 263: int i; ! 264: { ! 265: PE pe, fpe = NULL; ! 266: ! 267: fpe = pe_alloc(PE_CLASS_PRIV, PE_FORM_CONS, i); ! 268: while (i > 0) { ! 269: pe = mkpe(i); ! 270: pe->pe_next = fpe->pe_cons; ! 271: fpe->pe_cons = pe; ! 272: i--; ! 273: } ! 274: return (fpe); ! 275: } ! 276: ! 277: /* ! 278: * generate a randomish PElement ! 279: */ ! 280: PE ! 281: mkpe(i) ! 282: { ! 283: int id, class; ! 284: PE pe; ! 285: ! 286: id = i * i + 1; ! 287: class = PE_CLASS_PRIV; ! 288: switch ((i*i >> MKSHIFT) & MKMASK) { ! 289: case 5: ! 290: case 0: ! 291: pe = flag2prim(i & 0x1, class, id); ! 292: break; ! 293: ! 294: case 6: ! 295: case 1: ! 296: pe = num2prim(i, class, id); ! 297: break; ! 298: ! 299: case 7: ! 300: case 2: ! 301: pe = str2prim("mkpelist:testdata", 17, class, id); ! 302: break; ! 303: ! 304: case 3: ! 305: pe = strb2bitstr("\021\0245\375\0124", 4, class, id); ! 306: break; ! 307: ! 308: case 4: ! 309: pe = mkpelist(i - 1); ! 310: break; ! 311: ! 312: default: ! 313: fprintf(stderr, "mkpe:internal error %d case not handled\n", ! 314: (i*i >> MKSHIFT) & MKMASK); ! 315: exit(2); ! 316: } ! 317: ! 318: return (pe); ! 319: } ! 320: /* ! 321: * Dump a bunch of hex digits printing out those that are printable ! 322: * Print out a given length of octets as hex (with the ASCII characters ! 323: * given if they have any ! 324: */ ! 325: fpclen(fp, s, len) ! 326: register FILE *fp; ! 327: register char *s; ! 328: register int len; ! 329: { ! 330: register int cnt = 0; ! 331: ! 332: while (len-- > 0) { ! 333: if (cnt % 8 == 0) ! 334: fprintf(fp, "\n%d:", cnt/8 + 1); ! 335: if (isprint(*s&0x7f)) ! 336: fprintf(fp, "\t%02x(%c)", *s&0xff, *s&0x7f); ! 337: else ! 338: fprintf(fp, "\t%02x", *s&0xff); ! 339: s++; ! 340: cnt++; ! 341: } ! 342: fputc('\n', fp); ! 343: } ! 344:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.