|
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 c
Length: 12105 (0x2f49) Types: TextFile Names: »cmis.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦e83f91978⟧ »EurOpenD22/isode/osimis-2.0.tar.Z« └─⟦d846658bd⟧ └─⟦this⟧ »osimis/sma/cmis.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. */ /* handle the CMIP/S side of the SMA */ /* * By George Pavlou, April 1990 */ #include <stdio.h> #include <varargs.h> #include "isode/rosap.h" #include "msap.h" #include "smi.h" #define MAXCONNS 6 /* max mgmt connections */ static int NofConns; /* no of current mgmt connections */ extern struct ManagedObject * MIBroot; extern struct ManagedObject * findcomp(), * forccomp(); extern OID oid_copy(); int M_This_Con; /* for report dests */ int doGetMyId(); int doGetMySubords(); char * alloca(); int cmip_init (vecp, vec) int vecp; char ** vec; { int sd, status; struct MSAPstart mss, * ms = &mss; struct MSAPindication mis, * mi = &mis; struct MSAPabort * ma = &mi -> mi_abort; if (M_Init(vecp, vec, ms, mi) == NOTOK) { warn("initialization fails: %s\n", ma -> ma_data); return NOTOK; } sd = ms -> ms_sd; status = NofConns < MAXCONNS ? ACS_ACCEPT : ACS_TRANSIENT; if (M_InitialiseResp(ms, status, NULLAEI, &ms->ms_start.ps_called, NULLOID, 0x1, 0x0, NULLEXTERN, NULLEXTERN, mi) == NOTOK) { warn("A-ASSOCIATE.RESPONSE: %s\n", ma -> ma_data); return NOTOK; } NofConns++; return sd; } /* VARARGS1 */ warn (s, a, b, c, d, e) char * s; caddr_t a, b, c, d, e; { fprintf(stderr, s, a, b, c, d, e); fputc('\n',stderr); } cmip_work (fd) int fd; { struct MSAPindication mis; M_WaitReq(fd, OK, &mis); switch (mis.mi_type) { case MI_PREJECT: switch (mis.mi_preject.mr_reason) { case ROS_TIMER: return OK; case ROS_ACS: /* ACS disconnect */ NofConns--; break; default: break; } break; case MI_GET: (void) doGet(fd, mis.mi_getv.id, &mis.mi_getv.args.ga_class, &mis.mi_getv.args.ga_inst, mis.mi_getv.args.ga_access, mis.mi_getv.args.ga_sync, mis.mi_getv.args.ga_nattrs, mis.mi_getv.args.ga_attrs); break; case MI_SET: (void) doSet(fd, 0, mis.mi_setv.id, &mis.mi_setv.args.sa_class, &mis.mi_setv.args.sa_inst, mis.mi_setv.args.sa_access, mis.mi_setv.args.sa_sync, mis.mi_setv.args.sa_nattrs, mis.mi_setv.args.sa_attrs); break; case MI_SETC: (void) doSet(fd, 1, mis.mi_setv.id, &mis.mi_setv.args.sa_class, &mis.mi_setv.args.sa_inst, mis.mi_setv.args.sa_access, mis.mi_setv.args.sa_sync, mis.mi_setv.args.sa_nattrs, mis.mi_setv.args.sa_attrs); break; case MI_EVENT_REP: case MI_EVENT_REPC: case MI_EVENT_REP_RES: case MI_GET_RES: case MI_SET_RES: fprintf(stderr, "Illegal indication type %d\n", mis.mi_type); break; case MI_TERM: #ifdef DEBUG fprintf(stderr, "Connection released - %d\n", mis.mi_term.mt_reason); #endif DEBUG M_TerminateResp(fd, ACS_ACCEPT, ACR_NORMAL, NULLPE, &mis); NofConns--; return NOTOK; default: fprintf(stderr, "Unknown indication type %d\n", mis.mi_type); break; } return OK; } /* ARGSUSED */ static doGet (fd, id, class, instance, access, sync, nattrs, attrs) int fd, id; MID class; MN instance; PE access; CMISsync sync; int nattrs; MID attrs; { struct MSAPindication mis; struct ManagedObject * m; CMISparam result[M_MAXATTRS]; MO_ID * inst; CMISerrors error = m_noError; register int cur; dn_decode(instance -> mn_dn); inst = dn2moid(instance -> mn_dn); m = findcomp(MIBroot, inst); moid_free(inst); if (m == NULL) return doGetError(fd, id, NULLMID, instance, m_noSuchObjectInstance); if (oid_cmp(class -> mid_global, &m -> Class) == NOTOK) return doGetError(fd, id, class, instance, m_classInstanceConflict); for (cur = 0; cur < nattrs && cur < M_MAXATTRS; cur++) { register int curid; result[cur].mp_id.mid_type = MID_LOCAL; curid = result[cur].mp_id.mid_local = attrs[cur].mid_local; if (curid == 0) { if (doGetMyId(&result[cur].mp_val, m) == 0) return doGetError(fd, id, class, instance, m_processingFailure); continue; } if (curid == 1) { if (doGetMySubords(&result[cur].mp_val, m) == 0) return doGetError(fd, id, class, instance, m_processingFailure); continue; } if (m -> do_get == NULL) return doGetError(fd, id, NULLMID, NULLMN, m_accessDenied); switch(result[cur].mp_error = (m -> do_get)(&result[cur].mp_val, m, curid)) { case m_noError: break; case m_noSuchAttribute: error = m_getListError; result[cur].mp_val = NULLPE; break; case m_processingFailure: return doGetError(fd, id, class, instance, m_processingFailure); default: break; } } if (M_GetRes(fd, id, NOLINKED, class, instance, NULLCP, cur, result, error, NULLMERRPARM, &mis) == NOTOK) warn("Get Result failed - %s\n", mis.mi_preject.mr_data); for (; cur;) if (result[--cur].mp_val) pe_free(result[cur].mp_val); return OK; } /* ARGSUSED */ static doSet (fd, conf, id, class, instance, access, sync, nattrs, attrs) int fd, conf, id; MID class; MN instance; PE access; CMISsync sync; int nattrs; CMISparam * attrs; { struct MSAPindication mis; struct ManagedObject * m; CMISparam result[M_MAXATTRS]; MO_ID * inst; CMISerrors error = m_noError; register int cur; int (*curfunc)(); dn_decode(instance -> mn_dn); inst = dn2moid(instance -> mn_dn); m = findcomp(MIBroot, inst); moid_free(inst); if (m == NULL) return doSetError(fd, conf, id, NULLMID, instance, m_noSuchObjectInstance); if (oid_cmp(class -> mid_global, &m -> Class) == NOTOK) return doSetError(fd, conf, id, class, instance, m_classInstanceConflict); if (m -> do_set == NULL && m -> do_add == NULL && m -> do_remove == NULL) return doSetError(fd, conf, id, NULLMID, NULLMN, m_accessDenied); M_This_Con = fd; for (cur = 0; cur < nattrs && cur < M_MAXATTRS; cur++) { register int curid; result[cur].mp_id.mid_type = MID_LOCAL; curid = result[cur].mp_id.mid_local = attrs[cur].mp_id.mid_local; switch (attrs[cur].mp_modify) { case m_replace: if ((curfunc = m -> do_set) == NULL) { result[cur].mp_error = m_invalidOperation; result[cur].mp_val = attrs[cur].mp_val; error = m_setListError; continue; } break; case m_addValue: if ((curfunc = m -> do_add) == NULL) { result[cur].mp_error = m_invalidOperation; result[cur].mp_val = attrs[cur].mp_val; error = m_setListError; continue; } break; case m_removeValue: if ((curfunc = m -> do_remove) == NULL) { result[cur].mp_error = m_invalidOperation; result[cur].mp_val = attrs[cur].mp_val; error = m_setListError; continue; } break; case m_setToDefault: result[cur].mp_error = m_invalidOperation; result[cur].mp_val = attrs[cur].mp_val; error = m_setListError; continue; default: result[cur].mp_error = m_invalidOperator; result[cur].mp_val = attrs[cur].mp_val; error = m_setListError; continue; } switch(result[cur].mp_error = (curfunc)(&result[cur].mp_val, m, curid, attrs[cur].mp_val)) { case m_noError: break; case m_noSuchAttribute: error = m_setListError; result[cur].mp_val = attrs[cur].mp_val; break; case m_invalidAttributeValue: error = m_setListError; result[cur].mp_val = attrs[cur].mp_val; break; case m_processingFailure: return doSetError(fd, conf, id, class, instance, m_processingFailure); default: break; } } if (conf && M_SetRes(fd, id, NOLINKED, class, instance, NULLCP, cur, result, error, NULLMERRPARM, &mis) == NOTOK) warn("Set Result failed - %s\n", mis.mi_preject.mr_data); for (; cur;) if (result[--cur].mp_val) pe_free(result[cur].mp_val); return OK; } static doGetMyId (res, m) PE * res; struct ManagedObject * m; { MO_ID name; RDN rdn; int s; (void) oid_copy(&m -> rdntype, &name.rdntype); bcopy(m -> rdnval, name.rdnval, name.rdnlen = m -> rdnlen); rdn = moid2rdn(&name); s = encode_IF_RelativeDistinguishedName(res, 1, 0, NULLCP, rdn); rdn_free(rdn); free((char*) name.rdntype.oid_elements); return (s == NOTOK ? 0 : 1); } static doGetMySubords (res, m) PE * res; struct ManagedObject * m; { int i, n, s; MO_ID * names = (MO_ID*) NULL; DN rdnseq; register struct ManagedObject * subs = m -> subordinate; for(n = 0; subs; n++) subs = subs -> sibling; if (n) { if ((names = (MO_ID*) malloc(n * sizeof(MO_ID))) == NULL) return 0; subs = m -> subordinate; for(i = 0; i < n; i++) { oid_copy(&subs -> rdntype, &names[i].rdntype); bcopy(subs -> rdnval, names[i].rdnval, names[i].rdnlen = subs -> rdnlen); if (i+1 < n) names[i].Next = &names[i+1]; else names[i].Next = (MO_ID*) NULL; subs = subs -> sibling; } } rdnseq = moid2dn(names); s = encode_IF_RDNSequence(res, 1, 0, NULLCP, rdnseq); if (rdnseq) dn_free(rdnseq); for(i = 0; i < n; i++) free((char*) names[i].rdntype.oid_elements); if (names) free(names); return (s == NOTOK ? 0 : 1); } static int doGetError (fd, id, class, instance, error) int fd, id; MID class; MN instance; CMISerrors error; { CMISerrparam err_info; struct MSAPindication mis; #ifdef DEBUG fprintf(stderr, "SMA-CMIS: doGetError %d\n", (int) error); #endif switch (error) { case m_accessDenied: break; case m_noSuchObjectInstance: err_info.me_inst = *instance; /* struct copy */ break; case m_classInstanceConflict: err_info.me_class = *class; /* .. */ err_info.me_inst = *instance; /* .. */ break; case m_processingFailure: err_info.me_class = *class; /* .. */ err_info.me_inst = *instance; /* .. */ err_info.me_val = NULLPE; break; default: fprintf(stderr, "doGetError: invalid error value %d\n", (int) error); return NOTOK; } return M_GetRes(fd, id, NOLINKED, NULLMID, NULLMN, NULLCP, 0, NULLMPARM, error, &err_info, &mis); } static int doSetError (fd, conf, id, class, instance, error) int fd, conf, id; MID class; MN instance; CMISerrors error; { CMISerrparam err_info; struct MSAPindication mis; #ifdef DEBUG fprintf(stderr, "SMA-CMIS: doSetError %d\n", (int) error); #endif if (!conf) return OK; switch (error) { case m_accessDenied: break; case m_noSuchObjectInstance: err_info.me_inst = *instance; /* struct copy */ break; case m_classInstanceConflict: err_info.me_class = *class; /* .. */ err_info.me_inst = *instance; /* .. */ break; case m_processingFailure: err_info.me_class = *class; /* .. */ err_info.me_inst = *instance; /* .. */ err_info.me_val = NULLPE; break; default: fprintf(stderr, "doGetError: invalid error value %d\n", (int) error); return NOTOK; } return M_SetRes(fd, id, NOLINKED, NULLMID, NULLMN, NULLCP, 0, NULLMPARM, error, &err_info, &mis); }