Blame tools/dump-mosy.c

Packit Service 9ccfef
/*
Packit Service 9ccfef
 * dump-mosy.c --
Packit Service 9ccfef
 *
Packit Service 9ccfef
 *      Operations to dump MIB modules in the MOSY output format.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
Packit Service 9ccfef
 * Copyright (c) 1999 J. Schoenwaelder, Technical University of Braunschweig.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * See the file "COPYING" for information on usage and redistribution
Packit Service 9ccfef
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * @(#) $Id: dump-mosy.c 8090 2008-04-18 12:56:29Z strauss $
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
#include <config.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include <stdio.h>
Packit Service 9ccfef
#include <string.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include "smi.h"
Packit Service 9ccfef
#include "smidump.h"
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *ignoreTypeRanges[] = {
Packit Service 9ccfef
    "TimeTicks",
Packit Service 9ccfef
    "Counter32",
Packit Service 9ccfef
    "Gauge32",
Packit Service 9ccfef
    "Counter64",
Packit Service 9ccfef
    NULL
Packit Service 9ccfef
};
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getStatusString(SmiStatus status)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return
Packit Service 9ccfef
	(status == SMI_STATUS_CURRENT)     ? "current" :
Packit Service 9ccfef
	(status == SMI_STATUS_DEPRECATED)  ? "deprecated" :
Packit Service 9ccfef
	(status == SMI_STATUS_OBSOLETE)    ? "obsolete" :
Packit Service 9ccfef
	(status == SMI_STATUS_MANDATORY)   ? "mandatory" :
Packit Service 9ccfef
	(status == SMI_STATUS_OPTIONAL)    ? "optional" :
Packit Service 9ccfef
					     "<unknown>";
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getAccessString(SmiAccess access, int create)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return
Packit Service 9ccfef
	(create && (access == SMI_ACCESS_READ_WRITE)) ? "read-create" :
Packit Service 9ccfef
	(access == SMI_ACCESS_NOT_ACCESSIBLE) ? "not-accessible" :
Packit Service 9ccfef
	(access == SMI_ACCESS_NOTIFY)	      ? "accessible-for-notify" :
Packit Service 9ccfef
	(access == SMI_ACCESS_READ_ONLY)      ? "read-only" :
Packit Service 9ccfef
	(access == SMI_ACCESS_READ_WRITE)     ? "read-write" :
Packit Service 9ccfef
						"<unknown>";
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getBasetypeString(SmiBasetype basetype)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_UNKNOWN)           ? "<UNKNOWN>" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_OCTETSTRING)       ? "OctetString" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_OBJECTIDENTIFIER)  ? "ObjectID" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_UNSIGNED32)        ? "Unsigned32" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_INTEGER32)         ? "Integer32" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_UNSIGNED64)        ? "Unsigned64" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_INTEGER64)         ? "Integer64" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_FLOAT32)           ? "Float32" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_FLOAT64)           ? "Float64" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_FLOAT128)          ? "Float128" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_ENUM)              ? "INTEGER" :
Packit Service 9ccfef
        (basetype == SMI_BASETYPE_BITS)              ? "Bits" :
Packit Service 9ccfef
                                                   "<unknown>";
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getOidString(SmiNode *smiNode, int importedParent)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode	 *parentNode;
Packit Service 9ccfef
    SmiModule	 *smiModule;
Packit Service 9ccfef
    static char	 s[200];
Packit Service 9ccfef
    char	 append[200];
Packit Service 9ccfef
    unsigned int i;
Packit Service 9ccfef
    
Packit Service 9ccfef
    append[0] = 0;
Packit Service 9ccfef
Packit Service 9ccfef
    parentNode = smiNode;
Packit Service 9ccfef
    smiModule = smiGetNodeModule(smiNode);
Packit Service 9ccfef
    
Packit Service 9ccfef
    do {
Packit Service 9ccfef
Packit Service 9ccfef
	if (parentNode->oidlen <= 1) {
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	/* prepend the cut-off subidentifier to `append'. */
Packit Service 9ccfef
	strcpy(s, append);
