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 a

⟦db3b1a732⟧ TextFile

    Length: 6223 (0x184f)
    Types: TextFile
    Names: »aps.c«

Derivation

└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
    └─⟦697af93db⟧ »EurOpenD3/network/snmp/mit-snmp.tar.Z« 
        └─⟦57bbcbe75⟧ 
            └─⟦this⟧ »./snmp/aps.c« 
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
    └─⟦925ee6880⟧ »EurOpenD3/network/snmp/mit-snmp.900225.tar.Z« 
        └─⟦a4bfa469c⟧ 
            └─⟦this⟧ »./snmp/aps.c« 

TextFile


/*
 *	$Header: aps.c,v 1.1 89/01/11 22:08:17 jrd Exp $
 *	Author: J. Davin
 *	Copyright 1988, 1989, Massachusetts Institute of Technology
 *	See permission and disclaimer notice in file "notice.h"
 */

#include	<notice.h>

#include	<ctypes.h>
#include	<aps.h>
#include	<asn.h>
#include	<local.h>

#define		apsMaxNameSize		(16)
#define		apsVersionCode		(0)

typedef		struct			ApsSchemeTag {

		ApsNameType		apsSchemeName;
		ApsVerifyFnType		apsSchemeVerifyFn;
		ApsEncodeFnType		apsSchemeEncodeFn;
		ApsDecodeFnType		apsSchemeDecodeFn;
		struct	ApsSchemeTag	*apsSchemeNext;

		}			ApsSchemeType;

typedef		ApsSchemeType		*ApsSchemePtrType;

typedef		struct			ApsCommTag {

		ApsNameType		apsCommName;
		AsnIdType		apsCommAsn;
		ApsSchemePtrType	apsCommScheme;
		ApsGoodiesType		apsCommGoodies;
		CIntfType		apsCommRefCnt;
		struct	ApsCommTag	*apsCommNext;

		}			ApsCommType;

typedef		ApsCommType		*ApsCommPtrType;

#define		apsIdToPtr(x)		((ApsCommPtrType)((ApsIdType) (x)))
#define		apsPtrToId(x)		((ApsIdType) ((ApsCommPtrType) (x)))

static		AsnIdType		apsVersion;
static		ApsSchemePtrType	apsSchemes;
static		ApsCommPtrType		apsComms;

ApsStatusType		apsScheme (name, verifyFn, encodeFn, decodeFn)

ApsNameType		name;
ApsVerifyFnType		verifyFn;
ApsEncodeFnType		encodeFn;
ApsDecodeFnType		decodeFn;

{
	ApsSchemePtrType		sp;

	for (sp = apsSchemes; (sp != (ApsSchemePtrType) 0) &&
		strcmp ((char *) name, (char *) sp->apsSchemeName) != 0;
		sp = sp->apsSchemeNext);

	if (sp != (ApsSchemePtrType) 0) {
		return (errBad);
	}

	if ((sp = (ApsSchemePtrType) malloc ((unsigned) sizeof (*sp))) !=
		(ApsSchemePtrType) 0) {
		sp->apsSchemeName = name;
		sp->apsSchemeVerifyFn = verifyFn;
		sp->apsSchemeEncodeFn = encodeFn;
		sp->apsSchemeDecodeFn = decodeFn;
		sp->apsSchemeNext = apsSchemes;
		apsSchemes = sp;
		return (errOk);
	}
	else {
		return (errBad);
	}
}

ApsIdType		apsNew (name, scheme, goodies)

ApsNameType		name;
ApsNameType		scheme;
ApsGoodiesType		goodies;

{
	ApsSchemePtrType		sp;
	AsnIdType			asn;
	ApsCommPtrType			ap;

	if (strlen ((char *) name) > apsMaxNameSize) {
		return ((ApsIdType) 0);
	}

	for (sp = apsSchemes; (sp != (ApsSchemePtrType) 0) &&
		strcmp ((char *) scheme, (char *) sp->apsSchemeName) != 0;
		sp = sp->apsSchemeNext);

	if (sp == (ApsSchemePtrType) 0) {
		return ((ApsIdType) 0);
	}

	for (ap = apsComms; (ap != (ApsCommPtrType) 0) &&
		strcmp ((char *) name, (char *) ap->apsCommName) != 0;
		ap = ap->apsCommNext);

	if (ap != (ApsCommPtrType) 0) {
		return ((ApsIdType) 0);
	}

	asn = asnOctetString (asnClassUniversal, (AsnTagType) 4,
		(CBytePtrType) name,
		(AsnLengthType) strlen ((char *) name));
	if (asn == (AsnIdType) 0) {
		return ((ApsIdType) 0);
	}

	if ((ap = (ApsCommPtrType) malloc ((unsigned) sizeof (*ap))) !=
		(ApsCommPtrType) 0) {
		ap->apsCommName = name;
		ap->apsCommScheme = sp;
		ap->apsCommGoodies = goodies;
		ap->apsCommAsn = asn;
		ap->apsCommRefCnt = (CIntfType) 1;
		ap->apsCommNext = apsComms;
		apsComms = ap;
	}
	else {
		asn = asnFree (asn);
	}
	return (apsPtrToId (ap));
}

