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