Packit Service 9ccfef
	sprintf(append, ".%u%s", parentNode->oid[parentNode->oidlen-1], s);
Packit Service 9ccfef
Packit Service 9ccfef
	/* retrieve the parent SmiNode */
Packit Service 9ccfef
	parentNode = smiGetParentNode(parentNode);
Packit Service 9ccfef
Packit Service 9ccfef
	if (!parentNode) {
Packit Service 9ccfef
	    sprintf(s, "%s", append);
Packit Service 9ccfef
	    return s;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	/* found an imported or a local parent node? */
Packit Service 9ccfef
	if ((parentNode->decl != SMI_DECL_IMPL_OBJECT) 
Packit Service 9ccfef
	    && ((parentNode->name && strlen(parentNode->name)) 
Packit Service 9ccfef
		&& (smiIsImported(smiModule, NULL, parentNode->name) 
Packit Service 9ccfef
		    || (!importedParent 
Packit Service 9ccfef
			&& (smiGetNodeModule(parentNode) == smiModule)) 
Packit Service 9ccfef
		    || (parentNode->oidlen == 1)))) {
Packit Service 9ccfef
	    sprintf(s, "%s%s", parentNode->name, append);
Packit Service 9ccfef
	    return s;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
    } while (parentNode);
Packit Service 9ccfef
Packit Service 9ccfef
    s[0] = 0;
Packit Service 9ccfef
    for (i=0; i < smiNode->oidlen; i++) {
Packit Service 9ccfef
	if (i) strcat(s, ".");
Packit Service 9ccfef
	sprintf(&s[strlen(s)], "%u", smiNode->oid[i]);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    return s;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getValueString(SmiValue *valuePtr)
Packit Service 9ccfef
{
Packit Service 9ccfef
    static char    s[1024];
Packit Service 9ccfef
Packit Service 9ccfef
    s[0] = 0;
Packit Service 9ccfef
    
Packit Service 9ccfef
    switch (valuePtr->basetype) {
Packit Service 9ccfef
    case SMI_BASETYPE_UNSIGNED32:
Packit Service 9ccfef
	sprintf(s, "%lu", valuePtr->value.unsigned32);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_INTEGER32:
Packit Service 9ccfef
	sprintf(s, "%ld", valuePtr->value.integer32);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_UNSIGNED64:
Packit Service 9ccfef
	sprintf(s, UINT64_FORMAT, valuePtr->value.unsigned64);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_INTEGER64:
Packit Service 9ccfef
	sprintf(s, INT64_FORMAT, valuePtr->value.integer64);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_FLOAT32:
Packit Service 9ccfef
    case SMI_BASETYPE_FLOAT64:
Packit Service 9ccfef
    case SMI_BASETYPE_FLOAT128:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_ENUM:
Packit Service 9ccfef
    case SMI_BASETYPE_OCTETSTRING:
Packit Service 9ccfef
    case SMI_BASETYPE_BITS:
Packit Service 9ccfef
    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit Service 9ccfef
	/* not required in MOSY format */
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_UNKNOWN:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_POINTER:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return s;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void printIndex(FILE *f, SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    char *indexname;
Packit Service 9ccfef
    int  i;
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprintf(f, "%%%-19s %-16s \"", "ei", smiNode->name);
Packit Service 9ccfef
    indexname = NULL;
Packit Service 9ccfef
    for (i = -1, smiElement = smiGetFirstElement(smiNode);
Packit Service 9ccfef
	 smiElement; smiElement = smiGetNextElement(smiElement), i++) {
Packit Service 9ccfef
	if (i > 0) fprintf(f, " ");
Packit Service 9ccfef
	if (indexname) {
Packit Service 9ccfef
	    fprintf(f, "%s", indexname);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	indexname = smiGetElementNode(smiElement)->name;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    if (indexname) {
Packit Service 9ccfef
	fprintf(f, "%s%s%s",
Packit Service 9ccfef
		(i > 0) ? " " : "",
Packit Service 9ccfef
		(smiNode->implied) ? "*" : "",
Packit Service 9ccfef
		indexname);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprintf(f, "\"\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void printAssignements(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		 cnt = 0;
Packit Service 9ccfef
    SmiNode	 *smiNode;
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_NODE);
Packit Service 9ccfef
	 smiNode; smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NODE)) {
Packit Service 9ccfef
Packit Service 9ccfef
	cnt++;
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiNode->status == SMI_STATUS_UNKNOWN &&
Packit Service 9ccfef
	    smiNode != smiGetModuleIdentityNode(smiModule)) {
Packit Service 9ccfef
	    fprintf(f, "%-20s %s\n", smiNode->name, getOidString(smiNode, 0));
Packit Service 9ccfef
	    fprintf(f, "%%n0 %-16s object-id\n", smiNode->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (cnt) {
Packit Service 9ccfef
	fprintf(f, "\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void printTypedefs(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		   i;
Packit Service 9ccfef
    SmiType	   *smiType, *smiParentType;
Packit Service 9ccfef
    SmiNamedNumber *nn;
Packit Service 9ccfef
    char	   *type_name;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (i = 0, smiType = smiGetFirstType(smiModule);
Packit Service 9ccfef
	 smiType; smiType = smiGetNextType(smiType)) {
Packit Service 9ccfef
	
Packit Service 9ccfef
	smiParentType = smiGetParentType(smiType);
Packit Service 9ccfef
	type_name = smiParentType->name;
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (smiParentType->decl == SMI_DECL_IMPLICIT_TYPE) {
Packit Service 9ccfef
	    smiParentType = smiGetParentType(smiParentType);
Packit Service 9ccfef
	    type_name = smiParentType->name;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (smiParentType->basetype == SMI_BASETYPE_OBJECTIDENTIFIER) {
Packit Service 9ccfef
	    type_name = "ObjectID";
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (smiParentType->basetype == SMI_BASETYPE_ENUM) {
Packit Service 9ccfef
	    type_name = "INTEGER";
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	fprintf(f, "%%%-19s %-16s %-15s \"%s\"\n", "tc",
Packit Service 9ccfef
		smiType->name, type_name,
Packit Service 9ccfef
		smiType->format ? smiType->format : "");
Packit Service 9ccfef
	
Packit Service 9ccfef
	for (i = 0, nn = smiGetFirstNamedNumber(smiType);
Packit Service 9ccfef
	     nn ; i++, nn = smiGetNextNamedNumber(nn)) {
Packit Service 9ccfef
	    fprintf(f, "%%%-19s %-16s %-15s %s\n", "es",
Packit Service 9ccfef
		    smiType->name, nn->name,
Packit Service 9ccfef
		    getValueString(&nn->value));
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void printObjects(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		   i, j, ignore, cnt = 0, aggregate, create;
Packit Service 9ccfef
    char	   *type_name;
Packit Service 9ccfef
    SmiNode	   *smiNode, *relatedNode;
Packit Service 9ccfef
    SmiType	   *smiType;
Packit Service 9ccfef
    SmiNamedNumber *smiNamedNumber;
Packit Service 9ccfef
    SmiRange       *smiRange;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
Packit Service 9ccfef
	 smiNode; smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiNode->nodekind != SMI_NODEKIND_NODE
Packit Service 9ccfef
	    && smiNode->nodekind != SMI_NODEKIND_SCALAR
Packit Service 9ccfef
	    && smiNode->nodekind != SMI_NODEKIND_TABLE
Packit Service 9ccfef
	    && smiNode->nodekind != SMI_NODEKIND_ROW
Packit Service 9ccfef
	    && smiNode->nodekind != SMI_NODEKIND_COLUMN) {
Packit Service 9ccfef
	    continue;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	cnt++;
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiNode->nodekind == SMI_NODEKIND_NODE) {
Packit Service 9ccfef
	    if (smiNode->status != SMI_STATUS_UNKNOWN &&
Packit Service 9ccfef
		smiNode != smiGetModuleIdentityNode(smiModule)) {
Packit Service 9ccfef
		fprintf(f, "%-20s %s\n", smiNode->name,
Packit Service 9ccfef
			getOidString(smiNode, 0));
Packit Service 9ccfef
		fprintf(f, "%%n0 %-16s object-id\n", smiNode->name);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    continue;
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	aggregate = smiNode->nodekind == SMI_NODEKIND_TABLE
Packit Service 9ccfef
	    || smiNode->nodekind == SMI_NODEKIND_ROW;
Packit Service 9ccfef
Packit Service 9ccfef
	type_name = NULL;
Packit Service 9ccfef
	smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
	if (!aggregate) {
Packit Service 9ccfef
	    if (! smiType) {
Packit Service 9ccfef
		continue;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    type_name = getBasetypeString(smiType->basetype);
Packit Service 9ccfef
	    if (smiType && (smiType->decl != SMI_DECL_IMPLICIT_TYPE)) {
Packit Service 9ccfef
		type_name = smiType->name;
Packit Service 9ccfef
		if (!strcmp(type_name, "ObjectIdentifier")) {
Packit Service 9ccfef
		    type_name = "ObjectID";
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	
Packit Service 9ccfef
	    if (smiType && smiType->decl == SMI_DECL_IMPLICIT_TYPE) {
Packit Service 9ccfef
		type_name = smiGetParentType(smiType)->name;
Packit Service 9ccfef
		if (smiType->basetype == SMI_BASETYPE_OBJECTIDENTIFIER) {
Packit Service 9ccfef
		    type_name = "ObjectID";
Packit Service 9ccfef
		}
Packit Service 9ccfef
		if (smiType->basetype == SMI_BASETYPE_ENUM) {
Packit Service 9ccfef
		    type_name = "INTEGER";
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    type_name = "Aggregate";
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiNode->nodekind == SMI_NODEKIND_COLUMN) {
Packit Service 9ccfef
	    create = smiGetParentNode(smiNode)->create;
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    create = 0;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintf(f, "%-20s %-16s ", smiNode->name, getOidString(smiNode, 0));
Packit Service 9ccfef
	fprintf(f, "%-15s %-15s %s\n", type_name,
Packit Service 9ccfef
		getAccessString(smiNode->access, create),
Packit Service 9ccfef
		getStatusString(smiNode->status));
Packit Service 9ccfef
Packit Service 9ccfef
	relatedNode = smiGetRelatedNode(smiNode);
Packit Service 9ccfef
	switch (smiNode->indexkind) {
Packit Service 9ccfef
	case SMI_INDEX_INDEX:
Packit Service 9ccfef
	case SMI_INDEX_REORDER:
Packit Service 9ccfef
	    printIndex(f, smiNode);
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_INDEX_EXPAND:	/* TODO: we have to do more work here! */
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_INDEX_AUGMENT:
Packit Service 9ccfef
	    if (relatedNode) {
Packit Service 9ccfef
		fprintf(f, "%%%-19s %-16s %s\n", "ea",
Packit Service 9ccfef
			smiNode->name, relatedNode->name);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_INDEX_SPARSE:
Packit Service 9ccfef
	    if (relatedNode) {
Packit Service 9ccfef
		printIndex(f, relatedNode);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_INDEX_UNKNOWN:
Packit Service 9ccfef
	    break;	    
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiType && smiType->decl == SMI_DECL_IMPLICIT_TYPE) {
Packit Service 9ccfef
	    for (i = 0, smiNamedNumber = smiGetFirstNamedNumber(smiType);
Packit Service 9ccfef
		smiNamedNumber;
Packit Service 9ccfef
		i++, smiNamedNumber = smiGetNextNamedNumber(smiNamedNumber)) {
Packit Service 9ccfef
		fprintf(f, "%%%-19s %-16s %-15s %s\n", "ev",
Packit Service 9ccfef
			smiNode->name, smiNamedNumber->name,
Packit Service 9ccfef
			getValueString(&smiNamedNumber->value));
Packit Service 9ccfef
	    }
Packit Service 9ccfef
Packit Service 9ccfef
	    for (ignore = 0, j = 0; ignoreTypeRanges[j]; j++) {
Packit Service 9ccfef
		if (strcmp(type_name, ignoreTypeRanges[j]) == 0) {
Packit Service 9ccfef
		    ignore++;
Packit Service 9ccfef
		    break;
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
Packit Service 9ccfef
	    if (! ignore) {
Packit Service 9ccfef
		for (smiRange = smiGetFirstRange(smiType);
Packit Service 9ccfef
		     smiRange;
Packit Service 9ccfef
		     smiRange = smiGetNextRange(smiRange)) {
Packit Service 9ccfef
		    fprintf(f, "%%%-19s %-16s %-15s ", "er",
Packit Service 9ccfef
			    smiNode->name,
Packit Service 9ccfef
			    getValueString(&smiRange->minValue));
Packit Service 9ccfef
		    fprintf(f, "%s\n", getValueString(&smiRange->maxValue));
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (cnt) {
Packit Service 9ccfef
	fprintf(f, "\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void printNotifications(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		 cnt = 0;
Packit Service 9ccfef
    SmiNode	 *smiNode;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_NOTIFICATION);
Packit Service 9ccfef
	 smiNode; 
Packit Service 9ccfef
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
Packit Service 9ccfef
Packit Service 9ccfef
	cnt++;
Packit Service 9ccfef
	
Packit Service 9ccfef
	fprintf(f, "%-20s %s\n", smiNode->name, getOidString(smiNode, 0));
Packit Service 9ccfef
	fprintf(f, "%%n0 %-16s notification\n", smiNode->name);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (cnt) {
Packit Service 9ccfef
	fprintf(f, "\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void printGroups(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode	*smiNode, *smiNodeMember;
Packit Service 9ccfef
    SmiElement  *smiElement;
Packit Service 9ccfef
    int		cnt = 0, objects, notifications;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_GROUP);
Packit Service 9ccfef
	 smiNode; smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_GROUP)) {
Packit Service 9ccfef
Packit Service 9ccfef
	cnt ++;
Packit Service 9ccfef
Packit Service 9ccfef
	for (objects = 0, notifications = 0,
Packit Service 9ccfef
	     smiElement = smiGetFirstElement(smiNode);
Packit Service 9ccfef
	     smiElement;
Packit Service 9ccfef
	     smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
Packit Service 9ccfef
	    smiNodeMember = smiGetElementNode(smiElement);
Packit Service 9ccfef
	    
Packit Service 9ccfef
	    objects += 
Packit Service 9ccfef
		(smiNodeMember->nodekind == SMI_NODEKIND_SCALAR)
Packit Service 9ccfef
		|| (smiNodeMember->nodekind == SMI_NODEKIND_COLUMN);
Packit Service 9ccfef
	    notifications +=
Packit Service 9ccfef
		(smiNodeMember->nodekind == SMI_NODEKIND_NOTIFICATION);
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	fprintf(f, "%-20s %s\n", smiNode->name, getOidString(smiNode, 0));
Packit Service 9ccfef
	fprintf(f, "%%n0 %-16s %s\n", smiNode->name,
Packit Service 9ccfef
		(objects && ! notifications) ? "object-group" :
Packit Service 9ccfef
		(! objects && notifications) ? "notification-group" : "group");
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (cnt) {
Packit Service 9ccfef
	fprintf(f, "\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void printCompliances(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int		  cnt = 0;
Packit Service 9ccfef
    SmiNode	  *smiNode;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_COMPLIANCE);
Packit Service 9ccfef
	 smiNode; smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_COMPLIANCE)) {
Packit Service 9ccfef
	
Packit Service 9ccfef
	cnt++;
Packit Service 9ccfef
Packit Service 9ccfef
	fprintf(f, "%-20s %s\n", smiNode->name, getOidString(smiNode, 0));
Packit Service 9ccfef
	fprintf(f, "%%n0 %-16s module-compliance\n", smiNode->name);
Packit Service 9ccfef
    }
Packit Service 9ccfef
	    
Packit Service 9ccfef
    if (cnt) {
Packit Service 9ccfef
	fprintf(f, "\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void dumpMosy(int modc, SmiModule **modv, int flags, char *output)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode	*smiNode;
Packit Service 9ccfef
    int		i;
Packit Service 9ccfef
    FILE	*f = stdout;
Packit Service 9ccfef
Packit Service 9ccfef
    if (output) {
Packit Service 9ccfef
	f = fopen(output, "w");
Packit Service 9ccfef
	if (!f) {
Packit Service 9ccfef
	    fprintf(stderr, "smidump: cannot open %s for writing: ", output);
Packit Service 9ccfef
	    perror(NULL);
Packit Service 9ccfef
	    exit(1);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; i < modc; i++) {
Packit Service 9ccfef
Packit Service 9ccfef
	if (! (flags & SMIDUMP_FLAG_SILENT)) {
Packit Service 9ccfef
	    fprintf(f,
Packit Service 9ccfef
		    "-- automatically generated by smidump %s, do not edit!\n",
Packit Service 9ccfef
		    SMI_VERSION_STRING);
Packit Service 9ccfef
	    fprintf(f,
Packit Service 9ccfef
		    "\n-- object definitions compiled from %s\n\n",
Packit Service 9ccfef
		    modv[i]->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (! (flags & SMIDUMP_FLAG_SILENT) && (flags & SMIDUMP_FLAG_ERROR)) {
Packit Service 9ccfef
	    fprintf(f, "-- WARNING: this output may be incorrect due to "
Packit Service 9ccfef
		    "significant parse errors\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	smiNode = smiGetModuleIdentityNode(modv[i]);
Packit Service 9ccfef
	if (smiNode) {
Packit Service 9ccfef
	    SmiNode *parent = smiGetParentNode(smiNode);
Packit Service 9ccfef
	    fprintf(f, "%-20s %s\n", smiNode->name, getOidString(smiNode, !parent || parent->nodekind == SMI_NODEKIND_UNKNOWN ));
Packit Service 9ccfef
	    fprintf(f, "%%n0 %-16s module-identity\n", smiNode->name);
Packit Service 9ccfef
	    fprintf(f, "\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	printAssignements(f, modv[i]);
Packit Service 9ccfef
	printTypedefs(f, modv[i]);
Packit Service 9ccfef
	printObjects(f, modv[i]);
Packit Service 9ccfef
	printNotifications(f, modv[i]);
Packit Service 9ccfef
	printGroups(f, modv[i]);
Packit Service 9ccfef
	printCompliances(f, modv[i]);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (fflush(f) || ferror(f)) {
Packit Service 9ccfef
	perror("smidump: write error");
Packit Service 9ccfef
	exit(1);
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (output) {
Packit Service 9ccfef
	fclose(f);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void initMosy()
Packit Service 9ccfef
{
Packit Service 9ccfef
    
Packit Service 9ccfef
    static SmidumpDriver driver = {
Packit Service 9ccfef
	"mosy",
Packit Service 9ccfef
	dumpMosy,
Packit Service 9ccfef
	SMI_FLAG_NODESCR,
Packit Service 9ccfef
	SMIDUMP_DRIVER_CANT_UNITE,
Packit Service 9ccfef
	"intermediate format generated by the mosy compiler",
Packit Service 9ccfef
	NULL,
Packit Service 9ccfef
	NULL
Packit Service 9ccfef
    };
Packit Service 9ccfef
    
Packit Service 9ccfef
    smidumpRegisterDriver(&driver);
Packit Service 9ccfef
}