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