ApsIdType		apsFree (s)

ApsIdType		s;

{
	ApsCommPtrType			ap;
	ApsCommPtrType			sp;
	ApsCommPtrType			pp;

	if (s == (ApsIdType) 0) {
		return ((ApsIdType) 0);
	}

	sp = apsIdToPtr (s);
	if (--sp->apsCommRefCnt != 0) {
		return ((ApsIdType) 0);
	}

	for (ap = apsComms; (ap != (ApsCommPtrType) 0) && (sp != ap);
		ap = ap->apsCommNext) {
		pp = ap;
	}

	if (ap != (ApsCommPtrType) 0) {
		if (ap == apsComms) {
			apsComms = ap->apsCommNext;
		}
		else {
			pp->apsCommNext = ap->apsCommNext;
		}
		ap->apsCommAsn = asnFree (ap->apsCommAsn);
		(void) free ((char *) ap);
	}

	return ((ApsIdType) 0);
}

ApsIdType		apsVerify (asn)

AsnIdType		asn;

{
	ApsCommPtrType			ap;
	CByteType			name [ (apsMaxNameSize + 1) ];
	AsnLengthType			n;
	AsnIdType			asnVer;
	AsnIdType			asnName;

	asnVer  = asnComponent (asn, (AsnIndexType) 1);
	if (asnVer == (AsnIdType) 0) {
		return ((ApsIdType) 0);
	}

	n = asnLength (asnVer);
	if ((n != (AsnLengthType) 1) ||
		(asnNumber (asnValue (asnVer), n) !=
		(AsnNumberType) apsVersionCode)) {
		return ((ApsIdType) 0);
	}
	asnVer = asnFree (asnVer);

	asnName  = asnComponent (asn, (AsnIndexType) 2);
	if (asnName == (AsnIdType) 0) {
		return ((ApsIdType) 0);
	}

	n = asnContents (asnName, name, (AsnLengthType) apsMaxNameSize);
	asnName = asnFree (asnName);
	if (n < (AsnLengthType) 0) {
		return ((ApsIdType) 0);
	}
	name [ (int) n ] = (CByteType) 0;

	for (ap = apsComms; (ap != (ApsCommPtrType) 0) &&
		strcmp ((char *) name, (char *) ap->apsCommName) != 0;
		ap = ap->apsCommNext);

	if (ap != (ApsCommPtrType) 0) {
		if ((*((ap->apsCommScheme)->apsSchemeVerifyFn))
			(ap->apsCommGoodies, asn)) {
			ap->apsCommRefCnt++;
			return (apsPtrToId (ap));
		}
		else {
			return ((ApsIdType) 0);
		}
	}
	else {
		return ((ApsIdType) 0);
	}
}

AsnIdType		apsDecode (aps, asn)

ApsIdType		aps;
AsnIdType		asn;

{
	ApsCommPtrType		ap;

	if (aps == (ApsIdType) 0) {
		return ((AsnIdType) 0);
	}
	ap = apsIdToPtr (aps);

	return ((*((ap->apsCommScheme)->apsSchemeDecodeFn))
		(ap->apsCommGoodies, asn));
}

AsnIdType		apsEncode (aps, asn)

ApsIdType		aps;
AsnIdType		asn;

{
	AsnIdType		result;
	ApsCommPtrType		ap;
	AsnIdType		code;

	if (aps == (ApsIdType) 0) {
		return ((AsnIdType) 0);
	}
	ap = apsIdToPtr (aps);

	if (apsVersion == (AsnIdType) 0) {
		apsVersion = asnIntl (asnClassUniversal,
			(AsnTagType) 2, (CIntlType) apsVersionCode);
		if (apsVersion == (AsnIdType) 0) {
			return ((AsnIdType) 0);
		}
	}

	code = (*((ap->apsCommScheme)->apsSchemeEncodeFn))
		(ap->apsCommGoodies, asn);
	if (code == (AsnIdType) 0) {
		return ((AsnIdType) 0);
	}

        if ((result = asnSequence (asnClassUniversal, (AsnTagType) 0x10,
                asnTypeSequence)) == (AsnIdType) 0) {
        }
	else if (asnAppend (result, apsVersion) != asnStatusOk) {
		result = asnFree (result);
	}
	else if (asnAppend (result, ap->apsCommAsn) != asnStatusOk) {
		result = asnFree (result);
	}
	else if (asnAppend (result, code) != asnStatusOk) {
		result = asnFree (result);
	}

	code = asnFree (code);
	return (result);
}

CVoidType		apsInit ()

{
	apsVersion = (AsnIdType) 0;
	apsSchemes = (ApsSchemePtrType) 0;
	apsComms = (ApsCommPtrType) 0;
}