|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 17772 (0x456c) Types: TextFile Names: »mindicate.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦e83f91978⟧ »EurOpenD22/isode/osimis-2.0.tar.Z« └─⟦d846658bd⟧ └─⟦this⟧ »osimis/msap/mindicate.c«
/* * Copyright (c) 1988 University College London * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the Department of Computer Science, University College London. * The name of the University may not be used to * endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* Routines to realise the M-XXX.indication primitives */ /* * By George Pavlou, April 1990 */ #include <stdio.h> #include "isode/rosap.h" #include "msap.h" #define NULLOP ((struct RoSAPinvoke *) 0) #define NULLRES ((struct RoSAPresult *) 0) #define NULLERR ((struct RoSAPerror *) 0) static int eventrepind(), linkedreplyind(), getind(), setind(), actionind(), createind(), deleteind(); static int eventrepres(), getres(), setres(), actionres(), createres(), deleteres(), merror(); static int parsefail(), rosfail(); /* LINTLIBRARY */ int M_WaitReq (msd, secs, mi) int msd, secs; struct MSAPindication * mi; { struct RoSAPindication rois; (void) RoWaitRequest(msd, secs, &rois); switch (rois.roi_type) { case ROI_PREJECT: return rosfail(&rois.roi_preject, mi); case ROI_FINISH: mi->mi_type = MI_TERM; mi->mi_term.mt_reason = rois.roi_finish.acf_reason; ACFFREE(&rois.roi_finish); return OK; case ROI_INVOKE: switch (rois.roi_invoke.rox_op) { case M_EVENT_REP: mi->mi_type = MI_EVENT_REP; return eventrepind(&rois.roi_invoke, mi); case M_EVENT_REPC: mi->mi_type = MI_EVENT_REPC; return eventrepind(&rois.roi_invoke, mi); case M_LINKED_REPLY: mi->mi_type = MI_LINKED_REPLY; return linkedreplyind(&rois.roi_invoke, mi); case M_GET: mi->mi_type = MI_GET; return getind(&rois.roi_invoke, mi); case M_SET: mi->mi_type = MI_SET; return setind(&rois.roi_invoke, mi); case M_SETC: mi->mi_type = MI_SETC; return setind(&rois.roi_invoke, mi); case M_ACTION: mi->mi_type = MI_ACTION; return actionind(&rois.roi_invoke, mi); case M_ACTIONC: mi->mi_type = MI_ACTIONC; return actionind(&rois.roi_invoke, mi); case M_CREATE: mi->mi_type = MI_CREATE; return createind(&rois.roi_invoke, mi); case M_DELETE: mi->mi_type = MI_DELETE; return deleteind(&rois.roi_invoke, mi); default: mi->mi_type = MI_PREJECT; mi->mi_preject.mr_reason = MI_UNKNOWN; (void) strncpy(mi->mi_preject.mr_data, "Unknown Operation", MR_SIZE); return NOTOK; } case ROI_RESULT: switch (rois.roi_result.ror_op) { case M_EVENT_REPC: mi->mi_type = MI_EVENT_REP_RES; return eventrepres(&rois.roi_result, mi); case M_GET: mi->mi_type = MI_GET_RES; return getres(&rois.roi_result, mi); case M_SETC: mi->mi_type = MI_SET_RES; return setres(&rois.roi_result, mi); case M_ACTIONC: mi->mi_type = MI_ACTION_RES; return actionres(&rois.roi_result, mi); case M_CREATE: mi->mi_type = MI_CREATE_RES; return createres(&rois.roi_result, mi); case M_DELETE: mi->mi_type = MI_DELETE_RES; return deleteres(&rois.roi_result, mi); default: mi->mi_type = MI_PREJECT; mi->mi_preject.mr_reason = MI_UNKNOWN; (void) strncpy(mi->mi_preject.mr_data, "Unknown Result", MR_SIZE); return NOTOK; } case ROI_ERROR: mi->mi_type = MI_ERROR; return merror(&rois.roi_error, mi); default: mi->mi_type = MI_PREJECT; mi->mi_preject.mr_reason = MI_UNKNOWN; (void) strncpy( mi->mi_preject.mr_data, "Unknown indication \ returned by RoWaitReq", MR_SIZE); return NOTOK; } } static int eventrepind (op, mi) struct RoSAPinvoke * op; struct MSAPindication * mi; { mi->mi_eventrepv.id = op->rox_id; mi->mi_eventrepv.args.ea_time = NULLCP; mi->mi_eventrepv.args.ea_info = NULLPE; if (parse_CMIP_EventReportArgument(op->rox_args, 1, NULLIP, NULLVP, &mi->mi_eventrepv.args) == NOTOK) return parsefail("EventReportArgument", op, NULLRES, NULLERR, mi); ROXFREE(op); return OK; } static int linkedreplyind (op, mi) struct RoSAPinvoke * op; struct MSAPindication * mi; { (void) bzero((char *) &mi->mi_linkedreplyv.args, sizeof mi->mi_linkedreplyv.args); mi->mi_linkedreplyv.id = op->rox_id; if (parse_CMIP_LinkedReplyArgument(op->rox_args, 1, NULLIP, NULLVP, &mi->mi_linkedreplyv.args) == NOTOK) return parsefail("EventReportArgument", op, NULLRES, NULLERR, mi); ROXFREE(op); return OK; } static int getind (op, mi) struct RoSAPinvoke * op; struct MSAPindication * mi; { mi->mi_getv.id = op->rox_id; mi->mi_getv.args.ga_access = NULL; mi->mi_getv.args.ga_sync = s_bestEffort; mi->mi_getv.args.ga_scope.sc_type = Sc_BaseObject; mi->mi_getv.args.ga_filter = NULLFILTER; mi->mi_getv.args.ga_nattrs = 0; if (parse_CMIP_GetArgument(op->rox_args, 1, NULLIP, NULLVP, &mi->mi_getv.args) == NOTOK) return parsefail("GetArgument", op, NULLRES, NULLERR, mi); ROXFREE(op); return OK; } static int setind (op, mi) struct RoSAPinvoke * op; struct MSAPindication * mi; { register int i; mi->mi_setv.id = op->rox_id; mi->mi_setv.args.sa_access = NULL; mi->mi_setv.args.sa_sync = s_bestEffort; mi->mi_setv.args.sa_scope.sc_type = Sc_BaseObject; mi->mi_setv.args.sa_filter = NULLFILTER; for (i = 0; i < M_MAXATTRS; i++) { mi->mi_setv.args.sa_attrs[i].mp_val = NULLPE; mi->mi_setv.args.sa_attrs[i].mp_modify = m_replace; } if (parse_CMIP_SetArgument(op->rox_args, 1, NULLIP, NULLVP, &mi->mi_setv.args) == NOTOK) return parsefail("SetArgument", op, NULLRES, NULLERR, mi); ROXFREE(op); return OK; } static int actionind (op, mi) struct RoSAPinvoke * op; struct MSAPindication * mi; { mi->mi_actionv.id = op->rox_id; mi->mi_actionv.args.aa_access = NULL; mi->mi_actionv.args.aa_sync = s_bestEffort; mi->mi_actionv.args.aa_scope.sc_type = Sc_BaseObject; mi->mi_actionv.args.aa_filter = NULLFILTER; if (parse_CMIP_ActionArgument(op->rox_args, 1, NULLIP, NULLVP, &mi->mi_actionv.args) == NOTOK) return parsefail("ActionArgument", op, NULLRES, NULLERR, mi); ROXFREE(op); return OK; } static int createind (op, mi) struct RoSAPinvoke * op; struct MSAPindication * mi; { mi->mi_createv.id = op->rox_id; mi->mi_createv.args.ca_instype = CA_OBJECT_INST; mi->mi_createv.args.ca_inst.mn_type = MN_DN; mi->mi_createv.args.ca_inst.mn_dn = NULLDN; mi->mi_createv.args.ca_access = NULL; mi->mi_createv.args.ca_refinst.mn_type = MN_DN; mi->mi_createv.args.ca_refinst.mn_dn = NULLDN; mi->mi_createv.args.ca_nattrs = 0; if (parse_CMIP_CreateArgument(op->rox_args, 1, NULLIP, NULLVP, &mi->mi_createv.args) == NOTOK) return parsefail("CreateArgument", op, NULLRES, NULLERR, mi); ROXFREE(op); return OK; } static int deleteind (op, mi) struct RoSAPinvoke * op; struct MSAPindication * mi; { mi->mi_deletev.id = op->rox_id; mi->mi_deletev.args.da_access = NULL; mi->mi_deletev.args.da_sync = s_bestEffort; mi->mi_deletev.args.da_scope.sc_type = Sc_BaseObject; mi->mi_deletev.args.da_filter = NULLFILTER; if (parse_CMIP_DeleteArgument(op->rox_args, 1, NULLIP, NULLVP, &mi->mi_deletev.args) == NOTOK) return parsefail("DeleteArgument", op, NULLRES, NULLERR, mi); ROXFREE(op); return OK; } static int eventrepres (res, mi) struct RoSAPresult * res; struct MSAPindication * mi; { mi->mi_eventrepr.id = res->ror_id; mi->mi_eventrepr.result.er_class.mid_type = MID_GLOBAL; mi->mi_eventrepr.result.er_class.mid_global = NULLOID; mi->mi_eventrepr.result.er_inst.mn_type = MN_DN; mi->mi_eventrepr.result.er_inst.mn_dn = NULLDN; mi->mi_eventrepr.result.er_time = NULLCP; mi->mi_eventrepr.result.er_reply.mp_id.mid_type = MID_GLOBAL; mi->mi_eventrepr.result.er_reply.mp_id.mid_global = NULLOID; mi->mi_eventrepr.result.er_reply.mp_val = NULLPE; if (parse_CMIP_EventReportResult(res->ror_result, 1, NULLIP, NULLVP, &mi->mi_eventrepr.result) == NOTOK) return parsefail("EventReportResult", NULLOP, res, NULLERR, mi); RORFREE(res); return OK; } static int getres (res, mi) struct RoSAPresult * res; struct MSAPindication * mi; { register int i; mi->mi_getr.id = res->ror_id; mi->mi_getr.result.gr_class.mid_type = MID_GLOBAL; mi->mi_getr.result.gr_class.mid_global = NULLOID; mi->mi_getr.result.gr_inst.mn_type = MN_DN; mi->mi_getr.result.gr_inst.mn_dn = NULLDN; mi->mi_getr.result.gr_time = NULLCP; mi->mi_getr.result.gr_nattrs = 0; for (i = 0; i < M_MAXATTRS; i++) mi->mi_getr.result.gr_attrs[i].mp_error = m_noError; if (parse_CMIP_GetResult(res->ror_result, 1, NULLIP, NULLVP, &mi->mi_getr.result) == NOTOK) return parsefail("GetResult", NULLOP, res, NULLERR, mi); RORFREE(res); return OK; } static int setres (res, mi) struct RoSAPresult * res; struct MSAPindication * mi; { register int i; mi->mi_setr.id = res->ror_id; mi->mi_setr.result.sr_class.mid_type = MID_GLOBAL; mi->mi_setr.result.sr_class.mid_global = NULLOID; mi->mi_setr.result.sr_inst.mn_type = MN_DN; mi->mi_setr.result.sr_inst.mn_dn = NULLDN; mi->mi_setr.result.sr_time = NULLCP; mi->mi_setr.result.sr_nattrs = 0; for (i = 0; i < M_MAXATTRS; i++) mi->mi_setr.result.sr_attrs[i].mp_error = m_noError; if (parse_CMIP_SetResult(res->ror_result, 1, NULLIP, NULLVP, &mi->mi_setr.result) == NOTOK) return parsefail("SetResult", NULLOP, res, NULLERR, mi); RORFREE(res); return OK; } static int actionres (res, mi) struct RoSAPresult * res; struct MSAPindication * mi; { mi->mi_actionr.id = res->ror_id; mi->mi_actionr.result.ar_class.mid_type = MID_GLOBAL; mi->mi_actionr.result.ar_class.mid_global = NULLOID; mi->mi_actionr.result.ar_inst.mn_type = MN_DN; mi->mi_actionr.result.ar_inst.mn_dn = NULLDN; mi->mi_actionr.result.ar_time = NULLCP; mi->mi_actionr.result.ar_reply.mp_id.mid_type = MID_GLOBAL; mi->mi_actionr.result.ar_reply.mp_id.mid_global = NULLOID; mi->mi_actionr.result.ar_reply.mp_val = NULLPE; if (parse_CMIP_ActionResult(res->ror_result, 1, NULLIP, NULLVP, &mi->mi_actionr.result) == NOTOK) return parsefail("ActionResult", NULLOP, res, NULLERR, mi); RORFREE(res); return OK; } static int createres (res, mi) struct RoSAPresult * res; struct MSAPindication * mi; { mi->mi_creater.id = res->ror_id; mi->mi_creater.result.cr_class.mid_type = MID_GLOBAL; mi->mi_creater.result.cr_class.mid_global = NULLOID; mi->mi_creater.result.cr_inst.mn_type = MN_DN; mi->mi_creater.result.cr_inst.mn_dn = NULLDN; mi->mi_creater.result.cr_time = NULLCP; mi->mi_creater.result.cr_nattrs = 0; if (parse_CMIP_CreateResult(res->ror_result, 1, NULLIP, NULLVP, &mi->mi_creater.result) == NOTOK) return parsefail("CreateResult", NULLOP, res, NULLERR, mi); RORFREE(res); return OK; } static int deleteres (res, mi) struct RoSAPresult * res; struct MSAPindication * mi; { mi->mi_deleter.id = res->ror_id; mi->mi_deleter.result.dr_class.mid_type = MID_GLOBAL; mi->mi_deleter.result.dr_class.mid_global = NULLOID; mi->mi_deleter.result.dr_inst.mn_type = MN_DN; mi->mi_deleter.result.dr_inst.mn_dn = NULLDN; mi->mi_deleter.result.dr_time = NULLCP; if (parse_CMIP_DeleteResult(res->ror_result, 1, NULLIP, NULLVP, &mi->mi_deleter.result) == NOTOK) return parsefail("DeleteResult", NULLOP, res, NULLERR, mi); RORFREE(res); return OK; } static int merror (err, mi) struct RoSAPerror * err; struct MSAPindication * mi; { (void) bzero((char *) &mi->mi_error.info, sizeof mi->mi_error.info); switch (mi->mi_errtype = (CMISerrors) (err->roe_error+1)) { case m_noSuchObjectClass: mi->mi_error.id = err->roe_id; if (parse_CMIP_ObjectClass(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info.me_class) == NOTOK) return parsefail("ObjectClass", NULLOP, NULLRES, err, mi); break; case m_noSuchObjectInstance: case m_duplicateManagedObjectInstance: case m_noSuchReferenceObject: case m_invalidObjectInstance: mi->mi_error.id = err->roe_id; if (parse_CMIP_ObjectInstance(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info.me_inst) == NOTOK) return parsefail("ObjectInstance", NULLOP, NULLRES, err, mi); break; case m_accessDenied: case m_invalidOperation: mi->mi_error.id = err->roe_id; break; case m_syncNotSupported: mi->mi_error.id = err->roe_id; if (parse_CMIP_CMISSync(err->roe_param, 1, NULLIP, NULLVP, (int *) &mi->mi_error.info.me_sync) == NOTOK) return parsefail("CMISSync", NULLOP, NULLRES, err, mi); break; case m_invalidFilter: mi->mi_error.id = err->roe_id; if (parse_CMIP_CMISFilter(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info.me_filter) == NOTOK) return parsefail("CMISFilter", NULLOP, NULLRES, err, mi); break; case m_noSuchAttribute: mi->mi_error.id = err->roe_id; if (parse_CMIP_AttributeId(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info.me_id) == NOTOK) return parsefail("AttributeId", NULLOP, NULLRES, err, mi); break; case m_invalidAttributeValue: mi->mi_error.id = err->roe_id; { CMISparam attr; if (parse_CMIP_Attribute(err->roe_param, 1, NULLIP, NULLVP, &attr) == NOTOK) return parsefail("Attribute", NULLOP, NULLRES, err, mi); mi -> mi_error.info.me_id = attr.mp_id; /* struct copy */ mi -> mi_error.info.me_val = attr.mp_val; } break; case m_getListError: mi->mi_getr.id = err->roe_id; if (parse_CMIP_GetListError(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_getr.result) == NOTOK) return parsefail("GetListError", NULLOP, NULLRES, err, mi); break; case m_setListError: mi->mi_setr.id = err->roe_id; if (parse_CMIP_SetListError(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_setr.result) == NOTOK) return parsefail("SetListError", NULLOP, NULLRES, err, mi); break; case m_noSuchAction: mi->mi_error.id = err->roe_id; if (parse_CMIP_NoSuchAction(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info) == NOTOK) return parsefail("NoSuchAction", NULLOP, NULLRES, err, mi); break; case m_processingFailure: mi->mi_error.id = err->roe_id; if (parse_CMIP_ProcessingFailure(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info) == NOTOK) return parsefail("ProcessingFailure", NULLOP, NULLRES, err, mi); break; case m_noSuchEventType: mi->mi_error.id = err->roe_id; if (parse_CMIP_NoSuchEventType(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info) == NOTOK) return parsefail("NoSuchEventType", NULLOP, NULLRES, err, mi); break; case m_noSuchArgument: mi->mi_error.id = err->roe_id; if (parse_CMIP_NoSuchArgument(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info) == NOTOK) return parsefail("NoSuchArgument", NULLOP, NULLRES, err, mi); break; case m_invalidArgumentValue: mi->mi_error.id = err->roe_id; if (parse_CMIP_InvalidArgumentValue(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info) == NOTOK) return parsefail("InvalidArgumentValue", NULLOP, NULLRES, err, mi); break; case m_invalidScope: mi->mi_error.id = err->roe_id; if (parse_CMIP_Scope(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info.me_scope) == NOTOK) return parsefail("Scope", NULLOP, NULLRES, err, mi); break; case m_missingAttributeValue: mi->mi_error.id = err->roe_id; if (parse_CMIP_AttributeIdList(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info.me_id) == NOTOK) return parsefail("AttributeIdList", NULLOP, NULLRES, err, mi); break; case m_classInstanceConflict: mi->mi_error.id = err->roe_id; if (parse_CMIP_BaseManagedObjectId(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info) == NOTOK) return parsefail("BaseManagedObjectId", NULLOP, NULLRES, err, mi); break; case m_complexityLimitation: mi->mi_error.id = err->roe_id; if (parse_CMIP_ComplexityLimitation(err->roe_param, 1, NULLIP, NULLVP, &mi->mi_error.info) == NOTOK) return parsefail("ComplexityLimitation", NULLOP, NULLRES, err, mi); break; case m_invalidOperator: mi->mi_error.id = err->roe_id; if (parse_CMIP_ModifyOperator(err->roe_param, 1, NULLIP, NULLVP, (int*) &mi->mi_error.info.me_modify) == NOTOK) return parsefail("ModifyOperator", NULLOP, NULLRES, err, mi); break; default: (void) fprintf(stderr, "Invalid Error Type: %d\n", mi->mi_errtype); return NOTOK; } ROEFREE(err); return OK; } static int parsefail (s, op, res, err, mi) char * s; struct RoSAPinvoke * op; struct RoSAPresult * res; struct RoSAPerror * err; struct MSAPindication * mi; { mi->mi_preject.mr_id = mi->mi_getv.id; mi->mi_type = MI_PREJECT; mi->mi_preject.mr_reason = MA_BADARGS; (void) sprintf(mi->mi_preject.mr_data, "%.*s: Badly formed packet received", MR_SIZE-35, s); if (op) ROXFREE(op) else if (res) RORFREE(res) else if (err) ROEFREE(err); return NOTOK; } static int rosfail (rpp, mi) struct RoSAPpreject * rpp; struct MSAPindication * mi; { mi->mi_type = MI_PREJECT; mi->mi_preject.mr_reason = rpp->rop_reason; mi->mi_preject.mr_id = rpp->rop_id; (void) strncpy(mi->mi_preject.mr_data, rpp->rop_data, MR_SIZE); ROPFREE(rpp); return NOTOK; }