Blame tools/dump-tree.c

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
}