|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* dump-tree.c --
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Operations to dump the OID tree in a human readable format.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
|
|
Packit |
022b05 |
* Copyright (c) 1999 J. Schoenwaelder, Technical University of Braunschweig.
|
|
Packit |
022b05 |
* Copyright (c) 2002 J. Schoenwaelder, University of Osnabrueck.
|
|
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-tree.c 8090 2008-04-18 12:56:29Z strauss $
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <config.h>
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <stdio.h>
|
|
Packit |
022b05 |
#include <string.h>
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include "smi.h"
|
|
Packit |
022b05 |
#include "smidump.h"
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int pmodc = 0;
|
|
Packit |
022b05 |
static SmiModule **pmodv = NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int ignoreconformance = 0;
|
|
Packit |
022b05 |
static int ignoreleafs = 0;
|
|
Packit |
022b05 |
static int full = 0;
|
|
Packit |
022b05 |
static int compact = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getFlags(SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (smiNode->access) {
|
|
Packit |
022b05 |
case SMI_ACCESS_UNKNOWN:
|
|
Packit |
022b05 |
return "---";
|
|
Packit |
022b05 |
case SMI_ACCESS_NOT_ACCESSIBLE:
|
|
Packit |
022b05 |
return "---";
|
|
Packit |
022b05 |
case SMI_ACCESS_EVENT_ONLY:
|
|
Packit |
022b05 |
return "---";
|
|
Packit |
022b05 |
case SMI_ACCESS_NOTIFY:
|
|
Packit |
022b05 |
return "--n";
|
|
Packit |
022b05 |
case SMI_ACCESS_READ_ONLY:
|
|
Packit |
022b05 |
return "r-n";
|
|
Packit |
022b05 |
case SMI_ACCESS_READ_WRITE:
|
|
Packit |
022b05 |
return "rwn";
|
|
Packit |
022b05 |
case SMI_ACCESS_NOT_IMPLEMENTED:
|
|
Packit |
022b05 |
return "---";
|
|
Packit |
022b05 |
case SMI_ACCESS_INSTALL:
|
|
Packit |
022b05 |
return "-i-";
|
|
Packit |
022b05 |
case SMI_ACCESS_INSTALL_NOTIFY:
|
|
Packit |
022b05 |
return "-in";
|
|
Packit |
022b05 |
case SMI_ACCESS_REPORT_ONLY:
|
|
Packit |
022b05 |
return "--r";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return "";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char getStatusChar(SmiStatus status)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
switch (status) {
|
|
Packit |
022b05 |
case SMI_STATUS_UNKNOWN:
|
|
Packit |
022b05 |
return '+';
|
|
Packit |
022b05 |
case SMI_STATUS_CURRENT:
|
|
Packit |
022b05 |
return '+';
|
|
Packit |
022b05 |
case SMI_STATUS_DEPRECATED:
|
|
Packit |
022b05 |
return 'x';
|
|
Packit |
022b05 |
case SMI_STATUS_MANDATORY:
|
|
Packit |
022b05 |
return '+';
|
|
Packit |
022b05 |
case SMI_STATUS_OPTIONAL:
|
|
Packit |
022b05 |
return '+';
|
|
Packit |
022b05 |
case SMI_STATUS_OBSOLETE:
|
|
Packit |
022b05 |
return 'o';
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return ' ';
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getTypeName(SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *type;
|
|
Packit |
022b05 |
SmiType *smiType, *parentType;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiType = smiGetNodeType(smiNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiType || smiNode->nodekind == SMI_NODEKIND_TABLE)
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiType->decl == SMI_DECL_IMPLICIT_TYPE) {
|
|
Packit |
022b05 |
parentType = smiGetParentType(smiType);
|
|
Packit |
022b05 |
if (!parentType)
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
smiType = parentType;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
type = xstrdup(smiType->name);
|
|
Packit |
022b05 |
return type;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintIndex(FILE *f, SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *indexname;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
indexname = NULL;
|
|
Packit |
022b05 |
for (i = -1, smiElement = smiGetFirstElement(smiNode);
|
|
Packit |
022b05 |
smiElement; smiElement = smiGetNextElement(smiElement), i++) {
|
|
Packit |
022b05 |
if (i > 0) fprintf(f, ",");
|
|
Packit |
022b05 |
if (indexname) {
|
|
Packit Service |
4c7e3b |
fprintf(f, "%s", indexname);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
indexname = smiGetElementNode(smiElement)->name;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (indexname) {
|
|
Packit |
022b05 |
fprintf(f, "%s%s%s",
|
|
Packit |
022b05 |
(i > 0) ? "," : "",
|
|
Packit |
022b05 |
(smiNode->implied) ? "*" : "",
|
|
Packit |
022b05 |
indexname);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintObjects(FILE *f, SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *objectname;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
objectname = NULL;
|
|
Packit |
022b05 |
for (i = -1, smiElement = smiGetFirstElement(smiNode);
|
|
Packit |
022b05 |
smiElement;
|
|
Packit |
022b05 |
smiElement = smiGetNextElement(smiElement), i++) {
|
|
Packit |
022b05 |
if (i > 0) fprintf(f, ",");
|
|
Packit |
022b05 |
if (objectname) {
|
|
Packit Service |
4c7e3b |
fprintf(f, "%s", objectname);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
objectname = smiGetElementNode(smiElement)->name;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (objectname) {
|
|
Packit |
022b05 |
fprintf(f, "%s%s", (i > 0) ? "," : "", objectname);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int isPartOfLoadedModules(SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiModule *smiModule;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiModule = smiGetNodeModule(smiNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0; i < pmodc; i++) {
|
|
Packit |
022b05 |
if (strcmp(pmodv[i]->name, smiModule->name) == 0) {
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* The following function pruneSubTree() is tricky. There are some
|
|
Packit |
022b05 |
* interactions between the supported options. See the detailed
|
|
Packit |
022b05 |
* comments below. Good examples to test the implemented behaviour
|
|
Packit |
022b05 |
* are:
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* smidump -u -f tree --tree-no-leaf IF-MIB ETHER-CHIPSET-MIB
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* (And the example above does _not_ work in combination with
|
|
Packit |
022b05 |
* --tree-no-conformance so the code below is still broken.)
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int pruneSubTree(SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *childNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
const int confmask = (SMI_NODEKIND_GROUP | SMI_NODEKIND_COMPLIANCE);
|
|
Packit |
022b05 |
const int leafmask = (SMI_NODEKIND_GROUP | SMI_NODEKIND_COMPLIANCE
|
|
Packit |
022b05 |
| SMI_NODEKIND_COLUMN | SMI_NODEKIND_SCALAR
|
|
Packit |
022b05 |
| SMI_NODEKIND_ROW | SMI_NODEKIND_NOTIFICATION);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! smiNode) {
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* First, prune all nodes which the user has told us to ignore.
|
|
Packit |
022b05 |
* In the case of ignoreleafs, we have to special case nodes with
|
|
Packit |
022b05 |
* an unknown status (which actually represent OBJECT-IDENTITY
|
|
Packit |
022b05 |
* definitions). More special case code is needed to exclude
|
|
Packit |
022b05 |
* module identity nodes.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (ignoreconformance && (smiNode->nodekind & confmask)) {
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (ignoreleafs) {
|
|
Packit |
022b05 |
if (smiNode->nodekind & leafmask) {
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiNode->nodekind == SMI_NODEKIND_NODE
|
|
Packit |
022b05 |
&& smiNode->status != SMI_STATUS_UNKNOWN) {
|
|
Packit |
022b05 |
SmiModule *smiModule = smiGetNodeModule(smiNode);
|
|
Packit |
022b05 |
if (smiModule && smiNode != smiGetModuleIdentityNode(smiModule)) {
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Next, generally do not prune nodes that belong to the set of
|
|
Packit |
022b05 |
* modules we are looking at.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (isPartOfLoadedModules(smiNode)) {
|
|
Packit |
022b05 |
if (!ignoreconformance || !smiGetFirstChildNode(smiNode)) {
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Finally, prune all nodes where all child nodes are pruned.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (childNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
childNode;
|
|
Packit |
022b05 |
childNode = smiGetNextChildNode(childNode)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* In the case of ignoreleafs, we have to peek at the child
|
|
Packit |
022b05 |
* nodes. Otherwise, we would prune too much. we still want to
|
|
Packit |
022b05 |
* see the path to the leafs we have pruned away. This also
|
|
Packit |
022b05 |
* interact with the semantics of ignoreconformance since we
|
|
Packit |
022b05 |
* still want in combination with ignoreleafs to see the path
|
|
Packit |
022b05 |
* to the pruned conformance leafs.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (ignoreleafs && (childNode->nodekind & leafmask)) {
|
|
Packit |
022b05 |
if (isPartOfLoadedModules(childNode)) {
|
|
Packit |
022b05 |
if (ignoreconformance && (childNode->nodekind & confmask)) {
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! pruneSubTree(childNode)) {
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintSubTree(FILE *f, SmiNode *smiNode,
|
|
Packit |
022b05 |
char *prefix, size_t typefieldlen)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *childNode, *indexNode;
|
|
Packit |
022b05 |
SmiNodekind lastNodeKind = SMI_NODEKIND_UNKNOWN;
|
|
Packit |
022b05 |
SmiType *type;
|
|
Packit |
022b05 |
int i = 0, cnt, prefixlen;
|
|
Packit |
022b05 |
size_t newtypefieldlen = 9;
|
|
Packit |
022b05 |
char c = 0;
|
|
Packit |
022b05 |
char *type_name;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode) {
|
|
Packit |
022b05 |
prefixlen = strlen(prefix);
|
|
Packit |
022b05 |
switch (smiNode->nodekind) {
|
|
Packit |
022b05 |
case SMI_NODEKIND_SCALAR:
|
|
Packit |
022b05 |
case SMI_NODEKIND_COLUMN:
|
|
Packit |
022b05 |
if (prefixlen > 0) {
|
|
Packit |
022b05 |
c = prefix[prefixlen-1];
|
|
Packit |
022b05 |
prefix[prefixlen-1] = getStatusChar(smiNode->status);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
type_name = getTypeName(smiNode);
|
|
Packit |
022b05 |
if (type_name) {
|
|
Packit |
022b05 |
fprintf(f, "%s-- %s %-*s %s(%u)\n",
|
|
Packit |
022b05 |
prefix,
|
|
Packit |
022b05 |
getFlags(smiNode),
|
|
Packit |
022b05 |
typefieldlen,
|
|
Packit |
022b05 |
type_name,
|
|
Packit |
022b05 |
smiNode->name,
|
|
Packit |
022b05 |
smiNode->oid[smiNode->oidlen-1]);
|
|
Packit |
022b05 |
xfree(type_name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (prefixlen > 0 && c) {
|
|
Packit |
022b05 |
prefix[prefixlen-1] = c;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_NODEKIND_ROW:
|
|
Packit |
022b05 |
if (prefixlen > 0) {
|
|
Packit |
022b05 |
c = prefix[prefixlen-1];
|
|
Packit |
022b05 |
prefix[prefixlen-1] = getStatusChar(smiNode->status);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, "%s--%s(%u) [", prefix,
|
|
Packit |
022b05 |
smiNode->name,
|
|
Packit |
022b05 |
smiNode->oid[smiNode->oidlen-1]);
|
|
Packit |
022b05 |
switch (smiNode->indexkind) {
|
|
Packit |
022b05 |
case SMI_INDEX_INDEX:
|
|
Packit |
022b05 |
case SMI_INDEX_REORDER:
|
|
Packit |
022b05 |
fprintIndex(f, smiNode);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_INDEX_EXPAND: /* TODO: we have to do more work here! */
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_INDEX_AUGMENT:
|
|
Packit |
022b05 |
case SMI_INDEX_SPARSE:
|
|
Packit |
022b05 |
indexNode = smiGetRelatedNode(smiNode);
|
|
Packit |
022b05 |
if (indexNode) {
|
|
Packit |
022b05 |
fprintIndex(f, indexNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_INDEX_UNKNOWN:
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, "]\n");
|
|
Packit |
022b05 |
if (prefixlen > 0 && c) {
|
|
Packit |
022b05 |
prefix[prefixlen-1] = c;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_NODEKIND_NOTIFICATION:
|
|
Packit |
022b05 |
if (prefixlen > 0) {
|
|
Packit |
022b05 |
c = prefix[prefixlen-1];
|
|
Packit |
022b05 |
prefix[prefixlen-1] = getStatusChar(smiNode->status);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, "%s--%s(%u) [", prefix,
|
|
Packit |
022b05 |
smiNode->name,
|
|
Packit |
022b05 |
smiNode->oid[smiNode->oidlen-1]);
|
|
Packit |
022b05 |
fprintObjects(f, smiNode);
|
|
Packit |
022b05 |
fprintf(f, "]\n");
|
|
Packit |
022b05 |
if (prefixlen > 0 && c) {
|
|
Packit |
022b05 |
prefix[prefixlen-1] = c;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
if (prefixlen > 0) {
|
|
Packit |
022b05 |
c = prefix[prefixlen-1];
|
|
Packit |
022b05 |
prefix[prefixlen-1] = getStatusChar(smiNode->status);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiNode->oid)
|
|
Packit |
022b05 |
if (prefixlen > 0) {
|
|
Packit |
022b05 |
fprintf(f, "%s--%s(%u)\n", prefix,
|
|
Packit |
022b05 |
smiNode->name ? smiNode->name : " ",
|
|
Packit |
022b05 |
smiNode->oid[smiNode->oidlen-1]);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
unsigned int j;
|
|
Packit |
022b05 |
fprintf(f, "%s--%s(", prefix,
|
|
Packit |
022b05 |
smiNode->name ? smiNode->name : " ");
|
|
Packit |
022b05 |
for (j = 0; j < smiNode->oidlen; j++) {
|
|
Packit |
022b05 |
fprintf(f, "%s%u", j ? "." : "", smiNode->oid[j]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, ")\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else
|
|
Packit |
022b05 |
fprintf(f, "%s--%s(?)\n", prefix,
|
|
Packit |
022b05 |
smiNode->name ? smiNode->name : " ");
|
|
Packit |
022b05 |
if (prefixlen > 0 && c) {
|
|
Packit |
022b05 |
prefix[prefixlen-1] = c;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
for (childNode = smiGetFirstChildNode(smiNode), cnt = 0;
|
|
Packit |
022b05 |
childNode;
|
|
Packit |
022b05 |
childNode = smiGetNextChildNode(childNode)) {
|
|
Packit |
022b05 |
if (! pruneSubTree(childNode)) {
|
|
Packit |
022b05 |
type = smiGetNodeType(childNode);
|
|
Packit |
022b05 |
if (type) {
|
|
Packit |
022b05 |
type_name = getTypeName(childNode);
|
|
Packit |
022b05 |
if (type_name) {
|
|
Packit |
022b05 |
if (strlen(type_name) > newtypefieldlen) {
|
|
Packit |
022b05 |
newtypefieldlen = strlen(type_name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
xfree(type_name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
for (childNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
childNode;
|
|
Packit |
022b05 |
childNode = smiGetNextChildNode(childNode)) {
|
|
Packit |
022b05 |
char *newprefix;
|
|
Packit |
022b05 |
if (pruneSubTree(childNode)) {
|
|
Packit |
022b05 |
continue;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
if (! compact &&
|
|
Packit |
022b05 |
((childNode->nodekind != SMI_NODEKIND_COLUMN
|
|
Packit |
022b05 |
&& childNode->nodekind != SMI_NODEKIND_SCALAR)
|
|
Packit |
022b05 |
|| (lastNodeKind != childNode->nodekind))) {
|
|
Packit |
022b05 |
fprintf(f, "%s |\n", prefix);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
newprefix = xmalloc(strlen(prefix)+10);
|
|
Packit |
022b05 |
strcpy(newprefix, prefix);
|
|
Packit |
022b05 |
if (cnt == 1 || cnt == i) {
|
|
Packit |
022b05 |
strcat(newprefix, " ");
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
strcat(newprefix, " |");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSubTree(f, childNode, newprefix, newtypefieldlen);
|
|
Packit |
022b05 |
xfree(newprefix);
|
|
Packit |
022b05 |
lastNodeKind = childNode->nodekind;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintTree(FILE *f)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
SmiNode *childNode;
|
|
Packit |
022b05 |
SmiNode *nextNode;
|
|
Packit |
022b05 |
int cnt;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiNode = smiGetNode(NULL, "iso");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! full) {
|
|
Packit |
022b05 |
do {
|
|
Packit |
022b05 |
for (childNode = smiGetFirstChildNode(smiNode), cnt = 0, nextNode = NULL;
|
|
Packit |
022b05 |
childNode;
|
|
Packit |
022b05 |
childNode = smiGetNextChildNode(childNode)) {
|
|
Packit |
022b05 |
if (! pruneSubTree(childNode)) {
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
if (! nextNode) {
|
|
Packit |
022b05 |
nextNode = childNode;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (cnt == 1) {
|
|
Packit |
022b05 |
smiNode = nextNode;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} while (cnt == 1);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode) {
|
|
Packit |
022b05 |
fprintSubTree(f, smiNode, "", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void dumpTree(int modc, SmiModule **modv, int flags, char *output)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
FILE *f = stdout;
|
|
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 |
if (flags & SMIDUMP_FLAG_UNITE) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
pmodc = modc;
|
|
Packit |
022b05 |
pmodv = modv;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! (flags & SMIDUMP_FLAG_SILENT)) {
|
|
Packit |
022b05 |
fprintf(f, "# united registration tree (generated by smidump "
|
|
Packit |
022b05 |
SMI_VERSION_STRING ")\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! (flags & SMIDUMP_FLAG_SILENT) && (flags & SMIDUMP_FLAG_ERROR)) {
|
|
Packit |
022b05 |
fprintf(f, "# WARNING: this output may be incorrect due to "
|
|
Packit |
022b05 |
"significant parse errors\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintTree(f);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0; i < modc; i++) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
pmodc = 1;
|
|
Packit |
022b05 |
pmodv = &(modv[i]);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! (flags & SMIDUMP_FLAG_SILENT)) {
|
|
Packit |
022b05 |
fprintf(f, "# %s registration tree (generated by smidump "
|
|
Packit |
022b05 |
SMI_VERSION_STRING ")\n\n", modv[i]->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! (flags & SMIDUMP_FLAG_SILENT) && (flags & SMIDUMP_FLAG_ERROR)) {
|
|
Packit |
022b05 |
fprintf(f, "# WARNING: this output may be incorrect due to "
|
|
Packit |
022b05 |
"significant parse errors\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintTree(f);
|
|
Packit |
022b05 |
}
|
|
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 initTree()
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
static SmidumpDriverOption opt[] = {
|
|
Packit |
022b05 |
{ "no-conformance", OPT_FLAG, &ignoreconformance, 0,
|
|
Packit |
022b05 |
"do not show conformance nodes"},
|
|
Packit |
022b05 |
{ "no-leafs", OPT_FLAG, &ignoreleafs, 0,
|
|
Packit |
022b05 |
"do not show leaf nodes"},
|
|
Packit |
022b05 |
{ "full-root", OPT_FLAG, &full, 0,
|
|
Packit |
022b05 |
"generate the full path to the root"},
|
|
Packit |
022b05 |
{ "compact", OPT_FLAG, &compact, 0,
|
|
Packit |
022b05 |
"generate a more compact representation"},
|
|
Packit |
022b05 |
{ 0, OPT_END, 0, 0 }
|
|
Packit |
022b05 |
};
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static SmidumpDriver driver = {
|
|
Packit |
022b05 |
"tree",
|
|
Packit |
022b05 |
dumpTree,
|
|
Packit |
022b05 |
SMI_FLAG_NODESCR,
|
|
Packit |
022b05 |
0,
|
|
Packit |
022b05 |
"structure of the OID tree",
|
|
Packit |
022b05 |
opt,
|
|
Packit |
022b05 |
NULL
|
|
Packit |
022b05 |
};
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smidumpRegisterDriver(&driver);
|
|
Packit |
022b05 |
}
|