DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T o

⟦2ff589f1f⟧ TextFile

    Length: 12289 (0x3001)
    Types: TextFile
    Names: »objinst.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦e83f91978⟧ »EurOpenD22/isode/osimis-2.0.tar.Z« 
        └─⟦d846658bd⟧ 
            └─⟦this⟧ »osimis/smap/objinst.c« 

TextFile

/*
 * 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 for transforming managed object instances */

/*
 * By George Pavlou, October 1988
 */

#include <stdio.h>
#include "isode/rosap.h"
#include "msap.h"
#include "objectS.h"

static char  *cthlds[] = {
	"CrFailIn",
	"CrFailOut",
	"CrCongst",
	"CrConfErr",
	"ProtErr",
	"CkSumErr",
	"PDUSent",
	"PDURecvd",
	"PDUReSent"
};
#define CTHLDNO 9



int  objinst2parent (inst)
MO_ID  *inst;
{
    MO_ID *tinst = inst, *tinst_last;

    if (tinst->Next == (MO_ID *) NULL) {
	advise(NULLCP, "objectinst2parent: illegal inst");
	return (NOTOK);
    }

    while (tinst->Next != (MO_ID *) NULL) {
	tinst_last = tinst;
	tinst = tinst->Next;
    }

    moid_free(tinst);
    tinst_last->Next = (MO_ID *) NULL;

    return (OK);
}


int  objinst2subord (inst, subordrdn)
MO_ID  *inst, *subordrdn;
{
    MO_ID *tinst = inst;
    OID  oid_copy();

    while (tinst->Next != (MO_ID *) NULL)
	tinst = tinst->Next;

    if ((tinst->Next = (MO_ID *) calloc(1, sizeof(MO_ID)))
		== (MO_ID *) NULL)
	return (NOTOK);

    tinst = tinst->Next;
    tinst->rdnlen = subordrdn->rdnlen;
    bcopy(subordrdn->rdnval, tinst->rdnval, 10);
    if (oid_copy(&subordrdn->rdntype, &tinst->rdntype)
		== (OID) NULL)
	return (NOTOK);

    return (OK);
}


int  objinst2type (inst)
MO_ID  *inst;
{
    MO_ID  *tinst = inst;
    int  level = 0;

    if (inst == (MO_ID *) NULL) {
	advise(NULLCP, "objinst2type: bad inst");
	return (NOTOK);
    }

    while (tinst->Next != (MO_ID *) NULL) {
	tinst = tinst->Next;
	level++;
    }

    switch (level) {
	case 0:         /* M_SYSTEM */
	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.1.1.1")) == 0)
		return (M_SYSTEM);
	    break;

	case 1:         /* T_SUBSYS or RPCTL */
	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.1.2.1")) == 0)
		return (T_SUBSYS);
	    else
	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.3.3.1")) == 0)
		return (RPCTL);
	    break;

	case 2:         /* T_ENTITY */
	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.1.3.1")) == 0)
		return (T_ENTITY);
	    break;

	case 3:         /* T_EINV or RPCTL */
	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.1.4.1")) == 0)
		return (T_EINV);
	    else
	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.3.3.1")) == 0)
		return (RPCTL);
	    break;

	case 4:         /* T_CEPT or C_THLD */
	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.1.5.1")) == 0)
		return (T_CEPT);
	    else
	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.3.1.1")) == 0)
		return (C_THLD);
	    break;

	case 5:         /* C_THLD */
	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.3.1.1")) == 0)
		return (C_THLD);
	    break;

	default:
	    advise(NULLCP, "objinst2type: bad inst - level %d", level);
	    return (NOTOK);
    }

    advise(NULLCP, "objinst2type: malformed inst - level %d, type %s",
					level, sprintoid(&tinst->rdntype));
    return (NOTOK);
}


/* VARARGS3 */

