|
|
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 a
Length: 6223 (0x184f)
Types: TextFile
Names: »aps.c«
└─⟦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«
/*
* $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;
}