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 h

⟦5fc04615d⟧ TextFile

    Length: 12560 (0x3110)
    Types: TextFile
    Names: »host.c«

Derivation

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

/* requests and receives the management information and
 * processes event reports for one HOST (SMA)
 */

/*
 * By George Pavlou, October 1988
 */

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


T_EntityInvocationS  *parseTEntityInvocation();
T_ConnectionEndpointS  *parseTConnectionEndpoint();
MO_ID *objid2inst();
FREC  *whdr(), *wfrec();

static int  einvs, cepts;
extern int  mask, nfds;

T_EntityInvocationS  *Einv;



initialise_host (host, msd)
char *host;
int  msd[];
{
    struct MSAPindication  mis;
    MO_ID  *inst, *EinvRdns, *einvrdn, *CeptRdns, *ceptrdn;
    int  replies, pid, fd, ind = 0;
    DN  rdns;

    fprintf(stdout, "connecting to the SMA...\n");

    if ((msd[0] = m_init(host)) == NOTOK)       /* open mgmt connection */
	error(NULLCP, "can't establish connection to %s", host);


    mask |= 1 << msd[0];
    nfds  = msd[0] + 1;


    /*  set reports for einvs: TEinvReport, rcid 2
     *  and cepts: TCeptReport, rcid 3
     */

    if (ReportSetRequest(TEINV_REP, m_addValue, msd[0]) == NOTOK ||
		ReportSetRequest(TCEPT_REP, m_addValue, msd[0]) == NOTOK) {
	m_term(msd[0]);
	error(NULLCP, "ReportSetRequest failed");
    }


    fprintf(stdout, "getting management information...\n");

    /* Get T-LayerEntity subordinate ids */

    inst = objid2inst(T_ENTITY, ISODE);
    if (SubordinateListGetRequest(T_ENTITY, inst, msd[0], 0)
		== NOTOK) {
	m_term(msd[0]);
	error(NULLCP, "SubordinateListGetRequest failed");
    }
    moid_free(inst);


    if (M_WaitReq(msd[0], NOTOK, &mis) == NOTOK ||
			mis.mi_type != MI_GET_RES) {
	m_term(msd[0]);
	error(NULLCP, "failed to get result, mi_type = %d, reason is %s",
				mis.mi_type, mis.mi_preject.mr_data);
    }

    if (decode_IF_RDNSequence(mis.mi_getr.result.gr_attrs[0].mp_val,
		1, NULLIP, NULLVP, &rdns) == NOTOK) {
	m_term(msd[0]);
	error(NULLCP, "parse subordinates failed");
    }
    dn_decode(rdns);
    EinvRdns = dn2moid(rdns);
    dn_free(rdns);
    mifree(&mis);


    einvs = 0;
    einvrdn = EinvRdns;
    while (einvrdn != (MO_ID *) NULL) {
	if (oid_cmp(&einvrdn->rdntype, str2oid("2.37.1.4.1")) == 0) {
	    bcopy(&einvrdn->rdnval[1], &pid, sizeof(int));

	    /* request T-EntityInvocations */

	    inst = objid2inst(T_EINV, ISODE, pid);
	    if (ManagedObjectGetRequest(T_EINV, inst, msd[0], einvs++)
			== NOTOK) {
		m_term(msd[0]);
		error(NULLCP, "ManagedObjectGetRequest failed");
	    }
	    moid_free(inst);
	}
	einvrdn = einvrdn->Next;
    }

    moid_free(EinvRdns);


    /* create header recs for einvs */

    writerec(whdr(T_EINV, BLANK), ind++);
    writerec(whdr(T_EINV, HDR1A), ind++);
    writerec(whdr(T_EINV, HDR1B), ind++);
    writerec(whdr(T_EINV, UNDLN), ind++);


    /* Get T-EntityInvocations */

    cepts = 0;

    for (replies = 0; replies < einvs; ) {
	ManagedObjectS  mobj;

	if (M_WaitReq(msd[0], NOTOK, &mis) == NOTOK) {
	    m_term(msd[0]);
	    error(NULLCP, "M_WaitReq failed: reason = %s",
						mis.mi_preject.mr_data);
	}

	if (mis.mi_type != MI_GET_RES) {
	    if (mis.mi_type == MI_ERROR &&
			mis.mi_errtype == m_noSuchObjectInstance)
		replies++;	/* requested object died */
	    else		/* any other errors */
		advise(NULLCP, "error = %d occurred", mis.mi_errtype);
	    continue;
	}

	if ((mobj.einv = parseTEntityInvocation(mis.mi_getr.result.gr_attrs))
			== (T_EntityInvocationS *) NULL ||
	        decode_IF_RDNSequence(mis.mi_getr.result.gr_attrs[0].mp_val,
			1, NULLIP,NULLVP, &rdns) == NOTOK) {
	    m_term(msd[0]);
	    error(NULLCP, "TEinv parsing failed");
	}
	dn_decode(rdns);
	CeptRdns = dn2moid(rdns);
	dn_free(rdns);

	dn_decode(mis.mi_getr.result.gr_inst.mn_dn);
	inst = dn2moid(mis.mi_getr.result.gr_inst.mn_dn);
	writerec(wfrec(T_EINV, &mobj, inst), ind++);
	moid_free(inst);
	cfree(mobj.einv);

	replies++;

	/* find pid of the einv received */
	if (objinst2id(inst, T_EINV, NULLIP, &pid) == NOTOK) {
	    m_term(msd[0]);
	    error(NULLCP, "illegal einvinst");
	}

	ceptrdn = CeptRdns;
	while (ceptrdn != (MO_ID *) NULL) {
	    if (oid_cmp(&ceptrdn->rdntype, str2oid("2.37.1.5.1")) == 0) {
		bcopy(&ceptrdn->rdnval[1], &fd, sizeof(int));

		/* request T-ConnectionEndpoints */

		inst = objid2inst(T_CEPT, ISODE, pid, fd);
		if (ManagedObjectGetRequest(T_CEPT, inst, msd[0], cepts++)
				== NOTOK) {
		    m_term(msd[0]);
		    error(NULLCP, "ManagedObjectGetRequest failed");
		}
		moid_free(inst);
	    }
	    ceptrdn = ceptrdn->Next;
	}

	moid_free(CeptRdns);
	mifree(&mis);
    }


    /* create header recs for cepts */

    writerec(whdr(T_CEPT, BLANK), ind++);
    writerec(whdr(T_CEPT, HDR2A), ind++);
    writerec(whdr(T_CEPT, HDR2B), ind++);
    writerec(whdr(T_CEPT, UNDLN), ind++);


    /* Get T-ConnectionEndpoints */

    for (replies = 0; replies < cepts; ) {
	ManagedObjectS  mobj;

	if (M_WaitReq(msd[0], NOTOK, &mis) == NOTOK) {
	    m_term(msd[0]);
	    error(NULLCP, "M_WaitReq failed: reason = %s",
						mis.mi_preject.mr_data);
	}

	if (mis.mi_type != MI_GET_RES) {
	    if (mis.mi_type == MI_ERROR
			&& mis.mi_errtype == m_noSuchObjectInstance)
		replies++;	/* requested object died */
	    else		/* any other errors */
		advise(NULLCP, "error = %d occurred", mis.mi_errtype);
	    continue;
	}

	if ((mobj.cept = parseTConnectionEndpoint(mis.mi_getr.result.gr_attrs))
			== (T_ConnectionEndpointS *) NULL) {
	    m_term(msd[0]);
	    error(NULLCP, "parseTConnectionEndpoint failed");
	}

	dn_decode(mis.mi_getr.result.gr_inst.mn_dn);
	inst = dn2moid(mis.mi_getr.result.gr_inst.mn_dn);
	writerec(wfrec(T_CEPT, &mobj, inst), ind++);
	moid_free(inst);
	cfree(mobj.cept);
	mifree(&mis);

	replies++;
    }
}


