|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* dump-sming.c --
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Operations to dump SMIng module information.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* See the file "COPYING" for information on usage and redistribution
|
|
Packit |
022b05 |
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* @(#) $Id: dump-sming.c 8090 2008-04-18 12:56:29Z strauss $
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <config.h>
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <stdlib.h>
|
|
Packit |
022b05 |
#include <stdio.h>
|
|
Packit |
022b05 |
#include <stdarg.h>
|
|
Packit |
022b05 |
#include <string.h>
|
|
Packit |
022b05 |
#include <ctype.h>
|
|
Packit |
022b05 |
#include <time.h>
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include "smi.h"
|
|
Packit |
022b05 |
#include "smidump.h"
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#define INDENT 2 /* indent factor */
|
|
Packit |
022b05 |
#define INDENTVALUE 20 /* column to start values, except multiline */
|
|
Packit |
022b05 |
#define INDENTTEXTS 4 /* column to start multiline texts */
|
|
Packit |
022b05 |
#define INDENTMAX 64 /* max column to fill, break lines otherwise */
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *excludeType[] = {
|
|
Packit |
022b05 |
"ObjectSyntax",
|
|
Packit |
022b05 |
"SimpleSyntax",
|
|
Packit |
022b05 |
"ApplicationSyntax",
|
|
Packit |
022b05 |
NULL };
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *convertType[] = {
|
|
Packit |
022b05 |
"INTEGER", "Integer32",
|
|
Packit |
022b05 |
"OCTET STRING", "OctetString",
|
|
Packit |
022b05 |
"OBJECT IDENTIFIER", "Pointer",
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
"Gauge", "Gauge32",
|
|
Packit |
022b05 |
"Counter", "Counter32",
|
|
Packit |
022b05 |
"NetworkAddress", "IpAddress", /* ??? */
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
NULL, NULL };
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *convertImport[] = {
|
|
Packit |
022b05 |
"SNMPv2-SMI", "MODULE-IDENTITY", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-SMI", "OBJECT-IDENTITY", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-SMI", "OBJECT-TYPE", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-SMI", "NOTIFICATION-TYPE", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-SMI", "ObjectName", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-SMI", "NotificationName", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-SMI", "ObjectSyntax", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-SMI", "SimpleSyntax", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-SMI", "Integer32", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-SMI", "Unsigned32", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-SMI", "ApplicationSyntax", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-SMI", "IpAddress", "IRTF-NMRG-SMING", "IpAddress",
|
|
Packit |
022b05 |
"SNMPv2-SMI", "Counter32", "IRTF-NMRG-SMING", "Counter32",
|
|
Packit |
022b05 |
"SNMPv2-SMI", "TimeTicks", "IRTF-NMRG-SMING", "TimeTicks",
|
|
Packit |
022b05 |
"SNMPv2-SMI", "Opaque", "IRTF-NMRG-SMING", "Opaque",
|
|
Packit |
022b05 |
"SNMPv2-SMI", "Counter64", "IRTF-NMRG-SMING", "Counter64",
|
|
Packit |
022b05 |
"SNMPv2-SMI", "Gauge32", "IRTF-NMRG-SMING", "Gauge32",
|
|
Packit |
022b05 |
"SNMPv2-SMI", "mib-2", "IRTF-NMRG-SMING-SNMP", "mib-2",
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
"SNMPv2-TC", "TimeStamp", "IRTF-NMRG-SMING", "TimeStamp",
|
|
Packit |
022b05 |
"SNMPv2-TC", "TimeInterval", "IRTF-NMRG-SMING", "TimeInterval",
|
|
Packit |
022b05 |
"SNMPv2-TC", "DateAndTime", "IRTF-NMRG-SMING", "DateAndTime",
|
|
Packit |
022b05 |
"SNMPv2-TC", "TruthValue", "IRTF-NMRG-SMING", "TruthValue",
|
|
Packit |
022b05 |
"SNMPv2-TC", "PhysAddress", "IRTF-NMRG-SMING", "PhysAddress",
|
|
Packit |
022b05 |
"SNMPv2-TC", "MacAddress", "IRTF-NMRG-SMING", "MacAddress",
|
|
Packit |
022b05 |
"SNMPv2-TC", "DisplayString", "IRTF-NMRG-SMING", "DisplayString255",
|
|
Packit |
022b05 |
"SNMPv2-TC", "TestAndIncr", "IRTF-NMRG-SMING-SNMP", "TestAndIncr",
|
|
Packit |
022b05 |
"SNMPv2-TC", "AutonomousType", "IRTF-NMRG-SMING-SNMP", "AutonomousType",
|
|
Packit |
022b05 |
"SNMPv2-TC", "VariablePointer", "IRTF-NMRG-SMING-SNMP", "VariablePointer",
|
|
Packit |
022b05 |
"SNMPv2-TC", "RowPointer", "IRTF-NMRG-SMING-SNMP", "RowPointer",
|
|
Packit |
022b05 |
"SNMPv2-TC", "RowStatus", "IRTF-NMRG-SMING-SNMP", "RowStatus",
|
|
Packit |
022b05 |
"SNMPv2-TC", "StorageType", "IRTF-NMRG-SMING-SNMP", "StorageType",
|
|
Packit |
022b05 |
"SNMPv2-TC", "TDomain", "IRTF-NMRG-SMING-SNMP", "TDomain",
|
|
Packit |
022b05 |
"SNMPv2-TC", "TAddress", "IRTF-NMRG-SMING-SNMP", "TAddress",
|
|
Packit |
022b05 |
"SNMPv2-SMI", NULL, "IRTF-NMRG-SMING", NULL,
|
|
Packit |
022b05 |
"SNMPv2-TC", "TEXTUAL-CONVENTION", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-TC", NULL, "IRTF-NMRG-SMING-TYPES", NULL,
|
|
Packit |
022b05 |
"SNMPv2-CONF", "OBJECT-GROUP", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-CONF", "NOTIFICATION-GROUP", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-CONF", "MODULE-COMPLIANCE", NULL, NULL,
|
|
Packit |
022b05 |
"SNMPv2-CONF", "AGENT-CAPABILITIES", NULL, NULL,
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
"RFC1155-SMI", "OBJECT-TYPE", NULL, NULL,
|
|
Packit |
022b05 |
"RFC1155-SMI", "ObjectName", NULL, NULL,
|
|
Packit |
022b05 |
"RFC1155-SMI", "ObjectSyntax", NULL, NULL,
|
|
Packit |
022b05 |
"RFC1155-SMI", "SimpleSyntax", NULL, NULL,
|
|
Packit |
022b05 |
"RFC1155-SMI", "ApplicationSyntax", NULL, NULL,
|
|
Packit |
022b05 |
"RFC1155-SMI", "Gauge", "IRTF-NMRG-SMING-TYPES", "Gauge32",
|
|
Packit |
022b05 |
"RFC1155-SMI", "Counter", "IRTF-NMRG-SMING-TYPES", "Counter32",
|
|
Packit |
022b05 |
"RFC1155-SMI", "TimeTicks", "IRTF-NMRG-SMING-TYPES", "TimeTicks",
|
|
Packit |
022b05 |
"RFC1155-SMI", "IpAddress", "IRTF-NMRG-SMING-TYPES", "IpAddress",
|
|
Packit |
022b05 |
"RFC1155-SMI", "NetworkAddress", NULL, NULL, /* ??? */
|
|
Packit |
022b05 |
"RFC1155-SMI", "Opaque", "IRTF-NMRG-SMING", "Opaque",
|
|
Packit |
022b05 |
"RFC1155-SMI", NULL, "IRTF-NMRG-SMING", NULL,
|
|
Packit |
022b05 |
"RFC1158-MIB", "DisplayString", "IRTF-NMRG-SMING", "DisplayString255",
|
|
Packit |
022b05 |
"RFC-1212", "OBJECT-TYPE", NULL, NULL,
|
|
Packit |
022b05 |
"RFC1213-MIB", "mib-2", "IRTF-NMRG-SMING-SNMP", "mib-2",
|
|
Packit |
022b05 |
"RFC1213-MIB", "system", "SNMPv2-MIB", "system",
|
|
Packit |
022b05 |
"RFC1213-MIB", "interfaces", "IF-MIB", "interfaces",
|
|
Packit |
022b05 |
/* "RFC1213-MIB", "at", "RFC1213-MIB", "at", */
|
|
Packit |
022b05 |
"RFC1213-MIB", "ip", "IP-MIB", "ip",
|
|
Packit |
022b05 |
"RFC1213-MIB", "icmp", "IP-MIB", "icmp",
|
|
Packit |
022b05 |
"RFC1213-MIB", "tcp", "TCP-MIB", "tcp",
|
|
Packit |
022b05 |
"RFC1213-MIB", "udp", "UDP-MIB", "udp",
|
|
Packit |
022b05 |
/* "RFC1213-MIB", "egp", "RFC1213-MIB", "egp", */
|
|
Packit |
022b05 |
"RFC1213-MIB", "transmission", "SNMPv2-SMI", "transmission",
|
|
Packit |
022b05 |
"RFC1213-MIB", "snmp", "SNMPv2-MIB", "snmp",
|
|
Packit |
022b05 |
"RFC1213-MIB", "sysDescr", "SNMPv2-MIB", "sysDescr",
|
|
Packit |
022b05 |
"RFC1213-MIB", "sysObjectID", "SNMPv2-MIB", "sysObjectID",
|
|
Packit |
022b05 |
"RFC1213-MIB", "sysUpTime", "SNMPv2-MIB", "sysUpTime",
|
|
Packit |
022b05 |
"RFC1213-MIB", "ifIndex", "IF-MIB", "ifIndex",
|
|
Packit |
022b05 |
/* TODO ...many more objects from RFC1213-MIB.. */
|
|
Packit |
022b05 |
"RFC1213-MIB", "DisplayString", "IRTF-NMRG-SMING", "DisplayString255",
|
|
Packit |
022b05 |
"RFC1213-MIB", "PhysAddress", "IRTF-NMRG-SMING", "PhysAddress",
|
|
Packit |
022b05 |
"RFC-1215", "TRAP-TYPE", NULL, NULL,
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* TODO: how to convert more SMIv1 information? */
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
NULL, NULL, NULL, NULL };
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int current_column = 0;
|
|
Packit |
022b05 |
static int silent = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Structure used to build a list of imported types.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typedef struct Import {
|
|
Packit |
022b05 |
char *module;
|
|
Packit |
022b05 |
char *name;
|
|
Packit |
022b05 |
struct Import *nextPtr;
|
|
Packit |
022b05 |
} Import;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static Import *importList = NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getStringStatus(SmiStatus status)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return
|
|
Packit |
022b05 |
(status == SMI_STATUS_CURRENT) ? "current" :
|
|
Packit |
022b05 |
(status == SMI_STATUS_DEPRECATED) ? "deprecated" :
|
|
Packit |
022b05 |
(status == SMI_STATUS_OBSOLETE) ? "obsolete" :
|
|
Packit |
022b05 |
(status == SMI_STATUS_MANDATORY) ? "current" :
|
|
Packit |
022b05 |
(status == SMI_STATUS_OPTIONAL) ? "current" :
|
|
Packit |
022b05 |
"<unknown>";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getAccessString(SmiAccess access)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return
|
|
Packit |
022b05 |
(access == SMI_ACCESS_NOT_ACCESSIBLE) ? "noaccess" :
|
|
Packit |
022b05 |
(access == SMI_ACCESS_NOTIFY) ? "notifyonly" :
|
|
Packit |
022b05 |
(access == SMI_ACCESS_READ_ONLY) ? "readonly" :
|
|
Packit |
022b05 |
(access == SMI_ACCESS_READ_WRITE) ? "readwrite" :
|
|
Packit |
022b05 |
"<unknown>";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getStringBasetype(SmiBasetype basetype)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return
|
|
Packit |
022b05 |
(basetype == SMI_BASETYPE_UNKNOWN) ? "<unknown>" :
|
|
Packit |
022b05 |
(basetype == SMI_BASETYPE_OCTETSTRING) ? "OctetString" :
|
|
Packit |
022b05 |
(basetype == SMI_BASETYPE_OBJECTIDENTIFIER) ? "ObjectIdentifier" :
|
|
Packit |
022b05 |
(basetype == SMI_BASETYPE_UNSIGNED32) ? "Unsigned32" :
|
|
Packit |
022b05 |
(basetype == SMI_BASETYPE_INTEGER32) ? "Integer32" :
|
|
Packit |
022b05 |
(basetype == SMI_BASETYPE_UNSIGNED64) ? "Unsigned64" :
|
|
Packit |
022b05 |
(basetype == SMI_BASETYPE_INTEGER64) ? "Integer64" :
|
|
Packit |
022b05 |
(basetype == SMI_BASETYPE_FLOAT32) ? "Float32" :
|
|
Packit |
022b05 |
(basetype == SMI_BASETYPE_FLOAT64) ? "Float64" :
|
|
Packit |
022b05 |
(basetype == SMI_BASETYPE_FLOAT128) ? "Float128" :
|
|
Packit |
022b05 |
(basetype == SMI_BASETYPE_ENUM) ? "Enumeration" :
|
|
Packit |
022b05 |
(basetype == SMI_BASETYPE_BITS) ? "Bits" :
|
|
Packit |
022b05 |
"<unknown>";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getStringTime(time_t t)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
static char s[27];
|
|
Packit |
022b05 |
struct tm *tm;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
tm = gmtime(&t);
|
|
Packit |
022b05 |
sprintf(s, "%04d-%02d-%02d %02d:%02d",
|
|
Packit |
022b05 |
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
|
|
Packit |
022b05 |
tm->tm_hour, tm->tm_min);
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getTypeString(SmiBasetype basetype, SmiType *smiType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
char *typeModule, *typeName;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typeName = smiType ? smiType->name : NULL;
|
|
Packit |
022b05 |
typeModule = smiType ? smiGetTypeModule(smiType)->name : NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!typeModule) && (typeName) &&
|
|
Packit |
022b05 |
(basetype != SMI_BASETYPE_ENUM) &&
|
|
Packit |
022b05 |
(basetype != SMI_BASETYPE_BITS)) {
|
|
Packit |
022b05 |
for(i=0; convertType[i]; i += 2) {
|
|
Packit |
022b05 |
if (!strcmp(typeName, convertType[i])) {
|
|
Packit |
022b05 |
return convertType[i+1];
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!typeModule) || (!strlen(typeModule)) || (!typeName)) {
|
|
Packit |
022b05 |
if (basetype == SMI_BASETYPE_ENUM) {
|
|
Packit |
022b05 |
return "Enumeration";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (basetype == SMI_BASETYPE_BITS) {
|
|
Packit |
022b05 |
return "Bits";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!typeName) {
|
|
Packit |
022b05 |
return getStringBasetype(basetype);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* TODO: fully qualified if unambigous */
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return typeName;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getOidString(SmiNode *smiNode, int importedParent)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *parentNode;
|
|
Packit |
022b05 |
SmiModule *smiModule;
|
|
Packit |
022b05 |
static char s[200];
|
|
Packit |
022b05 |
char append[200];
|
|
Packit |
022b05 |
unsigned int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
append[0] = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
parentNode = smiNode;
|
|
Packit |
022b05 |
smiModule = smiGetNodeModule(smiNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
do {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (parentNode->oidlen <= 1) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* prepend the cut-off subidentifier to `append'. */
|
|
Packit |
022b05 |
strcpy(s, append);
|
|
Packit |
022b05 |
sprintf(append, ".%u%s", parentNode->oid[parentNode->oidlen-1], s);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* retrieve the parent SmiNode */
|
|
Packit |
022b05 |
parentNode = smiGetParentNode(parentNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!parentNode) {
|
|
Packit |
022b05 |
sprintf(s, "%s", append);
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* found an imported or a local parent node? */
|
|
Packit |
022b05 |
if ((parentNode->name && strlen(parentNode->name)) &&
|
|
Packit |
022b05 |
(smiIsImported(smiModule, NULL, parentNode->name) ||
|
|
Packit |
022b05 |
(!importedParent &&
|
|
Packit |
022b05 |
(smiGetNodeModule(parentNode) == smiModule)) ||
|
|
Packit |
022b05 |
(parentNode->oidlen == 1))) {
|
|
Packit |
022b05 |
sprintf(s, "%s%s", parentNode->name, append);
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
} while (parentNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
s[0] = 0;
|
|
Packit |
022b05 |
for (i=0; i < smiNode->oidlen; i++) {
|
|
Packit |
022b05 |
if (i) strcat(s, ".");
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "%u", smiNode->oid[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static Import* addImport(char *module, char *name)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Import **import, *newImport;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0; convertImport[i]; i += 4) {
|
|
Packit |
022b05 |
if (convertImport[i] && convertImport[i+1]
|
|
Packit |
022b05 |
&& !strcmp(module, convertImport[i])
|
|
Packit |
022b05 |
&& !strcmp(name, convertImport[i+1])) {
|
|
Packit |
022b05 |
module = convertImport[i+2];
|
|
Packit |
022b05 |
name = convertImport[i+3];
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
} else if (convertImport[i] && !convertImport[i+1]
|
|
Packit |
022b05 |
&& !strcmp(module, convertImport[i])) {
|
|
Packit |
022b05 |
module = convertImport[i+2];
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!module || !name) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (import = &importList; *import; import = &(*import)->nextPtr) {
|
|
Packit |
022b05 |
int c = strcmp((*import)->module, module);
|
|
Packit |
022b05 |
if (c < 0) continue;
|
|
Packit |
022b05 |
if (c == 0) {
|
|
Packit |
022b05 |
int d = strcmp((*import)->name, name);
|
|
Packit |
022b05 |
if (d < 0) continue;
|
|
Packit |
022b05 |
if (d == 0) return *import;
|
|
Packit |
022b05 |
if (d > 0) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (c > 0) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
newImport = xmalloc(sizeof(Import));
|
|
Packit |
022b05 |
newImport->module = module;
|
|
Packit |
022b05 |
newImport->name = name;
|
|
Packit |
022b05 |
newImport->nextPtr = *import;
|
|
Packit |
022b05 |
*import = newImport;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return *import;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void createImportList(SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
SmiModule *smiTypeModule;
|
|
Packit |
022b05 |
SmiNodekind kind = SMI_NODEKIND_SCALAR | SMI_NODEKIND_COLUMN;
|
|
Packit |
022b05 |
SmiImport *smiImport;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(smiModule, kind);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, kind)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiType = smiGetNodeType(smiNode);
|
|
Packit |
022b05 |
if (smiType && (smiType->decl == SMI_DECL_IMPLICIT_TYPE)) {
|
|
Packit |
022b05 |
smiType = smiGetParentType(smiType);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiType) {
|
|
Packit |
022b05 |
smiTypeModule = smiGetTypeModule(smiType);
|
|
Packit |
022b05 |
if (smiTypeModule &&
|
|
Packit |
022b05 |
strcmp(smiTypeModule->name, smiModule->name)) {
|
|
Packit |
022b05 |
if (strlen(smiTypeModule->name)) {
|
|
Packit |
022b05 |
addImport(smiTypeModule->name, smiType->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiType->basetype == SMI_BASETYPE_INTEGER32) {
|
|
Packit |
022b05 |
addImport("SNMPv2-SMI", "Integer32");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiImport = smiGetFirstImport(smiModule); smiImport;
|
|
Packit |
022b05 |
smiImport = smiGetNextImport(smiImport)) {
|
|
Packit |
022b05 |
if (islower((int) smiImport->name[0]) ||
|
|
Packit |
022b05 |
(smiImport->module && !strcmp(smiImport->module, "SNMPv2-SMI")) ||
|
|
Packit |
022b05 |
(smiImport->module && !strcmp(smiImport->module, "SNMPv2-TC"))) {
|
|
Packit |
022b05 |
addImport(smiImport->module, smiImport->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void freeImportList(void)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Import *import, *freeme;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (import = importList; import; ) {
|
|
Packit |
022b05 |
freeme = import;
|
|
Packit |
022b05 |
import = import->nextPtr;
|
|
Packit |
022b05 |
xfree(freeme);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
importList = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprint(FILE *f, char *fmt, ...)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
va_list ap;
|
|
Packit |
022b05 |
char s[200];
|
|
Packit |
022b05 |
char *p;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
va_start(ap, fmt);
|
|
Packit |
022b05 |
#ifdef HAVE_VSNPRINTF
|
|
Packit |
022b05 |
current_column += vsnprintf(s, sizeof(s), fmt, ap);
|
|
Packit |
022b05 |
#else
|
|
Packit |
022b05 |
current_column += vsprintf(s, fmt, ap); /* buffer overwrite */
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
va_end(ap);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fputs(s, f);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((p = strrchr(s, '\n'))) {
|
|
Packit |
022b05 |
current_column = strlen(p) - 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintSegment(FILE *f, int column, char *string, int length)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
fprint(f, "%*c%s", column, ' ', string);
|
|
Packit |
022b05 |
if (length) {
|
|
Packit |
022b05 |
fprint(f, "%*c", length - strlen(string) - column, ' ');
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintWrapped(FILE *f, int column, char *string)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if ((current_column + strlen(string)) > INDENTMAX) {
|
|
Packit |
022b05 |
putc('\n', f);
|
|
Packit |
022b05 |
current_column = 0;
|
|
Packit |
022b05 |
fprintSegment(f, column, "", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "%s", string);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintMultilineString(FILE *f, int column, const char *s)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i, len;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, column - 1 + INDENTTEXTS, "\"", 0);
|
|
Packit |
022b05 |
if (s) {
|
|
Packit |
022b05 |
len = strlen(s);
|
|
Packit |
022b05 |
for (i=0; i < len; i++) {
|
|
Packit |
022b05 |
putc(s[i], f);
|
|
Packit |
022b05 |
current_column++;
|
|
Packit |
022b05 |
if (s[i] == '\n') {
|
|
Packit |
022b05 |
current_column = 0;
|
|
Packit |
022b05 |
fprintSegment(f, column + INDENTTEXTS, "", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
putc('\"', f);
|
|
Packit |
022b05 |
current_column++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getValueString(SmiValue *valuePtr, SmiType *typePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
static char s[100];
|
|
Packit |
022b05 |
char ss[9];
|
|
Packit |
022b05 |
int n;
|
|
Packit |
022b05 |
unsigned int i;
|
|
Packit |
022b05 |
SmiNamedNumber *nn;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
s[0] = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (valuePtr->basetype) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED32:
|
|
Packit |
022b05 |
sprintf(s, "%lu", valuePtr->value.unsigned32);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER32:
|
|
Packit |
022b05 |
sprintf(s, "%ld", valuePtr->value.integer32);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED64:
|
|
Packit |
022b05 |
sprintf(s, UINT64_FORMAT, valuePtr->value.unsigned64);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER64:
|
|
Packit |
022b05 |
sprintf(s, INT64_FORMAT, valuePtr->value.integer64);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT32:
|
|
Packit |
022b05 |
sprintf(s, "%G", valuePtr->value.float32);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT64:
|
|
Packit |
022b05 |
sprintf(s, "%lG", valuePtr->value.float64);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT128:
|
|
Packit |
022b05 |
sprintf(s, "%LG", valuePtr->value.float128);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_ENUM:
|
|
Packit |
022b05 |
for (nn = smiGetFirstNamedNumber(typePtr); nn;
|
|
Packit |
022b05 |
nn = smiGetNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
if (nn->value.value.integer32 == valuePtr->value.integer32)
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (nn) {
|
|
Packit |
022b05 |
sprintf(s, "%s", nn->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
sprintf(s, "%ld", valuePtr->value.integer32);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OCTETSTRING:
|
|
Packit |
022b05 |
for (i = 0; i < valuePtr->len; i++) {
|
|
Packit |
022b05 |
if (!isprint((int)valuePtr->value.ptr[i])) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (i == valuePtr->len) {
|
|
Packit |
022b05 |
sprintf(s, "\"%s\"", valuePtr->value.ptr);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
sprintf(s, "0x%*s", 2 * valuePtr->len, "");
|
|
Packit |
022b05 |
for (i=0; i < valuePtr->len; i++) {
|
|
Packit |
022b05 |
sprintf(ss, "%02x", valuePtr->value.ptr[i]);
|
|
Packit |
022b05 |
strncpy(&s[2+2*i], ss, 2);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_BITS:
|
|
Packit |
022b05 |
sprintf(s, "(");
|
|
Packit |
022b05 |
for (i = 0, n = 0; i < valuePtr->len * 8; i++) {
|
|
Packit |
022b05 |
if (valuePtr->value.ptr[i/8] & (1 << (7-(i%8)))) {
|
|
Packit |
022b05 |
if (n)
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], ", ");
|
|
Packit |
022b05 |
n++;
|
|
Packit |
022b05 |
for (nn = smiGetFirstNamedNumber(typePtr); nn;
|
|
Packit |
022b05 |
nn = smiGetNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
/* if (nn->value.value.unsigned64 == ((i/8)*8 + (7-(i%8)))) */
|
|
Packit |
022b05 |
if (nn->value.value.unsigned64 == i)
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (nn) {
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "%s", nn->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "%d", i);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], ")");
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNKNOWN:
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OBJECTIDENTIFIER:
|
|
Packit |
022b05 |
/*nodePtr = smiGetNodeByOID(valuePtr->len, valuePtr->value.oid);
|
|
Packit |
022b05 |
if (nodePtr) {
|
|
Packit |
022b05 |
sprintf(s, "%s", nodePtr->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
strcpy(s, "");
|
|
Packit |
022b05 |
for (i=0; i < valuePtr->len; i++) {
|
|
Packit |
022b05 |
if (i) strcat(s, ".");
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "%u", valuePtr->value.oid[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}*/
|
|
Packit |
022b05 |
sprintf(s, "%s", typePtr->value.value.ptr);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_POINTER:
|
|
Packit |
022b05 |
/*nodePtr = smiGetNodeByOID(valuePtr->len, valuePtr->value.oid);
|
|
Packit |
022b05 |
if (nodePtr) {
|
|
Packit |
022b05 |
sprintf(s, "%s", nodePtr->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
strcpy(s, "");
|
|
Packit |
022b05 |
for (i=0; i < valuePtr->len; i++) {
|
|
Packit |
022b05 |
if (i) strcat(s, ".");
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "%u", valuePtr->value.oid[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}*/
|
|
Packit |
022b05 |
sprintf(s, "%s", valuePtr->value.ptr);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
sprintf(s, "%s", "");
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintSubtype(FILE *f, SmiType *smiType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiRange *range;
|
|
Packit |
022b05 |
SmiNamedNumber *nn;
|
|
Packit |
022b05 |
char s[100];
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiType->basetype == SMI_BASETYPE_ENUM) ||
|
|
Packit |
022b05 |
(smiType->basetype == SMI_BASETYPE_BITS)) {
|
|
Packit |
022b05 |
for(i = 0, nn = smiGetFirstNamedNumber(smiType);
|
|
Packit |
022b05 |
nn ; i++, nn = smiGetNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
fprint(f, ", ");
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprint(f, " (");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
sprintf(s, "%s(%s)", nn->name,
|
|
Packit |
022b05 |
getValueString(&nn->value, smiType));
|
|
Packit |
022b05 |
fprintWrapped(f, INDENTVALUE + INDENT, s);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
fprint(f, ")");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if(smiType->basetype == SMI_BASETYPE_POINTER) {
|
|
Packit |
022b05 |
nn = smiGetFirstNamedNumber(smiType);
|
|
Packit |
022b05 |
if(nn)
|
|
Packit |
022b05 |
fprint(f, " (%s)",nn->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
for(i = 0, range = smiGetFirstRange(smiType);
|
|
Packit |
022b05 |
range ; i++, range = smiGetNextRange(range)) {
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
fprint(f, " | ");
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprint(f, " (");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (memcmp(&range->minValue, &range->maxValue,
|
|
Packit |
022b05 |
sizeof(SmiValue))) {
|
|
Packit |
022b05 |
sprintf(s, "%s", getValueString(&range->minValue, smiType));
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "..%s",
|
|
Packit |
022b05 |
getValueString(&range->maxValue, smiType));
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
sprintf(s, "%s", getValueString(&range->minValue, smiType));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintWrapped(f, INDENTVALUE + INDENT, s);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
fprint(f, ")");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintAttributeSubtype(FILE *f, SmiAttribute *smiAttribute)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiRange *range;
|
|
Packit |
022b05 |
SmiNamedNumber *nn;
|
|
Packit |
022b05 |
char s[100];
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiAttribute->basetype == SMI_BASETYPE_ENUM) ||
|
|
Packit |
022b05 |
(smiAttribute->basetype == SMI_BASETYPE_BITS)) {
|
|
Packit |
022b05 |
for(i = 0, nn = smiGetAttributeFirstNamedNumber(smiAttribute);
|
|
Packit |
022b05 |
nn ; i++, nn = smiGetAttributeNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
fprint(f, ", ");
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprint(f, " (");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
sprintf(s, "%s(%s)", nn->name,
|
|
Packit |
022b05 |
getValueString(&nn->value, smiGetAttributeParentType(smiAttribute)));
|
|
Packit |
022b05 |
fprintWrapped(f, INDENTVALUE + INDENT, s);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
fprint(f, ")");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if(smiAttribute->basetype == SMI_BASETYPE_POINTER) {
|
|
Packit |
022b05 |
nn = smiGetAttributeFirstNamedNumber(smiAttribute);
|
|
Packit |
022b05 |
if(nn)
|
|
Packit |
022b05 |
fprint(f, " (%s)",nn->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
for(i = 0, range = smiGetAttributeFirstRange(smiAttribute);
|
|
Packit |
022b05 |
range ; i++, range = smiGetAttributeNextRange(range)) {
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
fprint(f, " | ");
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprint(f, " (");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (memcmp(&range->minValue, &range->maxValue,
|
|
Packit |
022b05 |
sizeof(SmiValue))) {
|
|
Packit |
022b05 |
sprintf(s, "%s", getValueString(&range->minValue, smiGetAttributeParentType(smiAttribute)));
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "..%s",
|
|
Packit |
022b05 |
getValueString(&range->maxValue, smiGetAttributeParentType(smiAttribute)));
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
sprintf(s, "%s", getValueString(&range->minValue, smiGetAttributeParentType(smiAttribute)));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintWrapped(f, INDENTVALUE + INDENT, s);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
fprint(f, ")");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintImports(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiImport *import;
|
|
Packit |
022b05 |
char *lastModuleName = NULL;
|
|
Packit |
022b05 |
int pos = 0, len, maxlen = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
createImportList(smiModule);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (import = smiGetFirstImport(smiModule); import; import = smiGetNextImport(import)) {
|
|
Packit |
022b05 |
len = strlen(import->module);
|
|
Packit |
022b05 |
maxlen = (len > maxlen) ? len : maxlen;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (import = smiGetFirstImport(smiModule); import; import = smiGetNextImport(import)) {
|
|
Packit |
022b05 |
int yaba = !lastModuleName || strcmp(import->module, lastModuleName);
|
|
Packit |
022b05 |
if (yaba) {
|
|
Packit |
022b05 |
if (lastModuleName) {
|
|
Packit |
022b05 |
fprint(f, ");\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "import %-*s (", maxlen, import->module);
|
|
Packit |
022b05 |
pos = INDENT + 12 + maxlen;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprint(f, ", ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
len = strlen(import->name);
|
|
Packit |
022b05 |
if (len + pos > INDENTMAX) {
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, " %-*s ", maxlen, "");
|
|
Packit |
022b05 |
pos = INDENT + 12 + maxlen;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "%s", import->name);
|
|
Packit |
022b05 |
pos += len;
|
|
Packit |
022b05 |
lastModuleName = import->module;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (lastModuleName) {
|
|
Packit |
022b05 |
fprintf(f, ");\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
freeImportList();
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintRevisions(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
SmiRevision *smiRevision;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(i = 0, smiRevision = smiGetFirstRevision(smiModule);
|
|
Packit |
022b05 |
smiRevision; smiRevision = smiGetNextRevision(smiRevision)) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "revision {\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "date", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\"%s\";\n", getStringTime(smiRevision->date));
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiRevision->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n", 0);
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintTypedefs(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i, j;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(i = 0, smiType = smiGetFirstType(smiModule);
|
|
Packit |
022b05 |
smiType; smiType = smiGetNextType(smiType)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!(strcmp(smiModule->name, "SNMPv2-SMI"))) ||
|
|
Packit |
022b05 |
(!(strcmp(smiModule->name, "RFC1155-SMI")))) {
|
|
Packit |
022b05 |
for(j=0; excludeType[j]; j++) {
|
|
Packit |
022b05 |
if (!strcmp(smiType->name, excludeType[j])) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (excludeType[j]) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!i && !silent) {
|
|
Packit |
022b05 |
fprint(f, "//\n// TYPE DEFINITIONS\n//\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "typedef %s {\n", smiType->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "type", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s", getTypeString(smiType->basetype,
|
|
Packit |
022b05 |
smiGetParentType(smiType)));
|
|
Packit |
022b05 |
fprintSubtype(f, smiType);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiType->value.basetype != SMI_BASETYPE_UNKNOWN) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "default", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s", getValueString(&smiType->value, smiType));
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiType->format) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "format", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\"%s\";\n", smiType->format);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiType->units) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "units", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\"%s\";\n", smiType->units);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if ((smiType->status != SMI_STATUS_UNKNOWN) &&
|
|
Packit |
022b05 |
(smiType->status != SMI_STATUS_MANDATORY) &&
|
|
Packit |
022b05 |
(smiType->status != SMI_STATUS_OPTIONAL)) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getStringStatus(smiType->status));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiType->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
if (smiType->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiType->reference);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintIdentities(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
SmiIdentity *smiIdentity;
|
|
Packit |
022b05 |
SmiIdentity *tmpIdentity;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(i = 0, smiIdentity = smiGetFirstIdentity(smiModule);
|
|
Packit |
022b05 |
smiIdentity; smiIdentity = smiGetNextIdentity(smiIdentity)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!i && !silent) {
|
|
Packit |
022b05 |
fprint(f, "//\n// IDENTITY DEFINITIONS\n//\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "identity %s {\n", smiIdentity->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
tmpIdentity = smiGetParentIdentity(smiIdentity);
|
|
Packit |
022b05 |
if (tmpIdentity) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "parent", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s", tmpIdentity->name);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiIdentity->status != SMI_STATUS_UNKNOWN) &&
|
|
Packit |
022b05 |
(smiIdentity->status != SMI_STATUS_MANDATORY) &&
|
|
Packit |
022b05 |
(smiIdentity->status != SMI_STATUS_OPTIONAL)) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getStringStatus(smiIdentity->status));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiIdentity->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
if (smiIdentity->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiIdentity->reference);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintExtensions(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
SmiMacro *smiMacro;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(i = 0, smiMacro = smiGetFirstMacro(smiModule);
|
|
Packit |
022b05 |
smiMacro; smiMacro = smiGetNextMacro(smiMacro)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!i && !silent) {
|
|
Packit |
022b05 |
fprint(f, "//\n// EXTENSION DEFINITIONS\n//\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "extension %s {\n", smiMacro->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiMacro->status != SMI_STATUS_UNKNOWN) &&
|
|
Packit |
022b05 |
(smiMacro->status != SMI_STATUS_MANDATORY) &&
|
|
Packit |
022b05 |
(smiMacro->status != SMI_STATUS_OPTIONAL)) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getStringStatus(smiMacro->status));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiMacro->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
if (smiMacro->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiMacro->reference);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if(smiMacro->abnf) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "abnf", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiMacro->abnf);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintUniqueStatement(FILE *f, SmiClass *smiClass)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiAttribute *attributePtr;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if(smiIsClassScalar(smiClass))
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "unique", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "();\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
attributePtr = smiGetFirstUniqueAttribute(smiClass);
|
|
Packit |
022b05 |
if (attributePtr) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "unique", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "(");
|
|
Packit |
022b05 |
for (i=0; attributePtr;
|
|
Packit |
022b05 |
attributePtr = smiGetNextUniqueAttribute(attributePtr))
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
fprint(f, ", %s",attributePtr->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprint(f, "%s",attributePtr->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, ");\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
static void fprintAttributes(FILE *f, SmiClass *smiClass)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
SmiAttribute *smiAttribute;
|
|
Packit |
022b05 |
SmiType *tmpType;
|
|
Packit |
022b05 |
SmiClass *tmpClass;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0, smiAttribute = smiGetFirstAttribute(smiClass);
|
|
Packit |
022b05 |
smiAttribute; smiAttribute = smiGetNextAttribute(smiAttribute)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "attribute %s {\n", smiAttribute->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
tmpType = smiGetAttributeParentType(smiAttribute);
|
|
Packit |
022b05 |
if (tmpType) {
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "type", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s ", tmpType->name);
|
|
Packit |
022b05 |
fprintAttributeSubtype(f, smiAttribute);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "access", INDENTVALUE);
|
|
Packit |
022b05 |
switch (smiAttribute->access) {
|
|
Packit |
022b05 |
case SMI_ACCESS_READ_ONLY:
|
|
Packit |
022b05 |
fprint(f, "readonly;\n");
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_ACCESS_READ_WRITE:
|
|
Packit |
022b05 |
fprint(f, "readwrite;\n");
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_ACCESS_EVENT_ONLY:
|
|
Packit |
022b05 |
fprint(f, "eventonly;\n");
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiAttribute->value.basetype != SMI_BASETYPE_UNKNOWN) {
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "default", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s", getValueString(&smiAttribute->value, smiGetAttributeParentType(smiAttribute)));
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiAttribute->format) {
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "format", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\"%s\";\n", smiAttribute->format);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiAttribute->units) {
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "units", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\"%s\";\n", smiAttribute->units);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
tmpClass = smiGetAttributeParentClass(smiAttribute);
|
|
Packit |
022b05 |
if (tmpClass) {
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "type", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", tmpClass->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiAttribute->status != SMI_STATUS_UNKNOWN) &&
|
|
Packit |
022b05 |
(smiAttribute->status != SMI_STATUS_MANDATORY) &&
|
|
Packit |
022b05 |
(smiAttribute->status != SMI_STATUS_OPTIONAL)) {
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "status", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getStringStatus(smiAttribute->status));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 3 * INDENT, smiAttribute->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
if (smiAttribute->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "reference", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 3 * INDENT, smiAttribute->reference);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintEvents(FILE *f, SmiClass *smiClass)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
SmiEvent *smiEvent;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(i = 0, smiEvent = smiGetFirstEvent(smiClass);
|
|
Packit |
022b05 |
smiEvent; smiEvent = smiGetNextEvent(smiEvent)) {
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
if (!i && !silent) {
|
|
Packit |
022b05 |
fprint(f,"\n");
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "// ATTRIBUTE DEFINITIONS\n\n",0);
|
|
Packit |
022b05 |
}*/
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "event %s {\n", smiEvent->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiEvent->status != SMI_STATUS_UNKNOWN) &&
|
|
Packit |
022b05 |
(smiEvent->status != SMI_STATUS_MANDATORY) &&
|
|
Packit |
022b05 |
(smiEvent->status != SMI_STATUS_OPTIONAL)) {
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "status", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getStringStatus(smiEvent->status));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 3 * INDENT, smiEvent->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
if (smiEvent->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "reference", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 3 * INDENT, smiEvent->reference);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintClasses(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
SmiClass *smiClass;
|
|
Packit |
022b05 |
SmiClass *tmpClass;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0, smiClass = smiGetFirstClass(smiModule);
|
|
Packit |
022b05 |
smiClass; smiClass = smiGetNextClass(smiClass)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!i && !silent) {
|
|
Packit |
022b05 |
fprint(f, "//\n// CLASS DEFINITIONS\n//\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "class %s {\n", smiClass->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
tmpClass = smiGetParentClass(smiClass);
|
|
Packit |
022b05 |
if (tmpClass) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "extends", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n\n", tmpClass->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintAttributes(f,smiClass);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintUniqueStatement(f,smiClass);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintEvents(f,smiClass);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiClass->status != SMI_STATUS_UNKNOWN) &&
|
|
Packit |
022b05 |
(smiClass->status != SMI_STATUS_MANDATORY) &&
|
|
Packit |
022b05 |
(smiClass->status != SMI_STATUS_OPTIONAL)) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getStringStatus(smiClass->status));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiClass->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
if (smiClass->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiClass->reference);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintObjects(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i, j;
|
|
Packit |
022b05 |
SmiNode *smiNode, *relatedNode;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
int indent = 0;
|
|
Packit |
022b05 |
int lastindent = -1;
|
|
Packit |
022b05 |
char *s = NULL;
|
|
Packit |
022b05 |
SmiNodekind nodekinds;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
nodekinds = SMI_NODEKIND_NODE | SMI_NODEKIND_TABLE |
|
|
Packit |
022b05 |
SMI_NODEKIND_ROW | SMI_NODEKIND_COLUMN | SMI_NODEKIND_SCALAR |
|
|
Packit |
022b05 |
SMI_NODEKIND_CAPABILITIES;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(i = 0, smiNode = smiGetFirstNode(smiModule, nodekinds);
|
|
Packit |
022b05 |
smiNode; smiNode = smiGetNextNode(smiNode, nodekinds)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->nodekind == SMI_NODEKIND_NODE) {
|
|
Packit |
022b05 |
indent = 0;
|
|
Packit |
022b05 |
s = "node";
|
|
Packit |
022b05 |
} else if (smiNode->nodekind == SMI_NODEKIND_CAPABILITIES) {
|
|
Packit |
022b05 |
indent = 0;
|
|
Packit |
022b05 |
s = "node";
|
|
Packit |
022b05 |
} else if (smiNode->nodekind == SMI_NODEKIND_TABLE) {
|
|
Packit |
022b05 |
indent = 0;
|
|
Packit |
022b05 |
s = "table";
|
|
Packit |
022b05 |
} else if (smiNode->nodekind == SMI_NODEKIND_ROW) {
|
|
Packit |
022b05 |
indent = 1;
|
|
Packit |
022b05 |
s = "row";
|
|
Packit |
022b05 |
} else if (smiNode->nodekind == SMI_NODEKIND_COLUMN) {
|
|
Packit |
022b05 |
indent = 2;
|
|
Packit |
022b05 |
s = "column";
|
|
Packit |
022b05 |
} else if (smiNode->nodekind == SMI_NODEKIND_SCALAR) {
|
|
Packit |
022b05 |
indent = 0;
|
|
Packit |
022b05 |
s = "scalar";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!i && !silent) {
|
|
Packit |
022b05 |
fprint(f, "//\n// OBJECT DEFINITIONS\n//\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (j = lastindent; j >= indent; j--) {
|
|
Packit |
022b05 |
fprintSegment(f, (1 + j) * INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "};\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
lastindent = indent;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->nodekind == SMI_NODEKIND_CAPABILITIES) {
|
|
Packit |
022b05 |
fprintSegment(f, (1 + indent) * INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "-- This has been an SMIv2 AGENT-CAPABILITIES node:\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, (1 + indent) * INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "%s %s {\n", s, smiNode->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->oid) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "oid", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getOidString(smiNode, 0));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiType = smiGetNodeType(smiNode);
|
|
Packit |
022b05 |
if (smiType && (smiType->basetype != SMI_BASETYPE_UNKNOWN)) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "type", INDENTVALUE);
|
|
Packit |
022b05 |
if (!smiType->name) {
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* an implicitly restricted type.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
fprint(f, "%s", getTypeString(smiType->basetype,
|
|
Packit |
022b05 |
smiGetParentType(smiType)));
|
|
Packit |
022b05 |
fprintSubtype(f, smiType);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprint(f, "%s;\n",
|
|
Packit |
022b05 |
getTypeString(smiType->basetype, smiType));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiNode->nodekind != SMI_NODEKIND_TABLE) &&
|
|
Packit |
022b05 |
(smiNode->nodekind != SMI_NODEKIND_ROW) &&
|
|
Packit |
022b05 |
(smiNode->nodekind != SMI_NODEKIND_CAPABILITIES) &&
|
|
Packit |
022b05 |
(smiNode->nodekind != SMI_NODEKIND_NODE)) {
|
|
Packit |
022b05 |
if (smiNode->access != SMI_ACCESS_UNKNOWN) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "access", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getAccessString(smiNode->access));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
relatedNode = smiGetRelatedNode(smiNode);
|
|
Packit |
022b05 |
switch (smiNode->indexkind) {
|
|
Packit |
022b05 |
case SMI_INDEX_INDEX:
|
|
Packit |
022b05 |
if (smiNode->implied) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "index implied",
|
|
Packit |
022b05 |
INDENTVALUE);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "index", INDENTVALUE);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "(");
|
|
Packit |
022b05 |
for (j = 0, smiElement = smiGetFirstElement(smiNode); smiElement;
|
|
Packit |
022b05 |
j++, smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
if (j) {
|
|
Packit |
022b05 |
fprint(f, ", ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintWrapped(f, INDENTVALUE + 1,
|
|
Packit |
022b05 |
smiGetElementNode(smiElement)->name);
|
|
Packit |
022b05 |
/* TODO: non-local name if non-local */
|
|
Packit |
022b05 |
} /* TODO: empty? -> print error */
|
|
Packit |
022b05 |
fprint(f, ");\n");
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_INDEX_AUGMENT:
|
|
Packit |
022b05 |
if (relatedNode) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "augments",
|
|
Packit |
022b05 |
INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", relatedNode->name);
|
|
Packit |
022b05 |
/* TODO: non-local name if non-local */
|
|
Packit |
022b05 |
} /* TODO: else print error */
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_INDEX_REORDER:
|
|
Packit |
022b05 |
if (relatedNode) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "reorders %s", relatedNode->name);
|
|
Packit |
022b05 |
/* TODO: non-local name if non-local */
|
|
Packit |
022b05 |
if (smiNode->implied) {
|
|
Packit |
022b05 |
fprint(f, " implied");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, " (");
|
|
Packit |
022b05 |
for (j = 0, smiElement = smiGetFirstElement(smiNode);
|
|
Packit |
022b05 |
smiElement;
|
|
Packit |
022b05 |
j++, smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
if (j) {
|
|
Packit |
022b05 |
fprint(f, ", ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintWrapped(f, INDENTVALUE + 1,
|
|
Packit |
022b05 |
smiGetElementNode(smiElement)->name);
|
|
Packit |
022b05 |
/* TODO: non-local name if non-local */
|
|
Packit |
022b05 |
} /* TODO: empty? -> print error */
|
|
Packit |
022b05 |
fprint(f, ");\n");
|
|
Packit |
022b05 |
} /* TODO: else print error */
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_INDEX_SPARSE:
|
|
Packit |
022b05 |
if (relatedNode) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "sparse", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", relatedNode->name);
|
|
Packit |
022b05 |
/* TODO: non-local name if non-local */
|
|
Packit |
022b05 |
} /* TODO: else print error */
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_INDEX_EXPAND:
|
|
Packit |
022b05 |
if (relatedNode) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "expands %s", relatedNode->name);
|
|
Packit |
022b05 |
/* TODO: non-local name if non-local */
|
|
Packit |
022b05 |
if (smiNode->implied) {
|
|
Packit |
022b05 |
fprint(f, " implied");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, " (");
|
|
Packit |
022b05 |
for (j = 0, smiElement = smiGetFirstElement(smiNode);
|
|
Packit |
022b05 |
smiElement;
|
|
Packit |
022b05 |
j++, smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
if (j) {
|
|
Packit |
022b05 |
fprint(f, ", ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintWrapped(f, INDENTVALUE + 1,
|
|
Packit |
022b05 |
smiGetElementNode(smiElement)->name);
|
|
Packit |
022b05 |
/* TODO: non-local name if non-local */
|
|
Packit |
022b05 |
} /* TODO: empty? -> print error */
|
|
Packit |
022b05 |
fprint(f, ");\n");
|
|
Packit |
022b05 |
} /* TODO: else print error */
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_INDEX_UNKNOWN:
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->create) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "create", INDENTVALUE);
|
|
Packit |
022b05 |
/* TODO: create list */
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->value.basetype != SMI_BASETYPE_UNKNOWN) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "default", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s", getValueString(&smiNode->value, smiType));
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->format) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "format", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\"%s\";\n",smiNode->format);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiNode->units) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "units", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\"%s\";\n", smiNode->units);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if ((smiNode->status != SMI_STATUS_CURRENT) &&
|
|
Packit |
022b05 |
(smiNode->status != SMI_STATUS_UNKNOWN) &&
|
|
Packit |
022b05 |
(smiNode->status != SMI_STATUS_MANDATORY) &&
|
|
Packit |
022b05 |
(smiNode->status != SMI_STATUS_OPTIONAL)) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "status", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getStringStatus(smiNode->status));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiNode->description) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "description",
|
|
Packit |
022b05 |
INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, (2 + indent) * INDENT,
|
|
Packit |
022b05 |
smiNode->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiNode->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, (2 + indent) * INDENT, "reference",
|
|
Packit |
022b05 |
INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, (2 + indent) * INDENT,
|
|
Packit |
022b05 |
smiNode->reference);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
fprintSegment(f, (1 + indent) * INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "};\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintNotifications(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i, j;
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(i = 0, smiNode = smiGetFirstNode(smiModule,
|
|
Packit |
022b05 |
SMI_NODEKIND_NOTIFICATION);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!i && !silent) {
|
|
Packit |
022b05 |
fprint(f, "//\n// NOTIFICATION DEFINITIONS\n//\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "notification %s {\n", smiNode->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->oid) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "oid", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getOidString(smiNode, 0));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiElement = smiGetFirstElement(smiNode))) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "objects", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "(");
|
|
Packit |
022b05 |
for (j = 0; smiElement;
|
|
Packit |
022b05 |
j++, smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
if (j) {
|
|
Packit |
022b05 |
fprint(f, ", ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintWrapped(f, INDENTVALUE + 1,
|
|
Packit |
022b05 |
smiGetElementNode(smiElement)->name);
|
|
Packit |
022b05 |
/* TODO: non-local name if non-local */
|
|
Packit |
022b05 |
} /* TODO: empty? -> print error */
|
|
Packit |
022b05 |
fprint(f, ");\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiNode->status != SMI_STATUS_CURRENT) &&
|
|
Packit |
022b05 |
(smiNode->status != SMI_STATUS_UNKNOWN) &&
|
|
Packit |
022b05 |
(smiNode->status != SMI_STATUS_MANDATORY) &&
|
|
Packit |
022b05 |
(smiNode->status != SMI_STATUS_OPTIONAL)) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getStringStatus(smiNode->status));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->description) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiNode->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiNode->reference);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "};\n\n");
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintGroups(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i, j;
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(i = 0, smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_GROUP);
|
|
Packit |
022b05 |
smiNode; smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_GROUP)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!i && !silent) {
|
|
Packit |
022b05 |
fprint(f, "//\n// GROUP DEFINITIONS\n//\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "group %s {\n", smiNode->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->oid) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "oid", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getOidString(smiNode, 0));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "members", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "(");
|
|
Packit |
022b05 |
for (j = 0, smiElement = smiGetFirstElement(smiNode); smiElement;
|
|
Packit |
022b05 |
j++, smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
if (j) {
|
|
Packit |
022b05 |
fprint(f, ", ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintWrapped(f, INDENTVALUE + 1,
|
|
Packit |
022b05 |
smiGetElementNode(smiElement)->name);
|
|
Packit |
022b05 |
/* TODO: non-local name if non-local */
|
|
Packit |
022b05 |
} /* TODO: empty? -> print error */
|
|
Packit |
022b05 |
fprint(f, ");\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiNode->status != SMI_STATUS_CURRENT) &&
|
|
Packit |
022b05 |
(smiNode->status != SMI_STATUS_UNKNOWN) &&
|
|
Packit |
022b05 |
(smiNode->status != SMI_STATUS_MANDATORY) &&
|
|
Packit |
022b05 |
(smiNode->status != SMI_STATUS_OPTIONAL)) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getStringStatus(smiNode->status));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->description) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiNode->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiNode->reference);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "};\n\n");
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintCompliances(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i, j;
|
|
Packit |
022b05 |
SmiNode *smiNode, *smiNode2;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
SmiOption *smiOption;
|
|
Packit |
022b05 |
SmiRefinement *smiRefinement;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(i = 0, smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_COMPLIANCE);
|
|
Packit |
022b05 |
smiNode; smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_COMPLIANCE)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!i && !silent) {
|
|
Packit |
022b05 |
fprint(f, "//\n// COMPLIANCE DEFINITIONS\n//\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "compliance %s {\n", smiNode->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->oid) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "oid", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getOidString(smiNode, 0));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiNode->status != SMI_STATUS_CURRENT) &&
|
|
Packit |
022b05 |
(smiNode->status != SMI_STATUS_UNKNOWN) &&
|
|
Packit |
022b05 |
(smiNode->status != SMI_STATUS_MANDATORY) &&
|
|
Packit |
022b05 |
(smiNode->status != SMI_STATUS_OPTIONAL)) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "status", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getStringStatus(smiNode->status));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->description) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiNode->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "reference", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 2 * INDENT, smiNode->reference);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiElement = smiGetFirstElement(smiNode))) {
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "mandatory", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "(");
|
|
Packit |
022b05 |
for (j = 0; smiElement;
|
|
Packit |
022b05 |
j++, smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
if (j) {
|
|
Packit |
022b05 |
fprint(f, ", ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintWrapped(f, INDENTVALUE + 1,
|
|
Packit |
022b05 |
smiGetElementNode(smiElement)->name);
|
|
Packit |
022b05 |
/* TODO: non-local name if non-local */
|
|
Packit |
022b05 |
} /* TODO: empty? -> print error */
|
|
Packit |
022b05 |
fprint(f, ");\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiOption = smiGetFirstOption(smiNode))) {
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
for(; smiOption; smiOption = smiGetNextOption(smiOption)) {
|
|
Packit |
022b05 |
smiNode2 = smiGetOptionNode(smiOption);
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "optional %s {\n", smiNode2->name);
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 3 * INDENT, smiOption->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "};\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiRefinement = smiGetFirstRefinement(smiNode))) {
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
for(; smiRefinement;
|
|
Packit |
022b05 |
smiRefinement = smiGetNextRefinement(smiRefinement)) {
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "refine %s {\n",
|
|
Packit |
022b05 |
smiGetRefinementNode(smiRefinement)->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiType = smiGetRefinementType(smiRefinement);
|
|
Packit |
022b05 |
if (smiType) {
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "type", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s",
|
|
Packit |
022b05 |
getTypeString(smiType->basetype,
|
|
Packit |
022b05 |
smiGetParentType(smiType)));
|
|
Packit |
022b05 |
fprintSubtype(f, smiType);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiType = smiGetRefinementWriteType(smiRefinement);
|
|
Packit |
022b05 |
if (smiType) {
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "writetype", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s",
|
|
Packit |
022b05 |
getTypeString(smiType->basetype,
|
|
Packit |
022b05 |
smiGetParentType(smiType)));
|
|
Packit |
022b05 |
fprintSubtype(f, smiType);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiRefinement->access != SMI_ACCESS_UNKNOWN) {
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "access", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n", getAccessString(smiRefinement->access));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 3 * INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, 3 * INDENT,
|
|
Packit |
022b05 |
smiRefinement->description);
|
|
Packit |
022b05 |
fprint(f, ";\n");
|
|
Packit |
022b05 |
fprintSegment(f, 2 * INDENT, "};\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "};\n\n");
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void dumpSming(int modc, SmiModule **modv, int flags, char *output)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiModule *smiModule;
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
FILE *f = stdout;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
silent = (flags & SMIDUMP_FLAG_SILENT);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (output) {
|
|
Packit |
022b05 |
f = fopen(output, "w");
|
|
Packit |
022b05 |
if (!f) {
|
|
Packit |
022b05 |
fprintf(stderr, "smidump: cannot open %s for writing: ", output);
|
|
Packit |
022b05 |
perror(NULL);
|
|
Packit |
022b05 |
exit(1);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0; i < modc; i++) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiModule = modv[i];
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprint(f, "//\n");
|
|
Packit |
022b05 |
fprint(f, "// This module has been generated by smidump "
|
|
Packit |
022b05 |
SMI_VERSION_STRING ". Do not edit.\n");
|
|
Packit |
022b05 |
fprint(f, "//\n");
|
|
Packit |
022b05 |
fprint(f, "module %s ", smiModule->name);
|
|
Packit |
022b05 |
fprint(f, "{\n");
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintImports(f, smiModule);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! silent) {
|
|
Packit |
022b05 |
fprint(f, "//\n// MODULE META INFORMATION\n//\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "organization", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, INDENT, smiModule->organization);
|
|
Packit |
022b05 |
fprint(f, ";\n\n");
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "contact", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, INDENT, smiModule->contactinfo);
|
|
Packit |
022b05 |
fprint(f, ";\n\n");
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "description", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, INDENT, smiModule->description);
|
|
Packit |
022b05 |
fprint(f, ";\n\n");
|
|
Packit |
022b05 |
if (smiModule->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "reference", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, INDENT, smiModule->reference);
|
|
Packit |
022b05 |
fprint(f, ";\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintRevisions(f, smiModule);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiNode = smiGetModuleIdentityNode(smiModule);
|
|
Packit |
022b05 |
if (smiNode) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "identity", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "%s;\n\n", smiNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintExtensions(f, smiModule);
|
|
Packit |
022b05 |
fprintIdentities(f, smiModule);
|
|
Packit |
022b05 |
fprintTypedefs(f, smiModule);
|
|
Packit |
022b05 |
fprintClasses(f, smiModule);
|
|
Packit |
022b05 |
fprintObjects(f, smiModule);
|
|
Packit |
022b05 |
fprintNotifications(f, smiModule);
|
|
Packit |
022b05 |
fprintGroups(f, smiModule);
|
|
Packit |
022b05 |
fprintCompliances(f, smiModule);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprint(f, "}; // end of module %s.\n", smiModule->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (fflush(f) || ferror(f)) {
|
|
Packit |
022b05 |
perror("smidump: write error");
|
|
Packit |
022b05 |
exit(1);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (output) {
|
|
Packit |
022b05 |
fclose(f);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void initSming()
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
static SmidumpDriver driver = {
|
|
Packit |
022b05 |
"sming",
|
|
Packit |
022b05 |
dumpSming,
|
|
Packit |
022b05 |
0,
|
|
Packit |
022b05 |
SMIDUMP_DRIVER_CANT_UNITE,
|
|
Packit |
022b05 |
"SMIng",
|
|
Packit |
022b05 |
NULL,
|
|
Packit |
022b05 |
NULL
|
|
Packit |
022b05 |
};
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smidumpRegisterDriver(&driver);
|
|
Packit |
022b05 |
}
|