int   objinst2id (obj_inst, type, obj_id1, obj_id2, obj_id3, obj_id4)
MO_ID  *obj_inst;
int  type, *obj_id1, *obj_id2, *obj_id3, *obj_id4;
{
    MO_ID *tinst;
    char buf[10];
    int  i;

    if ((tinst = obj_inst) == (MO_ID *) NULL) {
	advise(NULLCP, "objinst2id: bad obj_inst");
	return (NOTOK);
    }

    switch (type) {
	case M_SYSTEM:
	    advise(NULLCP, "M_SYSTEM id is always NULL");
	    if (obj_id1 != NULLIP)
		*obj_id1 = NULL;
	    break;

	case T_SUBSYS:
	    advise(NULLCP, "T_SUBSYS id is always NULL");
	    if (obj_id1 != NULLIP)
		*obj_id1 = NULL;
	    break;

	case T_ENTITY:
	    for (i = 0; i < 2; i++)
		if (tinst->Next != (MO_ID *) NULL)
		    tinst = tinst->Next;
		else {
		    advise(NULLCP, "objinst2id: bad obj_inst");
		    return (NOTOK);
		}

	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.1.3.1")) != 0) {
		advise(NULLCP, "objinst2id: bad obj_inst");
		return (NOTOK);
	    }

	    strncpy(buf, &tinst->rdnval[1], 9);
	    if (strncmp(buf, "isode", 9) != 0) {
		advise(NULLCP, "objinst2id: bad T-Entity %s", buf);
		return (NOTOK);
	    }
	    if (obj_id1 != NULLIP)
		*obj_id1 = ISODE;
	    break;

	case T_EINV:
	    if (objinst2id(obj_inst, T_ENTITY, obj_id1) == NOTOK)
		return (NOTOK);

	    for (i = 0; i < 3; i++)
		if (tinst->Next != (MO_ID *) NULL)
		    tinst = tinst->Next;
		else {
		    advise(NULLCP, "objinst2id: bad obj_inst");
		    return (NOTOK);
		}

	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.1.4.1")) != 0) {
		advise(NULLCP, "objinst2id: bad obj_inst");
		return (NOTOK);
	    }

	    bcopy(&tinst->rdnval[1], obj_id2, sizeof(int));
	    break;

	case T_CEPT:
	    if (objinst2id(obj_inst, T_EINV, obj_id1, obj_id2) == NOTOK)
		return (NOTOK);

	    for (i = 0; i < 4; i++)
		if (tinst->Next != (MO_ID *) NULL)
		    tinst = tinst->Next;
		else {
		    advise(NULLCP, "objinst2id: bad obj_inst");
		    return (NOTOK);
		}

	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.1.5.1")) != 0) {
		advise(NULLCP, "objinst2id: bad obj_inst");
		return (NOTOK);
	    }

	    bcopy(&tinst->rdnval[1], obj_id3, sizeof(int));
	    break;

	case C_THLD:
	    tinst = obj_inst;
	    while (tinst->Next != (MO_ID *) NULL) {
		tinst = tinst->Next;
		i++;
	    }
	{
	    int  *cthld_id;

	    if (i == 4) {
		if (objinst2id(obj_inst, T_EINV, obj_id1, obj_id2) == NOTOK)
		    return (NOTOK);
		cthld_id = obj_id3;
	    }
	    else
	    if (i == 5) {
		if (objinst2id(obj_inst, T_CEPT, obj_id1, obj_id2, obj_id3)
				== NOTOK)
		    return (NOTOK);
		cthld_id = obj_id4;
	    }
	    else {
		advise(NULLCP, "objinst2id: bad obj_inst");
		return (NOTOK);
	    }

	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.3.1.1")) != 0) {
		advise(NULLCP, "objinst2id: bad obj_inst");
		return (NOTOK);
	    }

	    strncpy(buf, &tinst->rdnval[1], 9);
	    buf[9] = '\0';
	    for (i = 0; i < CTHLDNO; i++)
		if (strcmp(buf, cthlds[i]) == 0)
		    break;
	    if (i >= CTHLDNO) {
		advise(NULLCP, "objinst2id: bad C_THLD %s", buf);
		return (NOTOK);
	    }
	    *cthld_id = i;
	}
	    break;

	case RPCTL:
	    tinst = obj_inst;
	    while (tinst->Next != (MO_ID *) NULL) {
		tinst = tinst->Next;
		i++;
	    }
	{
	    int  *rpctl_id;

	    if (i == 1)
		rpctl_id = obj_id1;
	    else
	    if (i == 3) {
		if (objinst2id(obj_inst, T_ENTITY, obj_id1) == NOTOK)
		    return (NOTOK);
		rpctl_id = obj_id2;
	    }
	    else {
		advise(NULLCP, "objinst2id: bad obj_inst");
		return (NOTOK);
	    }

	    if (oid_cmp(&tinst->rdntype, str2oid("2.37.3.3.1")) != 0) {
		advise(NULLCP, "objinst2id: bad obj_inst");
		return (NOTOK);
	    }

	    bcopy(&tinst->rdnval[1], rpctl_id, sizeof(int));
	}
	    break;

	default:
	    advise(NULLCP, "objinst2id: illegal type %d", type);
	    return (NOTOK);
    }
    return (OK);
}


