#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-snmp.c,v 1.40 2000-01-17 06:24:26 itojun Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-snmp.c,v 1.48 2001-04-23 19:29:21 fenner Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
#include <sys/time.h>
#include <ctype.h>
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
#include <stdio.h>
#include <string.h>
elem->form = form;
elem->class = class;
elem->id = id;
- if (vflag)
- printf("|%.2x", *p);
p++; len--; hdr = 1;
/* extended tag field */
if (id == ASN_ID_EXT) {
- for (id = 0; *p & ASN_BIT8 && len > 0; len--, hdr++, p++) {
- if (vflag)
- printf("|%.2x", *p);
+ for (id = 0; *p & ASN_BIT8 && len > 0; len--, hdr++, p++)
id = (id << 7) | (*p & ~ASN_BIT8);
- }
if (len == 0 && *p & ASN_BIT8) {
ifNotTruncated fputs("[Xtagfield?]", stdout);
return -1;
return -1;
}
elem->asnlen = *p;
- if (vflag)
- printf("|%.2x", *p);
p++; len--; hdr++;
if (elem->asnlen & ASN_BIT8) {
int noct = elem->asnlen % ASN_BIT8;
ifNotTruncated printf("[asnlen? %d<%d]", len, noct);
return -1;
}
- for (; noct-- > 0; len--, hdr++) {
- if (vflag)
- printf("|%.2x", *p);
+ for (; noct-- > 0; len--, hdr++)
elem->asnlen = (elem->asnlen << ASN_SHIFT8) | *p++;
- }
}
if (len < elem->asnlen) {
if (!truncated) {
switch (elem->type) {
case BE_OCTET:
- for (i = asnlen; i-- > 0; p++);
+ for (i = asnlen; i-- > 0; p++)
printf("_%.2x", *p);
break;
d = elem->data.uns64.high * 4294967296.0; /* 2^32 */
if (elem->data.uns64.high <= 0x1fffff) {
d += elem->data.uns64.low;
-#if 0 /*is looks illegal, but what is the intention???*/
+#if 0 /*is looks illegal, but what is the intention?*/
printf("%.f", d);
#else
printf("%f", d);
break;
}
d += (elem->data.uns64.low & 0xfffff000);
-#if 0 /*is looks illegal, but what is the intention???*/
+#if 0 /*is looks illegal, but what is the intention?*/
snprintf(first, sizeof(first), "%.f", d);
#else
snprintf(first, sizeof(first), "%f", d);
int be;
};
-struct smi2be smi2betab[] = {
+static struct smi2be smi2betab[] = {
{ SMI_BASETYPE_INTEGER32, BE_INT },
{ SMI_BASETYPE_OCTETSTRING, BE_STR },
{ SMI_BASETYPE_OCTETSTRING, BE_INETADDR },
};
static void smi_decode_oid(struct be *elem, unsigned int *oid,
- unsigned int *oidlen)
+ unsigned int oidsize, unsigned int *oidlen)
{
u_char *p = (u_char *)elem->data.raw;
u_int32_t asnlen = elem->asnlen;
*/
if (first < 0) {
first = 0;
- oid[(*oidlen)++] = o/OIDMUX;
+ if (*oidlen < oidsize) {
+ oid[(*oidlen)++] = o/OIDMUX;
+ }
o %= OIDMUX;
}
- oid[(*oidlen)++] = o;
+ if (*oidlen < oidsize) {
+ oid[(*oidlen)++] = o;
+ }
o = 0;
}
}
static int smi_check_a_range(SmiType *smiType, SmiRange *smiRange,
struct be *elem)
{
- int ok;
+ int ok = 1;
switch (smiType->basetype) {
case SMI_BASETYPE_OBJECTIDENTIFIER:
SmiRange *smiRange;
int ok = 1;
- for (smiRange = smiGetFirstRange(smiType->module, smiType->name);
+ for (smiRange = smiGetFirstRange(smiType);
smiRange;
smiRange = smiGetNextRange(smiRange)) {
ok = smi_check_a_range(smiType, smiRange, elem);
-
+
if (ok) {
- smiFreeRange(smiRange);
break;
}
}
- if (ok && smiType->parentmodule && smiType->parentname) {
+ if (ok) {
SmiType *parentType;
- parentType = smiGetType(smiType->parentmodule,
- smiType->parentname);
+ parentType = smiGetParentType(smiType);
if (parentType) {
ok = smi_check_range(parentType, elem);
- smiFreeType(parentType);
}
}
SmiNode *smiNode = NULL;
int i;
- smi_decode_oid(elem, oid, &oidlen);
+ smi_decode_oid(elem, oid, sizeof(oid)/sizeof(unsigned int), &oidlen);
smiNode = smiGetNodeByOID(oidlen, oid);
if (! smiNode) {
asn1_print(elem);
return NULL;
}
if (vflag) {
- fputs(smiNode->module, stdout);
+ fputs(smiGetNodeModule(smiNode)->name, stdout);
fputs("::", stdout);
}
fputs(smiNode->name, stdout);
return;
}
+ if (elem->type == BE_NOSUCHOBJECT
+ || elem->type == BE_NOSUCHINST
+ || elem->type == BE_ENDOFMIBVIEW) {
+ asn1_print(elem);
+ return;
+ }
+
if (NOTIFY_CLASS(pduid) && smiNode->access < SMI_ACCESS_NOTIFY) {
fputs("[notNotifyable]", stdout);
}
fputs("[noAccess]", stdout);
}
- if (! smi_check_type(smiNode->basetype, elem->type)) {
- fputs("[wrongType]", stdout);
- }
-
- smiType = smiGetType(smiNode->typemodule, smiNode->typename);
+ smiType = smiGetNodeType(smiNode);
if (! smiType) {
asn1_print(elem);
return;
}
+ if (! smi_check_type(smiType->basetype, elem->type)) {
+ fputs("[wrongType]", stdout);
+ }
+
if (! smi_check_range(smiType, elem)) {
fputs("[wrongLength]", stdout);
}
switch (elem->type) {
case BE_OID:
- if (smiNode->basetype == SMI_BASETYPE_BITS
- && smiNode->typemodule && smiNode->typename) {
+ if (smiType->basetype == SMI_BASETYPE_BITS) {
/* print bit labels */
} else {
- smi_decode_oid(elem, oid, &oidlen);
+ smi_decode_oid(elem, oid,
+ sizeof(oid)/sizeof(unsigned int),
+ &oidlen);
smiNode = smiGetNodeByOID(oidlen, oid);
if (smiNode) {
if (vflag) {
- fputs(smiNode->module, stdout);
+ fputs(smiGetNodeModule(smiNode)->name, stdout);
fputs("::", stdout);
}
fputs(smiNode->name, stdout);
break;
case BE_INT:
- if (smiNode->basetype == SMI_BASETYPE_ENUM
- && smiNode->typemodule && smiNode->typename) {
- for (nn = smiGetFirstNamedNumber(smiNode->typemodule,
- smiNode->typename);
+ if (smiType->basetype == SMI_BASETYPE_ENUM) {
+ for (nn = smiGetFirstNamedNumber(smiType);
nn;
nn = smiGetNextNamedNumber(nn)) {
if (nn->value.value.integer32
if (! done) {
asn1_print(elem);
}
-
- if (smiType) {
- smiFreeType(smiType);
- }
}
#endif
if (elem.type != BE_NULL) {
#ifdef LIBSMI
smi_print_value(smiNode, pduid, &elem);
- smiFreeNode(smiNode);
#else
asn1_print(&elem);
#endif
asn1_print(&elem);
return;
}
- /* ignore the reqId */
+ if (vflag)
+ printf("R=%d ", elem.data.integer);
length -= count;
np += count;
}
if (count < length)
printf("[%d extra after PDU]", length - count);
+ if (vflag) {
+ fputs("{ ", stdout);
+ }
asn1_print(&pdu);
+ fputs(" ", stdout);
/* descend into PDU */
length = pdu.asnlen;
np = (u_char *)pdu.data.raw;
snmppdu_print(pdu.id, np, length);
break;
}
+
+ if (vflag) {
+ fputs("} ", stdout);
+ }
}
/*
length = elem.asnlen;
np = (u_char *)elem.data.raw;
+ if (vflag) {
+ fputs("{ ", stdout);
+ }
+
/* msgID (INTEGER) */
if ((count = asn1_parse(np, length, &elem)) < 0)
return;
if (count < length)
printf("[%d extra after message SEQ]", length - count);
+ if (vflag) {
+ fputs("} ", stdout);
+ }
+
if (model == 3) {
if (vflag) {
- fputs("USM ", stdout);
+ fputs("{ USM ", stdout);
}
} else {
printf("[security model %d]", model);
if (model == 3) {
usm_print(elem.data.str, elem.asnlen);
+ if (vflag) {
+ fputs("} ", stdout);
+ }
}
if (vflag) {
- fputs("ScopedPDU ", stdout);
+ fputs("{ ScopedPDU ", stdout);
}
scopedpdu_print(np, length, 3);
+
+ if (vflag) {
+ fputs("} ", stdout);
+ }
}
/*
case SNMP_VERSION_2:
case SNMP_VERSION_3:
if (vflag)
- printf("%s ", SnmpVersion[elem.data.integer]);
+ printf("{ %s ", SnmpVersion[elem.data.integer]);
break;
default:
printf("[version = %d]", elem.data.integer);
printf("[version = %d]", elem.data.integer);
break;
}
+
+ if (vflag) {
+ fputs("} ", stdout);
+ }
}