int  process_evrep_host (EventReport)
struct MSAPeventrepv  *EventReport;
{
    struct event_rep_arg  *eventrep = &EventReport->args;
    OID  evtype = eventrep->ea_type.mid_global;
    ManagedObjectS  mobj;
    MO_ID * inst;
    int  pid, fd, ind;
    char buf[64];

    dn_decode(eventrep->ea_inst.mn_dn);
    inst = dn2moid(eventrep->ea_inst.mn_dn);
    if (oid_cmp(eventrep->ea_class.mid_global, str2oid("2.37.1.4")) == 0) {
	if (objinst2id(inst, T_EINV, NULLIP, &pid)
		== NOTOK) {
	    advise(NULLCP, "process_evrep_host: bad obj_inst");
	    return NOTOK;
	}

	if (oid_cmp(evtype, str2oid("2.37.2.9")) == 0) {
	    /* process tEinvCreation event report */

	    if (parse_Report_TEinvReport(eventrep->ea_info,
				1, NULLIP, NULLVP, &mobj.einv)
			== NOTOK) {
		advise(NULLCP, "parse_Report_TEinvReport failed");
		return NOTOK;
	    }

	    /* ignore any double tEinvCreation report */
	    if ((ind = find_rec(pid, GRP1)) == NOTOK) {
		ind = find_rec(NULL, NEW_GRP1);         /* should always
							   find this one */
		writerec(wfrec(T_EINV, &mobj, inst), ind);

	    }
	}
	else
	if (oid_cmp(evtype, str2oid("2.37.2.10")) == 0) {
	    /* process tEinvShutdown event report */

	    if ((ind = find_rec(pid, GRP1)) == NOTOK) {
		advise(NULLCP, "find_rec: einv with pid %d not found", pid);
		return NOTOK;
	    }

	    deleterec(ind);

	    /* delete any remaining cept recs for this einv */
	    while ((ind = find_rec(pid, GRP2)) != NOTOK)
		deleterec(ind);
	}
	else
	if (oid_cmp(evtype, str2oid("2.37.2.3")) == 0 ||
		oid_cmp(evtype, str2oid("2.37.2.4")) == 0 ||
		oid_cmp(evtype, str2oid("2.37.2.5")) == 0 ||
		oid_cmp(evtype, str2oid("2.37.2.6")) == 0 ||
		oid_cmp(evtype, str2oid("2.37.2.7")) == 0 ||
		oid_cmp(evtype, str2oid("2.37.2.8")) == 0) {
	    /* process einv counter threshold event report */

	    if (parse_Report_TEinvReport(eventrep->ea_info,
				1, NULLIP, NULLVP, &mobj.einv)
			== NOTOK) {
		advise(NULLCP, "parse_Report_TEinvReport failed");
		return NOTOK;
	    }

	    if ((ind = find_rec(pid, GRP1)) == NOTOK) {
		advise(NULLCP, "find_rec: einv with pid %d not found", pid);
		return NOTOK;
	    }
	    overwriterec(wfrec(T_EINV, &mobj, inst), ind);
	}
	else {
	    advise(NULLCP, "illegal event report: obj_class %s, type %s",
			strcpy(buf, sprintoid(eventrep->ea_class.mid_global)),
			strcpy(buf+32, sprintoid(evtype)));
	    return NOTOK;
	}
	free(mobj.einv);
    }
    else
    if (oid_cmp(eventrep->ea_class.mid_global, str2oid("2.37.1.5")) == 0) {
	if (objinst2id(inst, T_CEPT, NULLIP, &pid, &fd)
		== NOTOK) {
	    advise(NULLCP, "process_evrep_host: bad obj_inst");
	    return NOTOK;
	}

	if (oid_cmp(evtype, str2oid("2.37.2.14")) == 0) {
	    /* process tCeptCreation event report */

	    if (parse_Report_TCeptReport(eventrep->ea_info,
				1, NULLIP, NULLVP, &mobj.cept)
			== NOTOK) {
		advise(NULLCP, "parse_Report_TCeptReport failed");
		return NOTOK;
	    }

	    ind = find_rec(pid, NEW_GRP2);  /* should always find this one */
	    writerec(wfrec(T_CEPT, &mobj, inst), ind);

	    /* hack to modify parent einv record */
	    free(mobj.cept);
	    mobj.einv = Einv;
	    modifyrec(T_EINV, &mobj, eventrep);
	}
	else
	if (oid_cmp(evtype, str2oid("2.37.2.15")) == 0) {
	    /* process tCeptShutdown event report */

	    if (parse_Report_TCeptReport(eventrep->ea_info,
				1, NULLIP, NULLVP, &mobj.cept)
			== NOTOK) {
		advise(NULLCP, "parse_Report_TCeptReport failed");
		return NOTOK;
	    }

	    if ((ind = find_rec(pid, fd)) == NOTOK) {
		advise(NULLCP, "find_rec: cept with pid %d, fd %d not found",
							pid, fd);
		return NOTOK;
	    }
	    deleterec(ind);

	    /* hack to modify parent einv record */
	    free(mobj.cept);
	    mobj.einv = Einv;
	    modifyrec(T_EINV, &mobj, eventrep);
	}
	else
	if (oid_cmp(evtype, str2oid("2.37.2.11")) == 0 ||
		oid_cmp(evtype, str2oid("2.37.2.12")) == 0 ||
		oid_cmp(evtype, str2oid("2.37.2.13")) == 0) {
	    /* process cept counter threshold event report */

	    if (parse_Report_TCeptReport(eventrep->ea_info,
				1, NULLIP, NULLVP, &mobj.cept)
			== NOTOK) {
		advise(NULLCP, "parse_Report_TCeptReport failed");
		return NOTOK;
	    }

	    if ((ind = find_rec(pid, fd)) == NOTOK) {
		advise(NULLCP, "find_rec: cept with pid %d, fd %d not found",
							pid, fd);
		return NOTOK;
	    }
	    overwriterec(wfrec(T_CEPT, &mobj, inst), ind);
	    free(mobj.cept);
	}
	else {
	    advise(NULLCP, "illegal event report: obj_class %s, type %s",
			strcpy(buf, sprintoid(eventrep->ea_class.mid_global)),
			strcpy(buf+32, sprintoid(evtype)));
	    return NOTOK;
	}
	free(Einv);
    }
    else {
	advise(NULLCP, "illegal event report obj_class: %s",
				sprintoid(eventrep->ea_class.mid_global));
	moid_free(inst);
	return NOTOK;
    }
    moid_free(inst);
    return OK;
}

