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 i

⟦b66b2595a⟧ TextFile

    Length: 4765 (0x129d)
    Types: TextFile
    Names: »internal.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦e83f91978⟧ »EurOpenD22/isode/osimis-2.0.tar.Z« 
        └─⟦d846658bd⟧ 
            └─⟦this⟧ »osimis/sma/internal.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.
 */

/* internal.c - effect the flow of data within the MIB */

/*
 * By Simon Walton, October 1988
 * Modified by George Pavlou, April 1990
 */

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

extern char * context;

extern struct ManagedObject * MIBroot;
extern struct ManagedObject * findcomp(), * forccomp();
extern time_t time();
extern OID oid_copy();
void rem_dest();

check_Counter(mo, instance, c, prev)
struct ManagedObject * mo;
struct MO_ID * instance;
Counter * c;
int prev;
{
int i, l, cur = c -> Value;
C_Threshold * thresh = c -> Threshold;
if (thresh == NULL) return (OK);
if (thresh -> OnOff == 0) return (OK);
for (i = 0; i < 10; i++)
    if (prev < (l = thresh -> comparisonlevel[i]) &&
	cur >= l)   /* triggered */
	{
	int d;
	DefinedEvent * ev;
#ifdef DEBUG
	fprintf(stderr,"C_Threshold triggered, MO:\n");
	moid_print(instance);
#endif
	for (d = 0; d < 4; d++)
	    if (ev = thresh -> triggers[d])
		cause_DefinedEvent(mo, instance, ev);
	if (thresh -> offset) thresh -> comparisonlevel[i] +=
	    ((cur - thresh -> comparisonlevel[i]) % thresh -> offset + 1)
	    * thresh -> offset;
	return (OK);
	}
return (OK);
}

cause_DefinedEvent(mo, instance, ev)
struct ManagedObject * mo;
struct MO_ID * instance;
DefinedEvent * ev;
{
int i, result = OK;
struct ManagedObject * repcon;
for(i = 0; i < 3; i++)
    if (ev -> rcis[i])
	{
	if ((repcon = findcomp(MIBroot, ev -> rcis[i] )) == NULL)
	    {
	    result = NOTOK;
#ifdef DEBUG
	    fprintf(stderr, "Can't find Report Control:\n");
	    moid_print(ev -> rcis[i]);
#endif
	    continue;
	    }
	invoke_Report(mo, instance, repcon, &ev -> eventype);
	}
return (result);
}

invoke_Report(mo, instance, report, eventype)
struct ManagedObject * mo, * report;
struct MO_ID * instance;
OID eventype;
{
ReportControl * R = (ReportControl*) report -> attributes;
destinations * where;
PE info = NULLPE;
static invokeid;
int signalmask;
#ifndef DEBUG
if (R -> listofdests == NULL) return (OK);
#endif
if (R -> MakeEventReport)
    if ( (R -> MakeEventReport)(&info, mo, eventype) == NOTOK)
	{
#ifdef DEBUG
	fprintf(stderr, "Can't build report for event %s\n",
	    sprintoid(eventype));
#endif
	return (NOTOK);
	}
signalmask = sigblock(sigmask(SIGALRM));
for(where = R -> listofdests; where; where = where -> Next)
    switch (where -> type)
    {
    struct MSAPindication mis;
    struct MSAPconnect mcs;

    case RCI_DEST_PSAP:
	if (M_InitialiseReq(NULLAEI, NULLPA, NULLAEI, &where -> Psap_dest,
	    context, 0x1, 0x0, NULLEXTERN, NULLEXTERN, &mcs, &mis)
	    == NOTOK)
	    {
#ifdef DEBUG
	    fprintf(stderr, "Can't open connection for report control\n");
#endif
	    break;
	    }
	where -> type = RCI_DEST_FD;
	where -> Fd_dest = mcs.mc_sd;
	mcfree(&mcs);

    case RCI_DEST_FD:
    {   time_t tim; UTCtime eventime;
	MIDent class, event;
	MName  inst;

	class.mid_type = MID_GLOBAL, class.mid_global = &mo -> Class;
	inst.mn_type = MN_DN, inst.mn_dn = moid2dn(instance);
	event.mid_type = MID_GLOBAL, event.mid_global = eventype;
	tim = time((time_t*)0);
	tm2ut(localtime(&tim), &eventime);

	if (M_EventRep(where -> Fd_dest, invokeid++, &class, &inst,
		&event, utct2str(&eventime), info, &mis) == NOTOK)
	    {
#ifdef DEBUG
	    fprintf(stderr, "Event Report failed - %s\n",
		mis.mi_preject.mr_data);
#endif
	    rem_dest(R, where);
	    mifree(&mis);
	    }
	pe_free(info);
	dn_free(inst.mn_dn);
    }
	break;

    case RCI_DEST_AEI:
#ifdef DEBUG
	fprintf(stderr, "Can't handle AEI destinations (yet)\n");
#endif
	break;

    default:
#ifdef DEBUG
	fprintf(stderr, "Unknown destination type\n");
#endif
	break;

    } /* close switch */
sigsetmask(signalmask);
return (OK);
}

static void rem_dest(repcon, dest)
ReportControl * repcon;
destinations * dest;
{
destinations ** d = &repcon -> listofdests;
for(; *d; d = &(*d) -> Next)
    if (*d == dest)
	{
	*d = dest -> Next;
	free((char*) dest);
	break;
	}
}