|
|
1.1 root 1: /* dsapwait.c - DSAP: Deal with incoming activity */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/dsap/net/RCS/dsapwait.c,v 7.0 90/07/26 14:46:04 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/dsap/net/RCS/dsapwait.c,v 7.0 90/07/26 14:46:04 mrose Exp $
9: *
10: *
11: * $Log: dsapwait.c,v $
12: * Revision 7.0 90/07/26 14:46:04 mrose
13: * *** empty log message ***
14: *
15: */
16:
17: /*
18: * NOTICE
19: *
20: * Acquisition, use, and distribution of this module and related
21: * materials are subject to the restrictions of a license agreement.
22: * Consult the Preface in the User's Manual for the full terms of
23: * this agreement.
24: *
25: */
26:
27:
28: /* LINTLIBRARY */
29:
30: #include "logger.h"
31: #include "quipu/util.h"
32: #include "quipu/dsap.h"
33:
34:
35: extern LLog * log_dsap;
36:
37: #ifdef PDU_DUMP
38: #define DUMP_ARG "arg"
39: #define DUMP_RES "res"
40: #define DUMP_ERR "err"
41: #endif
42:
43: /* ARGSUSED */
44:
45: int DWaitRequest (ctx, sd, secs, di)
46: int ctx;
47: int sd;
48: int secs;
49: struct DSAPindication * di;
50: {
51: int result;
52:
53: switch (ctx)
54: {
55: case DS_CTX_X500_DAP:
56: result = DapRespWaitRequest (sd, secs, di);
57: break;
58:
59: case DS_CTX_X500_DSP:
60: result = DspWaitRequest (sd, secs, di);
61: break;
62:
63: case DS_CTX_QUIPU_DSP:
64: result = QspWaitRequest (sd, secs, di);
65: break;
66:
67: default:
68: LLOG (log_dsap, LLOG_EXCEPTIONS, ("DWaitRequest: unknown context id %d", ctx));
69: return (dsaplose (di, DA_APP_CONTEXT, "WAIT REQUEST"));
70: }
71:
72: return (result);
73: }
74:
75: int DapRespWaitRequest (sd, secs, di)
76: int sd;
77: int secs;
78: struct DSAPindication * di;
79: {
80: int result;
81: struct RoSAPindication roi_s;
82: struct RoSAPindication * roi = &(roi_s);
83:
84: DLOG (log_dsap,LLOG_TRACE,( "DapRespWaitRequest()"));
85:
86: result = RoWaitRequest(sd, secs, roi);
87:
88: if (result == NOTOK)
89: {
90: if (roi->roi_preject.rop_reason == ROS_TIMER)
91: {
92: return (DONE);
93: }
94:
95: if (ROS_FATAL (roi->roi_preject.rop_reason))
96: {
97: return (ros2dsaplose (di, "DapRespWaitRequest", &(roi->roi_preject)));
98: }
99: else
100: {
101: return (dsapreject (di, DP_ROS, -1, NULLCP, "DapRespWaitRequest: Non-fatal reject"));
102: }
103: }
104:
105: switch(roi->roi_type)
106: {
107: case ROI_INVOKE:
108: return (DapDecodeInvoke (sd, &(roi->roi_invoke), di));
109:
110: case ROI_RESULT:
111: LLOG (log_dsap, LLOG_EXCEPTIONS, ("DapRespWaitRequest: Result received"));
112: DRejectRequest (sd, ROS_RRP_UNRECOG, roi->roi_result.ror_id);
113: return (dsaplose (di, DI_RESULT, NULLCP, "DAP responder cannot accept results"));
114:
115: case ROI_ERROR:
116: LLOG (log_dsap, LLOG_EXCEPTIONS, ("DapRespWaitRequest: Error received"));
117: DRejectRequest (sd, ROS_REP_UNRECOG, roi->roi_error.roe_id);
118: return (dsaplose (di, DI_RESULT, NULLCP, "DAP responder cannot accept errors"));
119:
120: case ROI_UREJECT:
121: LLOG (log_dsap, LLOG_EXCEPTIONS, ("DapRespWaitRequest: Operation (%d) user rejected (%d)", roi->roi_ureject.rou_id, roi->roi_ureject.rou_reason));
122: return (ros2dsapreject(di, "ROI_UREJECT", &(roi->roi_ureject)));
123:
124: case ROI_PREJECT:
125: LLOG (log_dsap, LLOG_EXCEPTIONS, ("DapRespWaitRequest: Operation (%d) provider rejected", roi->roi_preject.rop_id));
126: return (ros2dsaplose (di, "ROI_PREJECT", &(roi->roi_preject)));
127:
128: case ROI_FINISH:
129: /*
130: * Should be getting an RoBIND structure here.
131: * Currently this is simulated with RoUnBindInit, which
132: * will check that the user data in the release was used
133: * correctly even though no UnbindArgument is present.
134: * This is mapped up into D-UNBIND indication.
135: */
136: return (DDecodeUnbind (sd, &(roi->roi_finish), di));
137:
138: default:
139: LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unknown indication type : %d", roi->roi_type));
140: return (dsaplose (di, DA_NO_REASON, NULLCP, NULLCP));
141: }
142: }
143:
144: int DspWaitRequest (sd, secs, di)
145: int sd;
146: int secs;
147: struct DSAPindication * di;
148: {
149: int result;
150: struct RoSAPindication roi_s;
151: struct RoSAPindication * roi = &(roi_s);
152:
153: DLOG (log_dsap,LLOG_TRACE,( "DspWaitRequest()"));
154:
155: result = RoWaitRequest(sd, secs, roi);
156:
157: if (result == NOTOK)
158: {
159: if (roi->roi_preject.rop_reason == ROS_TIMER)
160: {
161: return (DONE);
162: }
163:
164: if (ROS_FATAL (roi->roi_preject.rop_reason))
165: {
166: return (ros2dsaplose (di, "DspRespWaitRequest", &(roi->roi_preject)));
167: }
168: else
169: {
170: return (dsapreject (di, DP_ROS, -1, NULLCP, "DspRespWaitRequest: Non-fatal reject"));
171: }
172: }
173:
174: switch(roi->roi_type)
175: {
176: case ROI_INVOKE:
177: return (DspDecodeInvoke (sd, &(roi->roi_invoke), di));
178:
179: case ROI_RESULT:
180: return (DspDecodeResult (sd, &(roi->roi_result), di));
181:
182: case ROI_ERROR:
183: return (DDecodeError (sd, &(roi->roi_error), di));
184:
185: case ROI_UREJECT:
186: LLOG (log_dsap, LLOG_EXCEPTIONS, ("DspWaitRequest: Operation (%d) user rejected (%d)", roi->roi_ureject.rou_id, roi->roi_ureject.rou_reason));
187: return (ros2dsapreject(di, "ROI_UREJECT", &(roi->roi_ureject)));
188:
189: case ROI_PREJECT:
190: LLOG (log_dsap, LLOG_EXCEPTIONS, ("DspWaitRequest: Operation (%d) provider rejected", roi->roi_preject.rop_id));
191: return (ros2dsaplose (di, "ROI_PREJECT", &(roi->roi_preject)));
192:
193: case ROI_FINISH:
194: /*
195: * Should be getting an RoBIND structure here.
196: * Currently this is simulated with RoUnBindInit, which
197: * will check that the user data in the release was used
198: * correctly even though no UnbindArgument is present.
199: * This is mapped up into D-UNBIND indication.
200: */
201: return (DDecodeUnbind (sd, &(roi->roi_finish), di));
202:
203: default:
204: LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unknown indication type : %d", roi->roi_type));
205: return (dsaplose (di, DA_NO_REASON, NULLCP, NULLCP));
206: }
207: }
208:
209: int QspWaitRequest (sd, secs, di)
210: int sd;
211: int secs;
212: struct DSAPindication * di;
213: {
214: int result;
215: struct RoSAPindication roi_s;
216: struct RoSAPindication * roi = &(roi_s);
217:
218: DLOG (log_dsap,LLOG_TRACE,( "QspWaitRequest()"));
219:
220: result = RoWaitRequest(sd, secs, roi);
221:
222: if (result == NOTOK)
223: {
224: if (roi->roi_preject.rop_reason == ROS_TIMER)
225: {
226: return (DONE);
227: }
228:
229: if (ROS_FATAL (roi->roi_preject.rop_reason))
230: {
231: return (ros2dsaplose (di, "QspRespWaitRequest", &(roi->roi_preject)));
232: }
233: else
234: {
235: return (dsapreject (di, DP_ROS, -1, NULLCP, "QspRespWaitRequest: Non-fatal reject"));
236: }
237: }
238:
239: switch(roi->roi_type)
240: {
241: case ROI_INVOKE:
242: return (QspDecodeInvoke (sd, &(roi->roi_invoke), di));
243:
244: case ROI_RESULT:
245: return (QspDecodeResult (sd, &(roi->roi_result), di));
246:
247: case ROI_ERROR:
248: return (DDecodeError (sd, &(roi->roi_error), di));
249:
250: case ROI_UREJECT:
251: LLOG (log_dsap, LLOG_EXCEPTIONS, ("QspWaitRequest: Operation (%d) user rejected (%d)", roi->roi_ureject.rou_id, roi->roi_ureject.rou_reason));
252: return (ros2dsapreject(di, "ROI_UREJECT", &(roi->roi_ureject)));
253:
254: case ROI_PREJECT:
255: LLOG (log_dsap, LLOG_EXCEPTIONS, ("QspWaitRequest: Operation (%d) provider rejected", roi->roi_preject.rop_id));
256: return (ros2dsaplose (di, "ROI_PREJECT", &(roi->roi_preject)));
257:
258: case ROI_FINISH:
259: /*
260: * Should be getting an RoBIND structure here.
261: * Currently this is simulated with RoUnBindInit, which
262: * will check that the user data in the release was used
263: * correctly even though no UnbindArgument is present.
264: * This is mapped up into D-UNBIND indication.
265: */
266: return (DDecodeUnbind (sd, &(roi->roi_finish), di));
267:
268: default:
269: LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unknown indication type : %d", roi->roi_type));
270: return (dsaplose (di, DA_NO_REASON, NULLCP, NULLCP));
271: }
272: }
273:
274: int DapDecodeInvoke (sd, rox, di)
275: int sd;
276: struct RoSAPinvoke * rox;
277: struct DSAPindication * di;
278: {
279: int success;
280: PE pe = rox->rox_args;
281: struct ds_op_arg * dsarg = &(di->di_invoke.dx_arg);
282: struct chain_arg * charg = &(dsarg->dca_charg);
283: struct DSArgument * arg = &(dsarg->dca_dsarg);
284:
285: di->di_type = DI_INVOKE;
286: di->di_invoke.dx_id = rox->rox_id;
287:
288: switch(arg->arg_type = rox->rox_op)
289: {
290: case OP_READ :
291: success = decode_DAS_ReadArgument(pe,1,NULLIP,NULLVP,&(arg->arg_rd));
292: break;
293: case OP_COMPARE :
294: success = decode_DAS_CompareArgument(pe,1,NULLIP,NULLVP,&(arg->arg_cm));
295: break;
296: case OP_ABANDON :
297: success = decode_DAS_AbandonArgument(pe,1,NULLIP,NULLVP,&(arg->arg_ab));
298: break;
299: case OP_LIST :
300: success = decode_DAS_ListArgument(pe,1,NULLIP,NULLVP,&(arg->arg_ls));
301: break;
302: case OP_SEARCH :
303: success = decode_DAS_SearchArgument(pe,1,NULLIP,NULLVP,&(arg->arg_sr));
304: break;
305: case OP_ADDENTRY :
306: success = decode_DAS_AddEntryArgument(pe,1,NULLIP,NULLVP,&(arg->arg_ad));
307: break;
308: case OP_REMOVEENTRY :
309: success = decode_DAS_RemoveEntryArgument(pe,1,NULLIP,NULLVP,&(arg->arg_rm));
310: break;
311: case OP_MODIFYENTRY :
312: success = decode_DAS_ModifyEntryArgument(pe,1,NULLIP,NULLVP,&(arg->arg_me));
313: break;
314: case OP_MODIFYRDN :
315: success = decode_DAS_ModifyRDNArgument(pe,1,NULLIP,NULLVP,&(arg->arg_mr));
316: break;
317:
318: default:
319: LLOG(log_dsap, LLOG_EXCEPTIONS, ("DapDecodeInvoke: op id %d unknown!", rox->rox_op));
320: DRejectRequest (sd, ROS_IP_UNRECOG, rox->rox_id);
321: return (dsaplose (di, DP_INVOKE, NULLCP, "Unknown operation identifier"));
322: }
323:
324: if (success == NOTOK)
325: {
326: LLOG (log_dsap, LLOG_EXCEPTIONS, ("DapDecodeInvoke: Unable to parse argument"));
327: DRejectRequest (sd, ROS_IP_MISTYPED, rox->rox_id);
328: return (dsapreject (di, DP_INVOKE, -1, NULLCP, "Undecodable argument"));
329: }
330:
331: charg->cha_originator = NULLDN;
332: charg->cha_target = NULLDN;
333: charg->cha_domaininfo = NULLPE;
334: charg->cha_trace = NULLTRACEINFO;
335: charg->cha_timelimit = NULLCP;
336:
337: return(success);
338: }
339:
340: int DspDecodeInvoke (sd, rox, di)
341: int sd;
342: struct RoSAPinvoke * rox;
343: struct DSAPindication * di;
344: {
345: int success;
346: PE pe = rox->rox_args;
347: struct ds_op_arg * arg = &(di->di_invoke.dx_arg);
348:
349: di->di_type = DI_INVOKE;
350: di->di_invoke.dx_id = rox->rox_id;
351:
352: switch(arg->dca_dsarg.arg_type = rox->rox_op)
353: {
354: case OP_READ :
355: success = decode_DO_ChainedReadArgument(pe,1,NULLIP,NULLVP,arg);
356: break;
357: case OP_COMPARE :
358: success = decode_DO_ChainedCompareArgument(pe,1,NULLIP,NULLVP,arg);
359: break;
360: case OP_ABANDON :
361: success = decode_DAS_AbandonArgument(pe,1,NULLIP,NULLVP,&(arg->dca_dsarg.arg_ab));
362: break;
363: case OP_LIST :
364: success = decode_DO_ChainedListArgument(pe,1,NULLIP,NULLVP,arg);
365: break;
366: case OP_SEARCH :
367: success = decode_DO_ChainedSearchArgument(pe,1,NULLIP,NULLVP,arg);
368: break;
369: case OP_ADDENTRY :
370: success = decode_DO_ChainedAddEntryArgument(pe,1,NULLIP,NULLVP,arg);
371: break;
372: case OP_REMOVEENTRY :
373: success = decode_DO_ChainedRemoveEntryArgument(pe,1,NULLIP,NULLVP,arg);
374: break;
375: case OP_MODIFYENTRY :
376: success = decode_DO_ChainedModifyEntryArgument(pe,1,NULLIP,NULLVP,arg);
377: break;
378: case OP_MODIFYRDN :
379: success = decode_DO_ChainedModifyRDNArgument(pe,1,NULLIP,NULLVP,arg);
380: break;
381: default:
382: LLOG(log_dsap, LLOG_EXCEPTIONS, ("DspDecodeInvoke: op id %d unknown!", rox->rox_op));
383: DRejectRequest (sd, ROS_IP_UNRECOG, rox->rox_id);
384: return (dsaplose (di, DP_INVOKE, NULLCP, "Unknown operation identifier"));
385: }
386:
387: if (success == NOTOK)
388: {
389: LLOG (log_dsap, LLOG_EXCEPTIONS, ("DspDecodeInvoke: Unable to parse argument"));
390: DRejectRequest (sd, ROS_IP_MISTYPED, rox->rox_id);
391: return (dsaplose (di, DP_INVOKE, NULLCP, "Undecodable argument"));
392: }
393:
394: return(success);
395: }
396:
397: int DspDecodeResult (sd, ror, di)
398: int sd;
399: struct RoSAPresult * ror;
400: struct DSAPindication * di;
401: {
402: int success;
403: PE pe = ror->ror_result;
404: struct ds_op_res * res = &(di->di_result.dr_res);
405:
406: di->di_type = DI_RESULT;
407: di->di_result.dr_id = ror->ror_id;
408:
409: switch(res->dcr_dsres.result_type = ror->ror_op)
410: {
411: case OP_READ :
412: success = decode_DO_ChainedReadResult(pe,1,NULLIP,NULLVP,res);
413: break;
414: case OP_COMPARE :
415: success = decode_DO_ChainedCompareResult(pe,1,NULLIP,NULLVP,res);
416: break;
417: case OP_ABANDON :
418: success = decode_DAS_AbandonResult(pe,1,NULLIP,NULLVP,NULLCP);
419: break;
420: case OP_LIST :
421: success = decode_DO_ChainedListResult(pe,1,NULLIP,NULLVP,res);
422: break;
423: case OP_SEARCH :
424: success = decode_DO_ChainedSearchResult(pe,1,NULLIP,NULLVP,res);
425: break;
426: case OP_ADDENTRY :
427: success = decode_DO_ChainedAddEntryResult(pe,1,NULLIP,NULLVP,res);
428: break;
429: case OP_REMOVEENTRY :
430: success = decode_DO_ChainedRemoveEntryResult(pe,1,NULLIP,NULLVP,res);
431: break;
432: case OP_MODIFYENTRY :
433: success = decode_DO_ChainedModifyEntryResult(pe,1,NULLIP,NULLVP,res);
434: break;
435: case OP_MODIFYRDN :
436: success = decode_DO_ChainedModifyRDNResult(pe,1,NULLIP,NULLVP,res);
437: break;
438:
439: default:
440: success = NOTOK;
441: LLOG(log_dsap, LLOG_EXCEPTIONS, ("DspDecodeResult: op id %d unknown!", ror->ror_op));
442: DRejectRequest (sd, ROS_RRP_UNRECOG, ror->ror_id);
443: return (dsaplose (di, DP_RESULT, NULLCP, "Unknown operation identifier"));
444: }
445:
446: if (success == NOTOK)
447: {
448: LLOG (log_dsap, LLOG_EXCEPTIONS, ("DspDecodeResult: Unable to parse argument"));
449: DRejectRequest (sd, ROS_RRP_MISTYPED, ror->ror_id);
450: return (dsaplose (di, DP_RESULT, NULLCP, "Undecodable argument"));
451: }
452:
453: return(success);
454: }
455:
456: int QspDecodeInvoke (sd, rox, di)
457: int sd;
458: struct RoSAPinvoke * rox;
459: struct DSAPindication * di;
460: {
461: int success;
462: PE pe = rox->rox_args;
463: struct ds_op_arg * arg = &(di->di_invoke.dx_arg);
464:
465: di->di_type = DI_INVOKE;
466: di->di_invoke.dx_id = rox->rox_id;
467:
468: switch(arg->dca_dsarg.arg_type = rox->rox_op)
469: {
470: case OP_READ :
471: success = decode_DO_ChainedReadArgument(pe,1,NULLIP,NULLVP,arg);
472: break;
473: case OP_COMPARE :
474: success = decode_DO_ChainedCompareArgument(pe,1,NULLIP,NULLVP,arg);
475: break;
476: case OP_ABANDON :
477: success = decode_DAS_AbandonArgument(pe,1,NULLIP,NULLVP,&(arg->dca_dsarg.arg_ab));
478: break;
479: case OP_LIST :
480: success = decode_DO_ChainedListArgument(pe,1,NULLIP,NULLVP,arg);
481: break;
482: case OP_SEARCH :
483: success = decode_DO_ChainedSearchArgument(pe,1,NULLIP,NULLVP,arg);
484: break;
485: case OP_ADDENTRY :
486: success = decode_DO_ChainedAddEntryArgument(pe,1,NULLIP,NULLVP,arg);
487: break;
488: case OP_REMOVEENTRY :
489: success = decode_DO_ChainedRemoveEntryArgument(pe,1,NULLIP,NULLVP,arg);
490: break;
491: case OP_MODIFYENTRY :
492: success = decode_DO_ChainedModifyEntryArgument(pe,1,NULLIP,NULLVP,arg);
493: break;
494: case OP_MODIFYRDN :
495: success = decode_DO_ChainedModifyRDNArgument(pe,1,NULLIP,NULLVP,arg);
496: break;
497: case OP_GETEDB :
498: success = decode_Quipu_GetEntryDataBlockArgument(pe,1,NULLIP,NULLVP,&(arg->dca_dsarg.arg_ge));
499: break;
500: default:
501: LLOG(log_dsap, LLOG_EXCEPTIONS, ("QspDecodeInvoke: op id %d unknown!", rox->rox_op));
502: DRejectRequest (sd, ROS_IP_UNRECOG, rox->rox_id);
503: return (dsaplose (di, DP_INVOKE, NULLCP, "Unknown operation identifier"));
504: }
505:
506: if (success == NOTOK)
507: {
508: LLOG (log_dsap, LLOG_EXCEPTIONS, ("QspDecodeInvoke: Unable to parse argument"));
509: DRejectRequest (sd, ROS_IP_MISTYPED, rox->rox_id);
510: return (dsaplose (di, DP_INVOKE, NULLCP, "Undecodable argument"));
511: }
512:
513: return (success);
514: }
515:
516: int QspDecodeResult (sd, ror, di)
517: int sd;
518: struct RoSAPresult * ror;
519: struct DSAPindication * di;
520: {
521: int success;
522: PE pe = ror->ror_result;
523: struct ds_op_res * res = &(di->di_result.dr_res);
524:
525: di->di_type = DI_RESULT;
526: di->di_result.dr_id = ror->ror_id;
527:
528: switch(res->dcr_dsres.result_type = ror->ror_op)
529: {
530: case OP_READ :
531: success = decode_DO_ChainedReadResult(pe,1,NULLIP,NULLVP,res);
532: break;
533: case OP_COMPARE :
534: success = decode_DO_ChainedCompareResult(pe,1,NULLIP,NULLVP,res);
535: break;
536: case OP_ABANDON :
537: success = decode_DAS_AbandonResult(pe,1,NULLIP,NULLVP,NULLCP);
538: break;
539: case OP_LIST :
540: success = decode_DO_ChainedListResult(pe,1,NULLIP,NULLVP,res);
541: break;
542: case OP_SEARCH :
543: success = decode_DO_ChainedSearchResult(pe,1,NULLIP,NULLVP,res);
544: break;
545: case OP_ADDENTRY :
546: success = decode_DO_ChainedAddEntryResult(pe,1,NULLIP,NULLVP,res);
547: break;
548: case OP_REMOVEENTRY :
549: success = decode_DO_ChainedRemoveEntryResult(pe,1,NULLIP,NULLVP,res);
550: break;
551: case OP_MODIFYENTRY :
552: success = decode_DO_ChainedModifyEntryResult(pe,1,NULLIP,NULLVP,res);
553: break;
554: case OP_MODIFYRDN :
555: success = decode_DO_ChainedModifyRDNResult(pe,1,NULLIP,NULLVP,res);
556: break;
557: case OP_GETEDB :
558: success = decode_Quipu_GetEntryDataBlockResult(pe,1,NULLIP,NULLVP,&(res->dcr_dsres.res_ge));
559: break;
560: default:
561: success = NOTOK;
562: LLOG(log_dsap, LLOG_EXCEPTIONS, ("QspDecodeResult: op id %d unknown!", ror->ror_op));
563: DRejectRequest (sd, ROS_RRP_UNRECOG, ror->ror_id);
564: return (dsaplose (di, DP_RESULT, NULLCP, "Unknown operation identifier"));
565: }
566:
567: if (success == NOTOK)
568: {
569: LLOG (log_dsap, LLOG_EXCEPTIONS, ("QspDecodeResult: Unable to parse argument"));
570: DRejectRequest (sd, ROS_RRP_MISTYPED, ror->ror_id);
571: return (dsaplose (di, DP_RESULT, NULLCP, "Undecodable argument"));
572: }
573:
574: return(success);
575: }
576:
577: int DDecodeError (sd, roe, di)
578: int sd;
579: struct RoSAPerror * roe;
580: struct DSAPindication * di;
581: {
582: int success;
583: PE pe = roe->roe_param;
584: struct DSError * err = &(di->di_error.de_err);
585:
586: #ifdef PDU_DUMP
587: pdu_dump (pe,DUMP_ERR,roe->roe_id);
588: #endif
589:
590: di->di_type = DI_ERROR;
591: di->di_error.de_id = roe->roe_id;
592:
593: switch(err->dse_type = roe->roe_error)
594: {
595: case DSE_ABANDON_FAILED :
596: success = decode_DAS_AbandonFailedParm(pe,1,NULLIP,NULLVP,&(err->dse_un.dse_un_abandon_fail));
597: break;
598: case DSE_ATTRIBUTEERROR :
599: success = decode_DAS_AttributeErrorParm(pe,1,NULLIP,NULLVP,&(err->dse_un.dse_un_attribute));
600: break;
601: case DSE_NAMEERROR :
602: success = decode_DAS_NameErrorParm(pe,1,NULLIP,NULLVP,&(err->dse_un.dse_un_name));
603: break;
604: case DSE_REFERRAL :
605: success = decode_DAS_ReferralParm(pe,1,NULLIP,NULLVP,&(err->dse_un.dse_un_referral));
606: break;
607: case DSE_SECURITYERROR :
608: success = decode_DAS_SecurityErrorParm(pe,1,NULLIP,NULLVP,&(err->dse_un.dse_un_security));
609: break;
610: case DSE_SERVICEERROR :
611: success = decode_DAS_ServiceErrorParm(pe,1,NULLIP,NULLVP,&(err->dse_un.dse_un_service));
612: break;
613: case DSE_UPDATEERROR :
614: success = decode_DAS_UpdateErrorParm(pe,1,NULLIP,NULLVP,&(err->dse_un.dse_un_update));
615: break;
616: case DSE_ABANDONED :
617: success = ((pe == NULLPE) ? OK : NOTOK);
618: break;
619: case DSE_DSAREFERRAL :
620: success = decode_DO_DSAReferralParm(pe, 1, NULLIP, NULLVP, &(err->dse_un.dse_un_referral));
621: break;
622:
623: default:
624: LLOG(log_dsap, LLOG_EXCEPTIONS, ("DDecodeError: op id %d unknown!", roe->roe_error));
625: DRejectRequest (sd, ROS_REP_UNRECOG, roe->roe_id);
626: return (dsaplose (di, DP_ERROR, NULLCP, "Unknown operation identifier"));
627: }
628:
629: if (success == NOTOK)
630: {
631: LLOG (log_dsap, LLOG_EXCEPTIONS, ("DDecodeError: Unable to parse argument"));
632: DRejectRequest (sd, ROS_RRP_MISTYPED, roe->roe_id);
633: return (dsaplose (di, DP_ERROR, NULLCP, "Undecodable argument"));
634: }
635:
636: return(success);
637: }
638:
639: int DDecodeUnbind (sd, acf, di)
640: int sd;
641: struct AcSAPfinish * acf;
642: struct DSAPindication * di;
643: {
644: struct RoNOTindication rni_s;
645: struct RoNOTindication * rni = &(rni_s);
646:
647: if (RoUnBindInit (acf, rni) != OK)
648: return (ronot2dsaplose (di, "RoUnBindInit", rni));
649:
650: if (acf->acf_ninfo != 0)
651: LLOG (log_dsap, LLOG_EXCEPTIONS, ("Unbind has argument present! sd=%d", sd));
652:
653: di->di_type = DI_FINISH;
654: di->di_finish.df_reason = acf->acf_reason;
655:
656: return (OK);
657: }
658:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.