|
|
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: 4736 (0x1280)
Types: TextFile
Names: »mibaccess.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦e83f91978⟧ »EurOpenD22/isode/osimis-2.0.tar.Z«
└─⟦d846658bd⟧
└─⟦this⟧ »osimis/sma/mibaccess.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.
*/
/* mibaccess.c - routines to handle the MIB tree structure */
/*
* By Simon Walton, October 1988
*/
#include <stdio.h>
#include "isode/rosap.h"
#include "msap.h"
#include "smi.h"
extern char * malloc();
extern int (*idtype2moinit())();
extern int (*idtype2model())();
extern OID oid_copy();
struct ManagedObject * create_MO();
void delete_MO();
static struct ManagedObject * find1comp(start, key)
MO_ID * key;
struct ManagedObject * start;
{
register struct ManagedObject * cnode = start->subordinate;
register int i;
while (cnode != NULL)
{
if (
( (i = key -> rdnlen) == 0 ||
( i == cnode -> rdnlen &&
bcmp(key -> rdnval, cnode -> rdnval, i) == 0 )
) &&
(oid_cmp(&cnode -> rdntype, &key -> rdntype) == 0)
) return (cnode);
cnode = cnode->sibling;
}
return (NULL); /* can't find it */
}
static struct ManagedObject * forc1comp(start, key)
MO_ID * key;
struct ManagedObject * start;
{
struct ManagedObject * last = NULL, * new;
register struct ManagedObject * cnode = start->subordinate;
register int i;
while ( cnode != NULL)
{
if (
( (i = key -> rdnlen) == 0 ||
( i == cnode -> rdnlen &&
bcmp(key -> rdnval, cnode -> rdnval, i) == 0 )
) &&
(oid_cmp(&cnode -> rdntype, &key -> rdntype) == 0)
) return (cnode);
cnode = (last=cnode) -> sibling;
}
/* can't find so create */
if ( (new = create_MO(key)) == NULL) return (NULL);
if (last != NULL) last -> sibling = new;
else start -> subordinate = new; /* created new level */
new -> parent = start;
return (new);
}
/* findcomp - Finds node who's pathname is 'key' in tree pointed to
* by 'start', if it exists, otherwise returns NULL. First
* component of pathname is looked for in level below 'start'.
* Returns a pointer to node whoes id is last component of
* pathname.
*/
struct ManagedObject * findcomp(start, key)
MO_ID * key;
struct ManagedObject * start;
{
register struct ManagedObject * part;
if (key == NULL) return (start); /* found it */
if ( (part = find1comp(start, key)) == NULL) return (NULL);
return (findcomp(part, key -> Next));
}
/* forccomp - Finds node who's pathname is 'key'. If it does not exist
* then it is created. Returns NULL if out of memory, otherwise as above.
*/
struct ManagedObject * forccomp(start, key)
MO_ID * key;
struct ManagedObject * start;
{
register struct ManagedObject * part;
if (key == NULL) return (start); /* end of path */
if ( (part = forc1comp(start, key)) == NULL) return (NULL);
return (forccomp(part, key -> Next));
}
void deletecomp(start, key)
struct ManagedObject * start;
MO_ID * key;
{
struct ManagedObject * m, ** r;
if ( (m = findcomp(start, key)) == NULL) return;
for( r = &m -> parent -> subordinate; *r != NULL; r = &(*r) -> sibling)
if ( *r == m)
{
*r = m -> sibling; /* unlink MO */
delete_MO(m); /* now free */
break;
}
return;
}
static struct ManagedObject * create_MO(id)
MO_ID * id;
{
int (*mo_init)();
register struct ManagedObject * newmo;
register int i;
if ((mo_init = idtype2moinit(&id -> rdntype)) == NULLIFP)
{
#ifdef DEBUG
fprintf(stderr, "Can't find MO initialize routine\n");
#endif DEBUG
return (NULL);
}
if ((newmo = (struct ManagedObject *)malloc(sizeof(*newmo)) )
== NULL) return (NULL);
if (oid_copy(&id -> rdntype, &newmo -> rdntype) == NULL) return (NULL);
i = newmo -> rdnlen = id -> rdnlen;
bcopy(id -> rdnval, newmo ->rdnval, i);
newmo -> sibling = 0; newmo -> subordinate = 0;
if ((mo_init)(newmo) == 1) return (newmo);
#ifdef DEBUG
fprintf(stderr,"New MO initialize failed\n");
#endif DEBUG
return (NULL);
}
static void delete_MO(m)
struct ManagedObject * m;
{
struct ManagedObject * p, * q;
IFP mo_del;
for(p = m -> subordinate; p != NULL; p = q) {
q = p -> sibling;
delete_MO(p);
}
if ( (mo_del = idtype2model(&m -> rdntype)) != NULLIFP)
(mo_del)(m);
free((char*) m -> rdntype.oid_elements);
free((char*) m);
}