|
|
1.1 root 1: #include <stdio.h>
2: #include "generic.h" /* defines OPERATIONS and ERRORS */
3: #include <isode/rtsap.h>
4: #include <isode/rosap.h>
5:
6: #define error printf
7:
8: /* e.g., "directory" */
9: static char *myservice = "ROSRTTEST";
10:
11: /* e.g., "directory services" */
12: static char *mycontext = "isode chic read";
13: static char *mypci = "isode chic read pci";
14:
15:
16: #define INVOKE 1 /* do a RoInvokeRequest */
17: #define INTREQ 2 /* do a RoIntrRequest */
18: #define INVERR 3 /* request an error */
19: #define INVURJ 4 /* request a user reject */
20: #define INVPRJ 5 /* request a provider reject */
21:
22: #define TIMEOUT 30 /* seconds before RtWait times out */
23:
24: main (argc, argv, envp)
25: int argc;
26: char **argv,
27: **envp;
28: {
29: int sd;
30: struct SSAPref sfs;
31: register struct SSAPref *sf;
32: register struct PSAPaddr *pa;
33: struct AcSAPconnect accs;
34: register struct AcSAPconnect *acc = &accs;
35: struct AcSAPrelease acrs;
36: register struct AcSAPrelease *acr = &acrs;
37: struct AcSAPindication acis;
38: register struct AcSAPindication *aci = &acis;
39: register struct AcSAPabort *aca = &aci -> aci_abort;
40: struct RoSAPindication rois;
41: register struct RoSAPpreject *rop = &rois.roi_preject;
42: register AEI aei;
43: register OID ctx, pci;
44: struct PSAPctxlist pcs;
45: register struct PSAPctxlist *pc = &pcs;
46: struct RtSAPindication rtis;
47: register struct RtSAPindication *rti = &rtis;
48: struct RtSAPconnect rtcs;
49: register struct RtSAPconnect *rtc = &rtcs;
50: register struct RtSAPabort *rta = &rti -> rti_abort;
51:
52:
53: if ((aei = str2aei (argv[1], myservice)) == NULLAEI)
54: error ("%s-%s: unknown application-entity", argv[1], myservice);
55: if ((pa = aei2addr (aei)) == NULLPA)
56: error ("address translation failed");
57: if ((ctx = ode2oid (mycontext)) == NULLOID)
58: error ("%s: unknown object descriptor", mycontext);
59: if ((ctx = oid_cpy (ctx)) == NULLOID)
60: error ("oid_cpy");
61: if ((pci = ode2oid (mypci)) == NULLOID)
62: error ("%s: unknown object descriptor", mypci);
63: if ((pci = oid_cpy (pci)) == NULLOID)
64: error ("oid_cpy");
65: pc -> pc_nctx = 1;
66: pc -> pc_ctx[0].pc_id = 1;
67: pc -> pc_ctx[0].pc_asn = pci;
68: pc -> pc_ctx[0].pc_atn = NULLOID;
69:
70:
71: if ((sf = addr2ref (PLocalHostName ())) == NULL) {
72: sf = &sfs;
73: (void) bzero ((char *) sf, sizeof *sf);
74: }
75:
76:
77: fprintf(stderr, "RT-OPEN.REQUEST:\n");
78: if (RtOpenRequest (RTS_TWA, RTS_INITIATOR, ctx, NULLAEI, NULLAEI,
79: NULLPA, pa, pc, NULLOID, 0, NULLQOS, rtc, rti)
80: == NOTOK)
81: fprintf(stderr, "RT-OPEN.REQUEST: %s", RtErrString (rta -> rta_reason));
82:
83: if (rtc -> rtc_result != RTS_ACCEPT)
84: fprintf(stderr, "association rejected: %s",
85: RtErrString (rta->rta_reason));
86:
87: sd = rtc -> rtc_sd;
88: RTCFREE (rtc);
89:
90: if (RoSetService (sd, RoRtService, &rois) == NOTOK)
91: error ("RoSetService: %s", RoErrString (rop -> rop_reason));
92:
93: invoke (sd, INVOKE); /* invoke the operations, etc. */
94:
95: invoke (sd, INTREQ); /* invoke the operations, etc. */
96:
97: invoke (sd, INVERR); /* invoke the operations, etc. */
98:
99: invoke (sd, INVURJ); /* invoke the operations, etc. */
100:
101: invoke (sd, INVPRJ); /* invoke the operations, etc. */
102:
103: /* All this appears to be neccessary because you need the turn to terminate
104: * nicely. But we don't have the turn, I presume the responder has kept it
105: * from when they replyed to our request
106: */
107:
108: if (RtPTurnRequest(sd, 0, &rtis) == NOTOK) {
109: fprintf(stderr, "SEND_PLS:RT-PLEASE-TURN.REQUEST: %s\n",
110: RtErrString (rtis.rti_abort.rta_reason));
111: exit(6);
112: }
113: if (RtWaitRequest(sd, TIMEOUT, &rtis) == NOTOK) {
114: fprintf(stderr, "RtWaitRequest: %s\n",
115: RtErrString (rtis.rti_abort.rta_reason));
116: exit(1);
117: }
118: switch (rtis.rti_type) {
119: case RTI_TURN:
120: /* Okay we got it */
121: break;
122:
123: default:
124: fprintf(stderr, "unexpected response %d\n", rtis.rti_type);
125: exit(6);
126: }
127:
128: /* Now we can close */
129: fprintf (stderr, "RT-CLOSE.REQUEST:\n");
130: if (RtCloseRequest (sd, ACF_NORMAL, NULLPE, acr, &rtis) == NOTOK)
131: fprintf (stderr, "RT-CLOSE.REQUEST: %s\n",
132: RtErrString (rtis.rti_abort.rta_reason));
133:
134: exit (0);
135: }
136:
137: /*
138: * Test example
139: */
140: invoke(sd, type)
141: int sd;
142: int type; /* of invocation */
143: {
144: int invoke;
145: struct RoSAPindication rind;
146: int res;
147:
148: invoke = 1;
149:
150: switch (type) {
151: case INVOKE:
152: res = RoInvokeRequest(sd, APDU_OP1, ROS_SYNC, NULLPE, invoke, NULLIP,
153: ROS_NOPRIO, &rind);
154: break;
155:
156: case INTREQ:
157: res = RoIntrRequest(sd, APDU_OP1, NULLPE, invoke, NULLIP, ROS_NOPRIO,
158: &rind);
159: break;
160:
161: case INVERR:
162: res = RoInvokeRequest(sd, APDU_ERR, ROS_SYNC, NULLPE, invoke, NULLIP,
163: ROS_NOPRIO, &rind);
164: break;
165:
166: case INVURJ:
167: res = RoInvokeRequest(sd, APDU_URJ, ROS_SYNC, NULLPE, invoke, NULLIP,
168: ROS_NOPRIO, &rind);
169: break;
170:
171: case INVPRJ:
172: res = RoInvokeRequest(sd, APDU_PRJ, ROS_SYNC, NULLPE, invoke, NULLIP,
173: ROS_NOPRIO, &rind);
174: break;
175:
176: default:
177: fprintf(stderr, "invoke called with illegal type %d\n", type);
178: exit(1);
179:
180: }
181:
182: switch (res) {
183: case NOTOK:
184: if (rind.roi_type == ROI_PREJECT)
185: error("RO-INVOKE.REQUEST: %s\n",
186: RoErrString(rind.roi_preject.rop_reason));
187: else
188: error("RO-INVOKE.REQUEST:failed: unexpected returned type %d\n",
189: rind.roi_type);
190: exit(1);
191:
192: case OK:
193: break;
194:
195: default:
196: error("RO-INVOKE.REQUEST:failed(%d): unexpected returned type %d\n",
197: res, rind.roi_type);
198: exit(2);
199:
200: }
201:
202: switch (rind.roi_type) {
203: case ROI_RESULT:
204: if (rind.roi_result.ror_id == invoke)
205: printf("Result received\n");
206: else
207: printf("Result for wrong request %d\n", rind.roi_result.ror_id);
208: break;
209:
210: case ROI_ERROR:
211: if (rind.roi_error.roe_id == invoke)
212: printf("Error received\n");
213: else
214: printf("Error for wrong request %d\n", rind.roi_error.roe_id);
215: break;
216:
217: case ROI_UREJECT:
218: if (rind.roi_ureject.rou_id == invoke)
219: printf("User Reject received reason %d\n",
220: rind.roi_ureject.rou_reason);
221: else
222: printf("User Reject for wrong request %d\n",
223: rind.roi_ureject.rou_id);
224: break;
225:
226: case ROI_PREJECT:
227: if (rind.roi_preject.rop_id == invoke)
228: printf("Provider Reject received %s\n",
229: RoErrString(rind.roi_preject.rop_reason));
230: else
231: printf("Provider Reject for wrong request %d\n",
232: rind.roi_preject.rop_id);
233: break;
234:
235: default:
236: printf("Unexpected reply received %d\n", rind.roi_type);
237: break;
238: }
239:
240: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.