/* modifies the active connections gauge for a teinv record
 * when a connection appears or dies */

extern REC  temprecs[];

static int  modifyrec (mode, mobj, evrep)
int  mode;
ManagedObjectS  *mobj;
struct event_rep_arg  *evrep;
{
    OID  evtype = evrep->ea_type.mid_global;
    MO_ID * inst;
    int  pid, fd, ind;
    char buf[82];

    if (mode != T_EINV) {
	advise(NULLCP, "modifyrec: illegal mode %d", mode);
	return NOTOK;
    }

    if (oid_cmp(evtype, str2oid("2.37.2.15")) == 0 &&
				mobj->einv->activeConnections == 0)
	return OK;		/* don't be bothered to update einv rec
				   for the last cept shutdown event */

    inst = dn2moid(evrep->ea_inst.mn_dn);
    objinst2id(inst, T_CEPT, NULLIP, &pid, &fd);
    moid_free(inst);
    if ((ind = find_rec(pid, GRP1)) == NOTOK)
	return NOTOK;

    strcpy(buf, temprecs[ind].m_text);

    if ((temprecs[ind].m_text
			= (char *) malloc (temprecs[ind].m_len + 2))
		== (char *) NULL) {
	advise(NULLCP, "modifyrec: out of core");
	return NOTOK;
    }

    strcpy(temprecs[ind].m_text, buf);
    sprintf(buf, "%4d  |%4d%5d",
				mobj->einv->activeConnections,
				mobj->einv->crTPDUSuccessfulIn,
				mobj->einv->crTPDUSuccessfulOut);

    strncpy(temprecs[ind].m_text+22, buf, 16);
    return OK;
}