|
|
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.