/* VARARGS2 */

MO_ID  *objid2inst (type, obj_id1, obj_id2, obj_id3, obj_id4)
int  type, obj_id1, obj_id2, obj_id3, obj_id4;
{
    MO_ID *inst, *tinst;
    OID  oid_copy();

    switch (type) {
	case M_SYSTEM:
	    if ((inst = (MO_ID *) calloc(1, sizeof(MO_ID))) == (MO_ID *) NULL)
		return ((MO_ID *) NULL);

	    if (oid_copy(str2oid("2.37.1.1.1"), &inst->rdntype)
			== (OID) NULL)
		return ((MO_ID *) NULL);
	    inst->rdnlen = 0;
	    return (inst);

	case T_SUBSYS:
	    if ((inst = objid2inst(M_SYSTEM, NULL)) == (MO_ID *) NULL)
		return ((MO_ID *) NULL);
	    tinst = inst;
	    if ((tinst->Next = (MO_ID *) calloc(1,sizeof(MO_ID)))
			== (MO_ID *) NULL)
		return ((MO_ID *) NULL);
	    tinst = tinst->Next;

	    if (oid_copy(str2oid("2.37.1.2.1"), &tinst->rdntype)
			== (OID) NULL)
		return ((MO_ID *) NULL);
	    tinst->rdnlen = 0;
	    return (inst);

	case T_ENTITY:
	    if (obj_id1 != ISODE) {
		advise(NULLCP, "objid2inst: illegal T_ENTITY %d", obj_id1);
		return ((MO_ID *) NULL);
	    }
	    if ((inst = objid2inst(T_SUBSYS, NULL)) == (MO_ID *) NULL)
		return ((MO_ID *) NULL);
	    tinst = inst;
	    while (tinst->Next != (MO_ID *) NULL)
		tinst = tinst->Next;
	    if ((tinst->Next = (MO_ID *) calloc(1,sizeof(MO_ID)))
			== (MO_ID *) NULL)
		return ((MO_ID *) NULL);
	    tinst = tinst->Next;

	    if (oid_copy(str2oid("2.37.1.3.1"), &tinst->rdntype)
			== (OID) NULL)
		return ((MO_ID *) NULL);
	    tinst->rdnlen  = strlen("isode")+1;
	    tinst->rdnval[0] = 1;
	    strncpy(&tinst->rdnval[1], "isode", 9);
	    return (inst);

	case T_EINV:
	    if (obj_id1 != ISODE) {
		advise(NULLCP, "objid2inst: illegal T_ENTITY %d", obj_id1);
		return ((MO_ID *) NULL);
	    }
	    if ((inst = objid2inst(T_ENTITY, obj_id1)) == (MO_ID *) NULL)
		return ((MO_ID *) NULL);
	    tinst = inst;
	    while (tinst->Next != (MO_ID *) NULL)
		tinst = tinst->Next;
	    if ((tinst->Next = (MO_ID *) calloc(1,sizeof(MO_ID)))
			== (MO_ID *) NULL)
		return ((MO_ID *) NULL);
	    tinst = tinst->Next;

	    if (oid_copy(str2oid("2.37.1.4.1"), &tinst->rdntype)
			== (OID) NULL)
		return ((MO_ID *) NULL);
	    tinst->rdnlen = sizeof(int);
	    tinst->rdnval[0] = 0;
	    bcopy(&obj_id2, &tinst->rdnval[1], sizeof(int));
	    return (inst);

	case T_CEPT:
	    if (obj_id1 != ISODE) {
		advise(NULLCP, "objid2inst: illegal T_ENTITY %d", obj_id1);
		return ((MO_ID *) NULL);
	    }
	    if ((inst = objid2inst(T_EINV, obj_id1, obj_id2))
			== (MO_ID *) NULL)
		return ((MO_ID *) NULL);
	    tinst = inst;
	    while (tinst->Next != (MO_ID *) NULL)
		tinst = tinst->Next;
	    if ((tinst->Next = (MO_ID *) calloc(1,sizeof(MO_ID)))
			== (MO_ID *) NULL)
		return ((MO_ID *) NULL);
	    tinst = tinst->Next;

	    if (oid_copy(str2oid("2.37.1.5.1"), &tinst->rdntype)
			== (OID) NULL)
		return ((MO_ID *) NULL);
	    tinst->rdnlen  = sizeof(int);
	    tinst->rdnval[0] = 0;
	    bcopy(&obj_id3, &tinst->rdnval[1], sizeof(int));
	    return (inst);

	case C_THLD:
	    if (obj_id1 != ISODE) {
		advise(NULLCP, "objid2inst: illegal T_ENTITY %d", obj_id1);
		return ((MO_ID *) NULL);
	    }
	    if (obj_id4 == 0) {
		if ((inst = objid2inst(T_EINV, obj_id1, obj_id2, obj_id3))
				== (MO_ID *) NULL)
		    return ((MO_ID *) NULL);
	    }
	    else
		if ((inst = objid2inst(T_CEPT, obj_id1, obj_id2, obj_id3,
								obj_id4))
				== (MO_ID *) NULL)
		    return ((MO_ID *) NULL);

	    tinst = inst;
	    while (tinst->Next != (MO_ID *) NULL)
		tinst = tinst->Next;

	    if ((tinst->Next = (MO_ID *) calloc(1, sizeof(MO_ID)))
				== (MO_ID *) NULL)
		return ((MO_ID *) NULL);
	    tinst = tinst->Next;

	{
	    int i = (obj_id4 == 0 ? obj_id3 : obj_id4);

	    if (oid_copy(str2oid("2.37.3.1.1"), &tinst->rdntype)
			== (OID) NULL)
		return ((MO_ID *) NULL);
	    tinst->rdnval[0] = 1;
	    tinst->rdnlen  = strlen(cthlds[i])+1;
	    strncpy(&tinst->rdnval[1], cthlds[i], 9);
	}
	    return (inst);

	case RPCTL:
	    if (obj_id2 == 1) {
		if ((inst = objid2inst(M_SYSTEM, NULL)) == (MO_ID *) NULL)
		    return ((MO_ID *) NULL);
		tinst = inst;
	    }
	    else {
		if (obj_id1 != ISODE) {
		    advise(NULLCP, "objid2inst: illegal T_ENTITY %d",
								obj_id1);
		    return ((MO_ID *) NULL);
		}
		if ((inst = objid2inst(T_ENTITY,obj_id1)) == (MO_ID *) NULL)
		    return ((MO_ID *) NULL);
		tinst = inst;
		while (tinst->Next != (MO_ID *) NULL)
		    tinst = tinst->Next;
	    }
	    if ((tinst->Next = (MO_ID *) calloc(1, sizeof(MO_ID)))
				== (MO_ID *) NULL)
		return ((MO_ID *) NULL);
	    tinst = tinst->Next;

	    if (oid_copy(str2oid("2.37.3.3.1"), &tinst->rdntype)
			== (OID) NULL)
		return ((MO_ID *) NULL);
	    tinst->rdnlen  = sizeof(int);
	    tinst->rdnval[0] = 0;
	    bcopy(&obj_id2, &tinst->rdnval[1], sizeof(int));
	    return (inst);

	default:
	    advise(NULLCP, "objid2inst: illegal type %d", type);
	    return ((MO_ID *) NULL);
    }
}