|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <ctype.h> ! 3: #include <isode/rosap.h> ! 4: #include <isode/isoservent.h> ! 5: #include "generic.h" /* defines OPERATIONS and ERRORS */ ! 6: ! 7: /* e.g., "directory" */ ! 8: static char *myservice = "ROSSTEST"; ! 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: static requirements = SR_NEGOTIATED|SR_HALFDUPLEX; ! 22: extern struct isoservent *getisoserventbyname(); ! 23: extern struct SSAPaddr *is2saddr(); ! 24: ! 25: extern PE mkpelist(); ! 26: ! 27: main (argc, argv, envp) ! 28: int argc; ! 29: char **argv, ! 30: **envp; ! 31: { ! 32: int sd; ! 33: struct isoservent *is; ! 34: struct RoSAPindication rois; ! 35: register struct RoSAPpreject *rop = &rois.roi_preject; ! 36: struct SSAPaddr *psa; ! 37: ! 38: struct RoSAPaddr roas; ! 39: struct RoSAPconnect rocs; ! 40: ! 41: if ((is = getisoserventbyname(myservice, "rosap")) == NULL) { ! 42: fprintf(stderr, "can't find %s/rosap", myservice); ! 43: exit(1); ! 44: } ! 45: roas.roa_port = is->is_port; ! 46: if (argc < 2) { ! 47: fprintf(stderr, "Need an arguement of a hostname\n"); ! 48: exit(1); ! 49: } ! 50: /* This is an undescribed strangeness. why look something up if you ! 51: * never use it ??? Do the people who write ISODE documentation never ! 52: * expect anyone to try and read it ? ! 53: */ ! 54: if ((is = getisoserventbyname("ros", "ssap")) == NULL) { ! 55: fprintf(stderr, "can't find ssap/ros"); ! 56: exit(1); ! 57: } ! 58: if ((psa = is2saddr(argv[1], NULLCP, (struct isoservent *) is)) == NULLSA) { ! 59: fprintf(stderr, "Can't compute address to %s\n", argv[1]); ! 60: exit(2); ! 61: } ! 62: ! 63: roas.roa_addr = *psa; /* struct copy */ ! 64: ! 65: if (RoBeginRequest(&roas, NULLPE, &rocs, &rois) == NOTOK) { ! 66: fprintf(stderr, "RoBeginRequest:failed:%s\n", ! 67: RoErrString (rop -> rop_reason)); ! 68: exit(1); ! 69: } ! 70: if (rocs.roc_result != ROS_ACCEPT) { ! 71: fprintf(stderr, "Association has been rejected %s\n", ! 72: RoErrString(rocs.roc_result)); ! 73: exit(2); ! 74: } ! 75: sd = rocs.roc_sd; ! 76: ! 77: printf("RoBeginRequest succeeded\n"); ! 78: ! 79: ROCFREE(&rocs); ! 80: ! 81: if (RoSetService (sd, RoSService, &rois) == NOTOK) ! 82: fprintf(stderr, "RoSetService: %s", RoErrString (rop -> rop_reason)); ! 83: ! 84: printf("RoSetService succeeded\n"); ! 85: ! 86: invoke (sd, INVOKE); /* invoke the operations, etc. */ ! 87: ! 88: invoke (sd, INTREQ); /* invoke the operations, etc. */ ! 89: ! 90: invoke (sd, INVERR); /* invoke the operations, etc. */ ! 91: ! 92: invoke (sd, INVURJ); /* invoke the operations, etc. */ ! 93: ! 94: invoke (sd, INVPRJ); /* invoke the operations, etc. */ ! 95: ! 96: if (RoEndRequest(sd, 0, &rois) == NOTOK) { ! 97: fprintf(stderr, "RoEndRequest: %s", RoErrString (rop -> rop_reason)); ! 98: exit(3); ! 99: } ! 100: ! 101: exit (0); ! 102: } ! 103: ! 104: /* ! 105: * Test example ! 106: */ ! 107: invoke(sd, type) ! 108: int sd; ! 109: int type; /* of invocation */ ! 110: { ! 111: int invoke; ! 112: struct RoSAPindication rind; ! 113: int res; ! 114: PE data; ! 115: ! 116: invoke = 1; ! 117: ! 118: printf("invoke %d\n",type); ! 119: data = mkpelist(1); ! 120: /* ROS over Session needs a non null args */ ! 121: switch (type) { ! 122: case INVOKE: ! 123: res = RoInvokeRequest(sd, APDU_OP1, ROS_SYNC, data, invoke, NULLIP, ! 124: ROS_NOPRIO, &rind); ! 125: break; ! 126: ! 127: case INTREQ: ! 128: res = RoIntrRequest(sd, APDU_OP1, data, invoke, NULLIP, ROS_NOPRIO, ! 129: &rind); ! 130: break; ! 131: ! 132: case INVERR: ! 133: res = RoInvokeRequest(sd, APDU_ERR, ROS_SYNC, data, invoke, NULLIP, ! 134: ROS_NOPRIO, &rind); ! 135: break; ! 136: ! 137: case INVURJ: ! 138: res = RoInvokeRequest(sd, APDU_URJ, ROS_SYNC, data, invoke, NULLIP, ! 139: ROS_NOPRIO, &rind); ! 140: break; ! 141: ! 142: case INVPRJ: ! 143: res = RoInvokeRequest(sd, APDU_PRJ, ROS_SYNC, data, invoke, NULLIP, ! 144: ROS_NOPRIO, &rind); ! 145: break; ! 146: ! 147: default: ! 148: fprintf(stderr, "invoke called with illegal type %d\n", type); ! 149: exit(1); ! 150: ! 151: } ! 152: ! 153: switch (res) { ! 154: case NOTOK: ! 155: if (rind.roi_type == ROI_PREJECT) ! 156: fprintf(stderr, "RO-INVOKE.REQUEST: %s\n", ! 157: RoErrString(rind.roi_preject.rop_reason)); ! 158: else ! 159: fprintf(stderr, "RO-INVOKE.REQUEST:failed: unexpected returned type %d\n", ! 160: rind.roi_type); ! 161: exit(1); ! 162: ! 163: case OK: ! 164: break; ! 165: ! 166: default: ! 167: fprintf(stderr, "RO-INVOKE.REQUEST:failed(%d): unexpected returned type %d\n", ! 168: res, rind.roi_type); ! 169: exit(2); ! 170: ! 171: } ! 172: ! 173: switch (rind.roi_type) { ! 174: case ROI_RESULT: ! 175: if (rind.roi_result.ror_id == invoke) ! 176: printf("Result received\n"); ! 177: else ! 178: printf("Result for wrong request %d\n", rind.roi_result.ror_id); ! 179: break; ! 180: ! 181: case ROI_ERROR: ! 182: if (rind.roi_error.roe_id == invoke) ! 183: printf("Error received\n"); ! 184: else ! 185: printf("Error for wrong request %d\n", rind.roi_error.roe_id); ! 186: break; ! 187: ! 188: case ROI_UREJECT: ! 189: if (rind.roi_ureject.rou_id == invoke) ! 190: printf("User Reject received reason %d\n", ! 191: rind.roi_ureject.rou_reason); ! 192: else ! 193: printf("User Reject for wrong request %d\n", ! 194: rind.roi_ureject.rou_id); ! 195: break; ! 196: ! 197: case ROI_PREJECT: ! 198: if (rind.roi_preject.rop_id == invoke) ! 199: printf("Provider Reject received %s\n", ! 200: RoErrString(rind.roi_preject.rop_reason)); ! 201: else ! 202: printf("Provider Reject for wrong request %d\n", ! 203: rind.roi_preject.rop_id); ! 204: break; ! 205: ! 206: default: ! 207: printf("Unexpected reply received %d\n", rind.roi_type); ! 208: break; ! 209: } ! 210: ! 211: } ! 212: /* ! 213: * General routines useful for supporting the tests of rtsap library routines ! 214: */ ! 215: ! 216: #define PE_SIZE 3 /* size to build pe's for testing transfer */ ! 217: #define MKMASK 0x7 ! 218: #define MKSHIFT 6 ! 219: ! 220: extern PE mkpe(); ! 221: /* ! 222: * Generate a randomish list of PElement s for use as ANY or SET OF ANY .... ! 223: */ ! 224: PE ! 225: mkpelist(i) ! 226: int i; ! 227: { ! 228: PE pe, fpe = NULL; ! 229: ! 230: fpe = pe_alloc(PE_CLASS_PRIV, PE_FORM_CONS, i); ! 231: while (i > 0) { ! 232: pe = mkpe(i); ! 233: pe->pe_next = fpe->pe_cons; ! 234: fpe->pe_cons = pe; ! 235: i--; ! 236: } ! 237: return (fpe); ! 238: } ! 239: ! 240: /* ! 241: * generate a randomish PElement ! 242: */ ! 243: PE ! 244: mkpe(i) ! 245: { ! 246: int id, class; ! 247: PE pe; ! 248: ! 249: id = i * i + 1; ! 250: class = PE_CLASS_PRIV; ! 251: switch ((i*i >> MKSHIFT) & MKMASK) { ! 252: case 5: ! 253: case 0: ! 254: pe = flag2prim(i & 0x1, class, id); ! 255: break; ! 256: ! 257: case 6: ! 258: case 1: ! 259: pe = num2prim(i, class, id); ! 260: break; ! 261: ! 262: case 7: ! 263: case 2: ! 264: pe = str2prim("mkpelist:testdata", 17, class, id); ! 265: break; ! 266: ! 267: case 3: ! 268: pe = strb2bitstr("\021\0245\375\0124", 4, class, id); ! 269: break; ! 270: ! 271: case 4: ! 272: pe = mkpelist(i - 1); ! 273: break; ! 274: ! 275: default: ! 276: fprintf(stderr, "mkpe:internal error %d case not handled\n", ! 277: (i*i >> MKSHIFT) & MKMASK); ! 278: exit(2); ! 279: } ! 280: ! 281: return (pe); ! 282: } ! 283: /* ! 284: * Dump a bunch of hex digits printing out those that are printable ! 285: * Print out a given length of octets as hex (with the ASCII characters ! 286: * given if they have any ! 287: */ ! 288: fpclen(fp, s, len) ! 289: register FILE *fp; ! 290: register char *s; ! 291: register int len; ! 292: { ! 293: register int cnt = 0; ! 294: ! 295: while (len-- > 0) { ! 296: if (cnt % 8 == 0) ! 297: fprintf(fp, "\n%d:", cnt/8 + 1); ! 298: if (isprint(*s&0x7f)) ! 299: fprintf(fp, "\t%02x(%c)", *s&0xff, *s&0x7f); ! 300: else ! 301: fprintf(fp, "\t%02x", *s&0xff); ! 302: s++; ! 303: cnt++; ! 304: } ! 305: fputc('\n', fp); ! 306: } ! 307:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.