|
|
1.1 root 1: /*
2: * this is the example use of rosap taken from the manual
3: */
4: #include <stdio.h>
5: #include "generic.h"
6: #include <isode/rtsap.h>
7: #include <isode/rosap.h>
8:
9: #define error fprintf
10:
11: int ros_indication();
12:
13: static FILE *dfp;
14: main(argc, argv, envp)
15: int argc;
16: char **argv, **envp;
17: {
18: int result, sd;
19: int res;
20:
21: struct RtSAPstart rtss;
22: register struct RtSAPstart *rts = &rtss;
23: struct RtSAPindication rtis;
24: register struct RtSAPindication *rti = &rtis;
25: register struct AcSAPstart *acs = &rts->rts_start;
26: register struct PSAPstart *ps = &acs->acs_start;
27: register struct RtSAPabort *rta = &rti -> rti_abort;
28: struct RoSAPindication rois;
29: register struct RoSAPindication *roi = &rois;
30: register struct RoSAPpreject *rop = &roi->roi_preject;
31:
32: dfp = freopen("/dev/console", "w", stdout);
33: fprintf(dfp, "Got to here\n");
34:
35: if (RtBInit(argc, argv, rts, rti) == NOTOK)
36: fprintf(dfp, "initialisation fails: %s",
37: RtErrString(rta->rta_reason));
38:
39: sd = rts->rts_sd;
40: RTSFREE(rts);
41:
42: /* would have read command line arguments here */
43:
44: if (RtBeginResponse(sd, RTS_ACCEPT, NULLPE, rti) == NOTOK)
45: fprintf(dfp, "RT-OPEN.RESPONSE: %s",
46: RtErrString(rti->rti_abort.rta_reason));
47:
48: if (RoSetService (sd, RoRtService, &rois) == NOTOK)
49: fprintf(dfp, "RoSetService: %s", RoErrString (rop -> rop_reason));
50:
51: #ifdef SHOW_BUG
52: if (RoSetIndications(sd, ros_indication, roi) == NOTOK)
53: fprintf(stderr, "RoSetIndications: %s", RoErrString(rop->rop_reason));
54:
55: for(;;)
56: pause();
57: #else
58: fprintf(dfp, "Got to here\n");
59: for (;;) {
60: switch (res = RoWaitRequest(sd, NOTOK, roi)) {
61: case NOTOK:
62: fprintf(dfp,"RoWaitRequest: %s\n", RoErrString(rop->rop_reason));
63: exit(1);
64:
65: case OK:
66: fprintf(dfp, "got a request %d\n", res);
67: ros_indication(sd, roi);
68: break;
69:
70: case DONE:
71: fprintf(dfp, "Done\n");
72: ros_indication(sd, roi);
73: exit(0); /* should never get to here */
74: }
75: }
76: #endif
77: }
78: /*
79: * Request/Reply loop of ROS server. Called when data arrives like a signal
80: * routine
81: */
82: static int
83: ros_indication(sd, roi)
84: int sd;
85: register struct RoSAPindication *roi;
86: {
87:
88: fprintf(dfp, "ros_indication got called\n");
89: switch (roi->roi_type) {
90: case ROI_INVOKE:
91: ros_invoke(sd, &roi->roi_invoke);
92: break;
93:
94: case ROI_RESULT:
95: ros_result(sd, &roi->roi_result);
96: break;
97:
98: case ROI_ERROR:
99: ros_error(sd, &roi->roi_error);
100: break;
101:
102:
103: case ROI_UREJECT:
104: ros_ureject(sd, &roi->roi_ureject);
105: break;
106:
107: case ROI_PREJECT:
108: ros_preject(sd, &roi->roi_preject);
109: break;
110:
111: case ROI_FINISH:
112: ros_finish(sd, &roi->roi_finish);
113: break;
114:
115: case ROI_END:
116: ros_end(sd, &roi->roi_end);
117: break;
118:
119: default:
120: fprintf(dfp, "unknown indication type=%d", roi->roi_type);
121: }
122: }
123:
124: extern int OP1();
125:
126:
127:
128: /* OPERATIONS are numbered APDU_OPx, where each is a unique integer. Further,
129: APDU_UNKNOWN is used as a tag different than any valid operation.
130:
131: ERRORS are numbered ERROR_xyz, where each is a unique integer.
132: ERROR_MISTYPED is used to signal an argument error to an operation.
133: Further, ERROR_UNKNOWN is used as a tag to indicate that the operation
134: succeeded.
135:
136: Finally, note that rox -> rox_args is updated in place by these routines.
137: If the routine returns ERROR_UNKNOWN, then rox_args contains the results
138: of the operation. If the routine returns ERROR_MISTYPED, then rox_args is
139: untouched. Otherwise, if the routine returns any other value, then
140: rox_args contains the parameters of the error which occurred. Obviously,
141: each routine calls ROXFREE prior to setting rox_args to a new value.
142: */
143:
144: static struct dispatch {
145: int ds_operation;
146: IFP ds_vector;
147: } dispatches[] = {
148: APDU_OP1, OP1,
149: APDU_ERR, OP1,
150: APDU_URJ, OP1,
151:
152: /* APDU_OPn, OPn, */
153:
154: APDU_UNKNOWN
155: };
156:
157:
158: static int ros_invoke (sd, rox)
159: int sd;
160: register struct RoSAPinvoke *rox;
161: {
162: int result;
163: register struct dispatch *ds;
164: struct RoSAPindication rois;
165: register struct RoSAPindication *roi = &rois;
166: register struct RoSAPpreject *rop = &roi -> roi_preject;
167:
168: for (ds = dispatches; ds -> ds_operation != APDU_UNKNOWN; ds++)
169: if (ds -> ds_operation == rox -> rox_op)
170: break;
171:
172: if (ds -> ds_operation == APDU_UNKNOWN) {
173: if (RoURejectRequest (sd, &rox -> rox_id, ROS_IP_UNRECOG,
174: ROS_NOPRIO, roi) == NOTOK)
175: error (dfp, "RO-U-REJECT.REQUEST: %s", RoErrString (rop -> rop_reason));
176: goto out;
177: }
178:
179: if (rox -> rox_nolinked == 0) {
180: if (RoURejectRequest (sd, &rox -> rox_id, ROS_IP_LINKED,
181: ROS_NOPRIO, roi) == NOTOK)
182: error (dfp, "RO-U-REJECT.REQUEST: %s", RoErrString (rop -> rop_reason));
183: goto out;
184: }
185:
186: switch (result = (*ds -> ds_vector) (rox)) {
187: case ERROR_UNKNOWN:
188: if (RoResultRequest (sd, rox -> rox_id, rox -> rox_op,
189: rox -> rox_args, ROS_NOPRIO, roi) == NOTOK)
190: error (dfp, "RO-RESULT.REQUEST: %s",
191: RoErrString (rop -> rop_reason));
192: break;
193:
194: default:
195: if (RoErrorRequest (sd, rox -> rox_id, result, rox -> rox_args,
196: ROS_NOPRIO, roi) == NOTOK)
197: error (dfp, "RO-ERROR.REQUEST: %s",
198: RoErrString (rop -> rop_reason));
199: break;
200:
201: case ERROR_MISTYPED:
202: if (RoURejectRequest (sd, &rox -> rox_id, ROS_IP_MISTYPED,
203: ROS_NOPRIO, roi) == NOTOK)
204: error (dfp, "RO-U-REJECT.REQUEST: %s",
205: RoErrString (rop -> rop_reason));
206: break;
207: }
208:
209: out: ;
210: ROXFREE (rox);
211: }
212:
213:
214: static int ros_result (sd, ror)
215: int sd;
216: register struct RoSAPresult *ror;
217: {
218: struct RoSAPindication rois;
219: register struct RoSAPindication *roi = &rois;
220: register struct RoSAPpreject *rop = &roi -> roi_preject;
221:
222: if (RoURejectRequest (sd, &ror -> ror_id, ROS_RRP_UNRECOG, ROS_NOPRIO, roi)
223: == NOTOK)
224: error (dfp, "RO-U-REJECT.REQUEST: %s", RoErrString (rop -> rop_reason));
225:
226: RORFREE (ror);
227: }
228:
229:
230: static int ros_error (sd, roe)
231: int sd;
232: register struct RoSAPerror *roe;
233: {
234: struct RoSAPindication rois;
235: register struct RoSAPindication *roi = &rois;
236: register struct RoSAPpreject *rop = &roi -> roi_preject;
237:
238: if (RoURejectRequest (sd, &roe -> roe_id, ROS_REP_UNRECOG, ROS_NOPRIO, roi)
239: == NOTOK)
240: error (dfp, "RO-U-REJECT.REQUEST: %s", RoErrString (rop -> rop_reason));
241:
242: ROEFREE (roe);
243: }
244:
245:
246: static int ros_ureject (sd, rou)
247: int sd;
248: register struct RoSAPureject *rou;
249: {
250: /* handle rejection here... */
251: }
252:
253:
254: static int ros_preject (sd, rop)
255: int sd;
256: register struct RoSAPpreject *rop;
257: {
258: if (ROS_FATAL (rop -> rop_reason))
259: error (dfp, "RO-REJECT-P.INDICATION: %s", RoErrString (rop -> rop_reason));
260:
261: /* handle temporary failure here... */
262: }
263:
264: static int ros_finish (sd, acf)
265: int sd;
266: struct AcSAPfinish *acf;
267: {
268: struct AcSAPindication acis;
269: register struct AcSAPabort *aca = &acis.aci_abort;
270: struct RtSAPindication rtis;
271:
272: ACFFREE (acf);
273: if (RtCloseResponse(sd, ACR_NORMAL, NULLPE, &rtis) == NOTOK) {
274: fprintf(dfp, "RtWaitRequest:RT-CLOSE.RESPONSE: %s\n",
275: RtErrString (rtis.rti_abort.rta_reason));
276: exit(9);
277: }
278:
279:
280: error (dfp, "association released");
281:
282: exit(0);
283: }
284:
285: static int
286: ros_end(sd, roe)
287: int sd;
288: struct RoSAPend *roe;
289: {
290: struct RtSAPindication rtis;
291:
292: if (RtEndResponse(sd, &rtis) == NOTOK) {
293: fprintf(dfp, "RT-END.RESPONSE: failed: %s\n",
294: RtErrString(rtis.rti_abort.rta_reason));
295: exit(6);
296: }
297:
298: exit(0);
299: }
300: OP1(rox)
301: register struct RoSAPinvoke *rox;
302: {
303: fprintf(dfp, "Invocation\nid %d", rox->rox_id);
304: if (!rox->rox_nolinked)
305: fprintf(dfp, " linked to %d", rox->rox_linkid);
306: fprintf(dfp, " operation %d\n", rox->rox_op);
307: /* print the pe */
308:
309: switch (rox->rox_op) {
310: case APDU_OP1:
311: return (ERROR_UNKNOWN);
312:
313: case APDU_ERR:
314: return (ERROR_ERROR);
315:
316: case APDU_URJ:
317: return (ERROR_MISTYPED);
318:
319: default:
320: fprintf(dfp, "\nunknown operation %d\n", rox->rox_op);
321: }
322: return (ERROR_ERROR);
323: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.