|
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 s
Length: 24604 (0x601c) Types: TextFile Names: »smp.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦925ee6880⟧ »EurOpenD3/network/snmp/mit-snmp.900225.tar.Z« └─⟦a4bfa469c⟧ └─⟦this⟧ »./snmp/smp.c«
/* * $Header: smp.c,v 1.3 89/05/31 19:22:53 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 <local.h> #include <debug.h> #include <smp.h> #include <mix.h> #include <avl.h> #include <mis.h> #include <aps.h> #include <asn.h> typedef struct SmpRecTag { SmpHandlerType smpRecUpCall; SmpSendFnType smpRecSendFn; SmpSocketType smpRecPeer; AsnIdType smpRecAsn; SmpStatusType smpRecStatus; } SmpRecType; typedef SmpRecType *SmpRecPtrType; #define smpIdToPtr(x) ((SmpRecPtrType)((SmpIdType)(x))) #define smpPtrToId(x) ((SmpIdType)((SmpRecPtrType)(x))) #define smpMaxBindSize (20) #ifndef SERVER static SmpKindType smpUniversalVector [] = { smpKindNone, smpKindNone, smpKindInteger, smpKindNone, smpKindOctetString, smpKindNull, smpKindObjectId }; static SmpKindType smpApplicationVector [] = { smpKindIPAddr, smpKindCounter, smpKindGuage, smpKindTimeTicks, smpKindOpaque }; #define smpAsnToKind(asn) \ ((asnClass ((asn)) == asnClassUniversal) ? \ smpUniversalVector [ (int) asnTag ((asn)) ] : \ smpApplicationVector [ (int) asnTag ((asn)) ]) #endif /* SERVER */ static AsnTagType smpTagVector [] = { (AsnTagType) -1, /* smpKindNone */ (AsnTagType) 2, (AsnTagType) 4, (AsnTagType) 0, (AsnTagType) 4, (AsnTagType) 1, (AsnTagType) 2, (AsnTagType) 3, (AsnTagType) 6, (AsnTagType) 5 }; static AsnClassType smpClassVector [] = { asnClassPrivate, /* smpKindNone */ asnClassUniversal, asnClassUniversal, asnClassApplication, asnClassApplication, asnClassApplication, asnClassApplication, asnClassApplication, asnClassUniversal, asnClassUniversal }; #define smpKindToTag(kind) \ (smpTagVector [ (int) (kind) ]) #define smpKindToClass(kind) \ (smpClassVector [ (int) (kind) ]) #define smpAsnToCmd(tag) \ ((SmpCommandType) (tag)) CVoidType smpInit () { } SmpIdType smpNew (peer, sendFn, upcall) SmpSocketType peer; SmpSendFnType sendFn; SmpHandlerType upcall; { SmpRecPtrType sp; sp = (SmpRecPtrType) malloc ((unsigned) sizeof (*sp)); if (sp != (SmpRecPtrType) 0) { (void) bzero ((char *) sp, (int) sizeof (*sp)); sp->smpRecPeer = peer; sp->smpRecSendFn = sendFn; sp->smpRecUpCall = upcall; sp->smpRecAsn = (AsnIdType) 0; } return (smpPtrToId (sp)); } SmpIdType smpFree (smp) SmpIdType smp; { SmpRecPtrType sp; if (smp != (SmpIdType) 0) { sp = smpIdToPtr (smp); sp->smpRecAsn = asnFree (sp->smpRecAsn); (void) free ((char *) sp); } return ((SmpIdType) 0); } static SmpStatusType smpSend (smp, aps, asn) SmpIdType smp; ApsIdType aps; AsnIdType asn; { AsnLengthType n; AsnIdType msg; SmpRecPtrType sp; CByteType buffer [ 2048 ]; SmpStatusType status; DEBUG0 ("smpSend:\n"); msg = apsEncode (aps, asn); if (msg == (AsnIdType) 0) { return (errBad); } DEBUGASN (msg); DEBUG0 ("\n"); n = asnEncode (msg, buffer, (AsnLengthType) 2048); DEBUGBYTES (buffer, n); DEBUG0 ("\n"); sp = smpIdToPtr (smp); status = (*sp->smpRecSendFn) (sp->smpRecPeer, buffer, (CIntfType) n); msg = asnFree (msg); return (status); } static AsnStatusType smpSishKabob (skewer, class, tag, value) AsnIdType skewer; AsnClassType class; AsnTagType tag; CUnslType value; { AsnStatusType status; AsnIdType item; if ((item = asnUnsl (class, tag, value)) == (AsnIdType) 0) { return (asnStatusBad); } status = asnAppend (skewer, item); item = asnFree (item); return (status); } static AsnIdType smpBuildBind2 (name, value) AsnIdType name; AsnIdType value; { AsnIdType seq; if ((seq = asnSequence (asnClassUniversal, (AsnTagType) 0x10, asnTypeSequence)) != (AsnIdType) 0) { if (asnAppend (seq, name) != asnStatusOk) { seq = asnFree (seq); } else if (asnAppend (seq, value) != asnStatusOk) { seq = asnFree (seq); } } return (seq); } static AsnIdType smpBuildBind1 (name, namelen, value) CBytePtrType name; AsnLengthType namelen; AsnIdType value; { AsnIdType oid; AsnIdType result; if ((oid = asnObjectId (asnClassUniversal, (AsnTagType) 6, name, namelen)) != (AsnIdType) 0) { result = smpBuildBind2 (oid, value); oid = asnFree (oid); return (result); } else { return (oid); } } static AsnIdType smpBuildValue (list) SmpBindPtrType list; { AsnIdType result; if (list == (SmpBindPtrType) 0) { result = (AsnIdType) 0; } else { switch (list->smpBindKind) { case smpKindInteger: result = asnIntl (asnClassUniversal, (AsnTagType) 2, (CIntlType) list->smpBindNumber); break; case smpKindGuage: case smpKindCounter: case smpKindTimeTicks: result = asnUnsl (asnClassApplication, smpKindToTag (list->smpBindKind), list->smpBindNumber); break; case smpKindOctetString: case smpKindOpaque: case smpKindNull: result = asnOctetString ( smpKindToClass (list->smpBindKind), smpKindToTag (list->smpBindKind), (CBytePtrType) list->smpBindValue, (AsnLengthType) list->smpBindValueLen); break; case smpKindIPAddr: if (list->smpBindValueLen != (SmpLengthType) 4) { result = (AsnIdType) 0; } else { result = asnOctetString (asnClassApplication, (AsnTagType) 0, (CBytePtrType) list->smpBindValue, (AsnLengthType) 4); } break; case smpKindObjectId: result = asnObjectId (asnClassUniversal, (AsnTagType) 6, (CBytePtrType) list->smpBindValue, (AsnLengthType) list->smpBindValueLen); break; default: result = (AsnIdType) 0; break; } } return (result); } static AsnIdType smpBuildBind0 (bind) SmpBindPtrType bind; { AsnIdType value; AsnIdType result; if ((value = smpBuildValue (bind)) != (AsnIdType) 0) { result = smpBuildBind1 ((CBytePtrType) bind->smpBindName, (AsnLengthType) bind->smpBindNameLen, value); value = asnFree (value); return (result); } else { return (value); } } static AsnIdType smpBuildMsg (tag, reqid, error, index, list) AsnTagType tag; AsnIdType reqid; SmpErrorType error; CUnsfType index; AsnIdType list; { AsnIdType result; if (reqid == (AsnIdType) 0) { result = (AsnIdType) 0; } else if ((result = asnSequence (asnClassContext, tag, asnTypeSequence)) == (AsnIdType) 0) { result = (AsnIdType) 0; } else if (asnAppend (result, reqid) != asnStatusOk) { result = asnFree (result); } else if (smpSishKabob (result, asnClassUniversal, (AsnTagType) 2, (CUnslType) error) != asnStatusOk) { result = asnFree (result); } else if (smpSishKabob (result, asnClassUniversal, (AsnTagType) 2, (CUnslType) index) != asnStatusOk) { result = asnFree (result); } else if (asnAppend (result, list) != asnStatusOk) { result = asnFree (result); } return (result); } #ifndef SERVER #endif /* SERVER */ #ifndef CLIENT #endif /* CLIENT */ #ifndef CLIENT static AsnIdType smpReply (asn0, error, index, asn1) AsnIdType asn0; SmpErrorType error; CUnsfType index; AsnIdType asn1; { AsnIdType result; AsnIdType reqid; AsnIdType seq; DEBUG0 ("smpReply:\n"); if (error == smpErrorNone) { index = (CUnsfType) 0; } if ((reqid = asnComponent (asn0, (AsnIndexType) 1)) == (AsnIdType) 0) { result = (AsnIdType) 0; } else if (error == smpErrorNone) { result = smpBuildMsg ((AsnTagType) 2, reqid, error, index, asn1); reqid = asnFree (reqid); } else if ((seq = asnComponent (asn0, (AsnIndexType) 4)) == (AsnIdType) 0) { result = (AsnIdType) 0; reqid = asnFree (reqid); } else { result = smpBuildMsg ((AsnTagType) 2, reqid, error, index, seq); reqid = asnFree (reqid); seq = asnFree (seq); } return (result); } #endif /* CLIENT */ #ifndef SERVER static SmpIndexType smpCrackList (seq, result, n) AsnIdType seq; SmpBindPtrType result; SmpIndexType n; { SmpIndexType count; AsnIdType bind; AsnIdType name; AsnIdType value; AsnIndexType sons; AsnIndexType component; sons = asnSons (seq); count = (SmpIndexType) 0; bind = (AsnIdType) 0; for (component = 1; (component <= sons) && (count < n); bind = asnFree (bind)) { bind = asnComponent (seq, component); name = asnComponent (bind, (AsnIndexType) 1); result->smpBindName = asnValue (name); result->smpBindNameLen = asnLength (name); name = asnFree (name); value = asnComponent (bind, (AsnIndexType) 2); result->smpBindKind = smpAsnToKind (value); /* support only primitive encodings */ result->smpBindValue = (SmpValueType) asnValue (value); result->smpBindValueLen = (SmpLengthType) asnLength (value); switch (result->smpBindKind) { case smpKindInteger: case smpKindCounter: case smpKindGuage: case smpKindTimeTicks: result->smpBindNumber = (SmpNumberType) asnNumber ( (CBytePtrType) result->smpBindValue, (AsnLengthType) result->smpBindValueLen); break; default: result->smpBindNumber = (SmpNumberType) 0; break; } value = asnFree (value); count++; result++; component += (asnSons (bind) + 1); } return (count); } static SmpStatusType smpRspOp (smp, aps, asn) SmpIdType smp; ApsIdType aps; AsnIdType asn; { SmpRequestType p; SmpBindType bindvec [ smpMaxBindSize ]; AsnIdType seq; AsnIdType value; (void) bzero ((char *) & p, sizeof (p)); p.smpRequestCmd = smpAsnToCmd (asnTag (asn)); value = asnComponent (asn, (AsnIndexType) 1); p.smpRequestId = (SmpSequenceType) asnNumber (asnValue (value), asnLength (value)); value = asnFree (value); value = asnComponent (asn, (AsnIndexType) 2); p.smpRequestError = (SmpErrorType) asnNumber (asnValue (value), asnLength (value)); value = asnFree (value); value = asnComponent (asn, (AsnIndexType) 3); p.smpRequestIndex = (SmpIndexType) asnNumber (asnValue (value), asnLength (value)); value = asnFree (value); seq = asnComponent (asn, (AsnIndexType) 4); p.smpRequestCount = smpCrackList (seq, bindvec, (SmpIndexType) smpMaxBindSize); seq = asnFree (seq); p.smpRequestBinds = bindvec; p.smpRequestCommunity = aps; return ((*((smpIdToPtr (smp))->smpRecUpCall)) (smp, & p)); } static SmpStatusType smpTrapOp (smp, aps, asn) SmpIdType smp; ApsIdType aps; AsnIdType asn; { SmpRequestType p; SmpBindType bindvec [ smpMaxBindSize ]; AsnIdType seq; AsnIdType value; (void) bzero ((char *) & p, sizeof (p)); p.smpRequestCmd = smpCommandTrap; value = asnComponent (asn, (AsnIndexType) 1); p.smpRequestEnterprise = (SmpValueType) asnValue (value); p.smpRequestEnterpriseLen = (SmpLengthType) asnLength (value); value = asnFree (value); value = asnComponent (asn, (AsnIndexType) 2); p.smpRequestAgent = (SmpValueType) asnValue (value); p.smpRequestAgentLen = (SmpLengthType) asnLength (value); value = asnFree (value); value = asnComponent (asn, (AsnIndexType) 3); p.smpRequestGenericTrap = (SmpTrapType) asnNumber (asnValue (value), asnLength (value)); value = asnFree (value); value = asnComponent (asn, (AsnIndexType) 4); p.smpRequestSpecificTrap = (SmpNumberType) asnNumber (asnValue (value), asnLength (value)); value = asnFree (value); value = asnComponent (asn, (AsnIndexType) 5); p.smpRequestTimeStamp = (SmpNumberType) asnNumber (asnValue (value), asnLength (value)); value = asnFree (value); seq = asnComponent (asn, (AsnIndexType) 6); p.smpRequestCount = smpCrackList (seq, bindvec, (SmpIndexType) smpMaxBindSize); seq = asnFree (seq); p.smpRequestBinds = bindvec; p.smpRequestCommunity = aps; return ((*((smpIdToPtr (smp))->smpRecUpCall)) (smp, & p)); } #else /* SERVER */ #define smpRspOp(smp, aps, asn) (errOk) #define smpTrapOp(smp, aps, asn) (errOk) #endif /* SERVER */ #ifndef CLIENT static SmpStatusType smpSetOp (smp, aps, asn) SmpIdType smp; ApsIdType aps; AsnIdType asn; { AsnIdType reply; AsnIdType name; AsnIdType bind; AsnIdType seq; AsnIdType val; AsnIdType save; AsnIndexType sons; CUnsfType index; CUnsfType count; AsnIndexType component; MixIdType mib; SmpErrorType error; SmpStatusType result; MixNamePtrType path; MixLengthType pathlen; MixNamePtrType names [ smpMaxBindSize ]; MixLengthType sizes [ smpMaxBindSize ]; AsnIdType values [ smpMaxBindSize ]; DEBUG0 ("smpSetOp\n"); DEBUG0 ("smpSetOp: asn:\n"); DEBUGASN (asn); seq = asnComponent (asn, (AsnIndexType) 4); DEBUG0 ("smpSetOp: seq:\n"); DEBUGASN (seq); sons = asnSons (seq); mib = misCommunityToMib (aps); index = (CUnsfType) 1; if (misCommunityToAccess (aps)) { error = smpErrorNone; reply = (AsnIdType) 0; name = (AsnIdType) 0; bind = (AsnIdType) 0; val = (AsnIdType) 0; count = (CUnsfType) 0; for (component = 1; (component <= sons) && (error == smpErrorNone) && (count < smpMaxBindSize); component += (asnSons (bind) + 1)) { bind = asnFree (bind); bind = asnComponent (seq, component); DEBUG0 ("smpSetOp: bind:\n"); DEBUGASN (bind); name = asnComponent (bind, (AsnIndexType) 1); DEBUG0 ("smpSetOp: name:\n"); DEBUGASN (name); path = (MixNamePtrType) asnValue (name); pathlen = (MixLengthType) asnLength (name); val = asnComponent (bind, (AsnIndexType) 2); if ((save = mixGet (mib, path, pathlen)) == (AsnIdType) 0) { error = smpErrorNoSuch; DEBUG0 ("smpSetOp 1\n"); } else if ((error = mixSet (mib, path, pathlen, val)) == smpErrorNone) { DEBUG0 ("smpSetOp 7\n"); name = asnFree (name); val = asnFree (val); values [ count ] = save; names [ count ] = path; sizes [ count ] = pathlen; index++; count++; } else { save = asnFree (save); } } name = asnFree (name); bind = asnFree (bind); val = asnFree (val); if ((error == smpErrorNone) && (count >= smpMaxBindSize)) { error = smpErrorTooBig; } while (count != 0) { count--; if (error != smpErrorNone) { (void) mixSet (mib, names [ count ], sizes [ count ], values [ count ]); } values [ count ] = asnFree (values [ count ]); } } else { error = smpErrorReadOnly; } DEBUG1 ("smpSetOp: error %d\n", error); if ((reply = smpReply (asn, error, index, seq)) != (AsnIdType) 0) { result = smpSend (smp, aps, reply); } else { result = errBad; } seq = asnFree (seq); reply = asnFree (reply); return (result); } static SmpStatusType smpNextOp (smp, aps, asn) SmpIdType smp; ApsIdType aps; AsnIdType asn; { AsnIdType reply; AsnIdType name; AsnIdType bind; AsnIdType seq; AsnIdType rval; AsnIdType rbind; AsnIdType rseq; AsnIndexType sons; CUnsfType index; AsnIndexType component; MixIdType mib; CByteType path [ mixMaxPathLen ]; MixLengthType pathlen; AsnLengthType namelen; SmpErrorType error; SmpStatusType result; DEBUG0 ("smpNextOp\n"); rseq = asnSequence (asnClassUniversal, (AsnTagType) 0x10, asnTypeSequenceOf); if (rseq == (AsnIdType) 0) { return (errBad); } DEBUG0 ("smpNextOp: asn:\n"); DEBUGASN (asn); seq = asnComponent (asn, (AsnIndexType) 4); DEBUG0 ("smpNextOp: seq:\n"); DEBUGASN (seq); sons = asnSons (seq); mib = misCommunityToMib (aps); error = smpErrorNone; reply = (AsnIdType) 0; name = (AsnIdType) 0; bind = (AsnIdType) 0; rval = (AsnIdType) 0; rbind = (AsnIdType) 0; index = 1; for (component = 1; (component <= sons) && (error == smpErrorNone); component += (asnSons (bind) + 1)) { bind = asnFree (bind); bind = asnComponent (seq, component); DEBUG0 ("smpNextOp: bind:\n"); DEBUGASN (bind); name = asnComponent (bind, (AsnIndexType) 1); DEBUG0 ("smpNextOp: name:\n"); DEBUGASN (name); namelen = asnContents (name, path, (AsnLengthType) mixMaxPathLen); pathlen = (MixLengthType) namelen; if (namelen < (AsnLengthType) 0) { error = smpErrorNoSuch; DEBUG0 ("smpNextOp 0\n"); } else if ((rval = mixNext (mib, (MixNamePtrType) path, & pathlen)) == (AsnIdType) 0) { DEBUG0 ("smpNextOp 1\n"); error = smpErrorNoSuch; } else if ((rbind = smpBuildBind1 (path, (AsnLengthType) pathlen, rval)) == (AsnIdType) 0) { DEBUG0 ("smpNextOp 2\n"); error = smpErrorTooBig; } else if (asnAppend (rseq, rbind) != asnStatusOk) { DEBUG0 ("smpNextOp 6\n"); error = smpErrorTooBig; } else { DEBUG0 ("smpNextOp 7\n"); name = asnFree (name); rval = asnFree (rval); rbind = asnFree (rbind); index++; } } DEBUG1 ("smpNextOp: error %d\n", error); DEBUG0 ("smpNextOp: rseq:\n"); DEBUGASN (rseq); name = asnFree (name); seq = asnFree (seq); bind = asnFree (bind); rval = asnFree (rval); rbind = asnFree (rbind); if ((reply = smpReply (asn, error, index, rseq)) != (AsnIdType) 0) { result = smpSend (smp, aps, reply); } else { result = errBad; } rseq = asnFree (rseq); reply = asnFree (reply); return (result); } static SmpStatusType smpGetOp (smp, aps, asn) SmpIdType smp; ApsIdType aps; AsnIdType asn; { AsnIdType reply; AsnIdType name; AsnIdType bind; AsnIdType seq; AsnIdType rval; AsnIdType rbind; AsnIdType rseq; AsnIndexType sons; CUnsfType index; AsnIndexType component; MixIdType mib; SmpErrorType error; SmpStatusType result; DEBUG0 ("smpGetOp\n"); rseq = asnSequence (asnClassUniversal, (AsnTagType) 0x10, asnTypeSequenceOf); if (rseq == (AsnIdType) 0) { return (errBad); } DEBUG0 ("smpGetOp: asn:\n"); DEBUGASN (asn); seq = asnComponent (asn, (AsnIndexType) 4); DEBUG0 ("smpGetOp: seq:\n"); DEBUGASN (seq); sons = asnSons (seq); mib = misCommunityToMib (aps); error = smpErrorNone; reply = (AsnIdType) 0; name = (AsnIdType) 0; bind = (AsnIdType) 0; rval = (AsnIdType) 0; rbind = (AsnIdType) 0; index = 1; for (component = 1; (component <= sons) && (error == smpErrorNone); component += (asnSons (bind) + 1)) { bind = asnFree (bind); bind = asnComponent (seq, component); DEBUG0 ("smpGetOp: bind:\n"); DEBUGASN (bind); name = asnComponent (bind, (AsnIndexType) 1); DEBUG0 ("smpGetOp: name:\n"); DEBUGASN (name); if ((rval = mixGet (mib, (MixNamePtrType) asnValue (name), (MixLengthType) asnLength (name))) == (AsnIdType) 0) { DEBUG0 ("smpGetOp 1\n"); error = smpErrorNoSuch; } else if ((rbind = smpBuildBind2 (name, rval)) == (AsnIdType) 0) { DEBUG0 ("smpGetOp 2\n"); error = smpErrorTooBig; } else if (asnAppend (rseq, rbind) != asnStatusOk) { DEBUG0 ("smpGetOp 6\n"); error = smpErrorTooBig; } else { DEBUG0 ("smpGetOp 7\n"); name = asnFree (name); rval = asnFree (rval); rbind = asnFree (rbind); index++; } } DEBUG1 ("smpGetOp: error %d\n", error); DEBUG0 ("smpGetOp: rseq:\n"); DEBUGASN (rseq); name = asnFree (name); seq = asnFree (seq); bind = asnFree (bind); rval = asnFree (rval); rbind = asnFree (rbind); if ((reply = smpReply (asn, error, index, rseq)) != (AsnIdType) 0) { result = smpSend (smp, aps, reply); } else { result = errBad; } rseq = asnFree (rseq); reply = asnFree (reply); return (result); } #else /* CLIENT */ #define smpSetOp(smp, aps, asn) (errOk) #define smpGetOp(smp, aps, asn) (errOk) #define smpNextOp(smp, aps, asn) (errOk) #endif /* CLIENT */ static SmpStatusType smpInputEvent (smp, x) SmpIdType smp; CByteType x; { AsnStatusType status; AsnIdType asn0; ApsIdType aps; SmpStatusType result; SmpRecPtrType sp; sp = smpIdToPtr (smp); status = asnDecode (sp->smpRecAsn, x); if (status == asnStatusOk) { return (errOk); } else if (status != asnStatusAccept) { return (errBad); } DEBUG0 ("smpInputEvent "); aps = apsVerify (sp->smpRecAsn); if (aps == (ApsIdType) 0) { DEBUG0 ("2\n"); return (errBad); } asn0 = apsDecode (aps, sp->smpRecAsn); if (asn0 == (AsnIdType) 0) { DEBUG0 ("3\n"); return (errBad); } DEBUGASN (asn0); sp->smpRecAsn = asnFree (sp->smpRecAsn); switch ((int) asnTag (asn0)) { case 0x00: result = smpGetOp (smp, aps, asn0); break; case 0x01: result = smpNextOp (smp, aps, asn0); break; case 0x02: result = smpRspOp (smp, aps, asn0); break; case 0x03: result = smpSetOp (smp, aps, asn0); break; case 0x04: result = smpTrapOp (smp, aps, asn0); break; default: result = errBad; break; } asn0 = asnFree (asn0); aps = apsFree (aps); DEBUG0 ("4\n"); return (result); } SmpStatusType smpInput (smp, x) SmpIdType smp; CByteType x; { SmpRecPtrType sp; if (smp == (SmpIdType) 0) { return (errBad); } sp = smpIdToPtr (smp); if (sp->smpRecStatus == errOk) { if (sp->smpRecAsn == (AsnIdType) 0) { sp->smpRecAsn = asnNew ((AsnLanguageType) 0); } sp->smpRecStatus = smpInputEvent (smp, x); } return (sp->smpRecStatus); } AsnIdType smpBuildList (list, count) SmpBindPtrType list; SmpIndexType count; { AsnIdType result; AsnIdType bind; AsnStatusType status; result = asnSequence (asnClassUniversal, (AsnTagType) 0x10, asnTypeSequence); if (result == (AsnIdType) 0) { return (result); } for (status = asnStatusOk; (status == asnStatusOk) && (count != 0); count--) { if ((bind = smpBuildBind0 (list)) == (AsnIdType) 0) { status = asnStatusBad; } else { status = asnAppend (result, bind); bind = asnFree (bind); } list++; } if (status != asnStatusOk) { result = asnFree (result); } return (result); } #ifndef SERVER static AsnIdType smpBuildReq (tag, req, list) AsnTagType tag; SmpRequestPtrType req; AsnIdType list; { AsnIdType result; AsnIdType reqid; if ((reqid = asnUnsl (asnClassUniversal, (AsnTagType) 2, (CUnslType) req->smpRequestId)) == (AsnIdType) 0) { result = (AsnIdType) 0; } else { result = smpBuildMsg (tag, reqid, req->smpRequestError, req->smpRequestIndex, list); reqid = asnFree (reqid); } return (result); } #else /* SERVER */ #define smpBuildReq(tag, req, list) ((AsnIdType) 0) #endif /* SERVER */ #ifndef CLIENT static AsnIdType smpBuildTrap (req, list) SmpRequestPtrType req; AsnIdType list; { AsnIdType result; AsnIdType value; if ((result = asnSequence (asnClassContext, (AsnTagType) 4, asnTypeSequence)) == (AsnIdType) 0) { return ((AsnIdType) 0); } if ((value = asnObjectId (asnClassUniversal, (AsnTagType) 6, (CBytePtrType) req->smpRequestEnterprise, (AsnLengthType) req->smpRequestEnterpriseLen)) == (AsnIdType) 0) { return (asnFree (result)); } if (asnAppend (result, value) != asnStatusOk) { value = asnFree (value); return (asnFree (result)); } value = asnFree (value); if ((value = asnOctetString (asnClassApplication, (AsnTagType) 0, (CBytePtrType) req->smpRequestAgent, (AsnLengthType) req->smpRequestAgentLen)) == (AsnIdType) 0) { return (asnFree (result)); } if (asnAppend (result, value) != asnStatusOk) { value = asnFree (value); return (asnFree (result)); } value = asnFree (value); if (smpSishKabob (result, asnClassUniversal, (AsnTagType) 2, (CUnslType) req->smpRequestGenericTrap) != asnStatusOk) { result = asnFree (result); } else if (smpSishKabob (result, asnClassUniversal, (AsnTagType) 2, (CUnslType) req->smpRequestSpecificTrap) != asnStatusOk) { result = asnFree (result); } else if (smpSishKabob (result, asnClassApplication, (AsnTagType) 3, (CUnslType) req->smpRequestTimeStamp) != asnStatusOk) { result = asnFree (result); } else if (asnAppend (result, list) != asnStatusOk) { result = asnFree (result); } return (result); } #else /* CLIENT */ #define smpBuildTrap(req, list) ((AsnIdType) 0) #endif /* CLIENT */ SmpStatusType smpRequest (smp, req) SmpIdType smp; SmpRequestPtrType req; { AsnIdType result; AsnIdType list; SmpStatusType status; DEBUG0 ("smpRequest:\n"); if (smp == (SmpIdType) 0) { return (errBad); } else if (req == (SmpRequestPtrType) 0) { return (errBad); } else if ((list = smpBuildList (req->smpRequestBinds, req->smpRequestCount)) == (AsnIdType) 0) { return (errBad); } else { switch (req->smpRequestCmd) { case smpCommandGet: result = smpBuildReq ((AsnTagType) 0, req, list); break; case smpCommandNext: result = smpBuildReq ((AsnTagType) 1, req, list); break; case smpCommandSet: result = smpBuildReq ((AsnTagType) 3, req, list); break; case smpCommandRsp: result = smpBuildReq ((AsnTagType) 2, req, list); break; case smpCommandTrap: result = smpBuildTrap (req, list); break; default: result = (AsnIdType) 0; break; } list = asnFree (list); DEBUG1 ("result: %08.08X\n", result); if (result == (AsnIdType) 0) { return (errBad); } else { status = smpSend (smp, req->smpRequestCommunity, result); result = asnFree (result); return (status); } } }