Blame tools/dump-sppi.c

Packit Service 9ccfef
/*
Packit Service 9ccfef
 * dump-sppi.c --
Packit Service 9ccfef
 *
Packit Service 9ccfef
 *      Operations to dump SPPI module information.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Copyright (c) 1999 Frank Strauss, 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
 */
Packit Service 9ccfef
Packit Service 9ccfef
#include <config.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include <stdlib.h>
Packit Service 9ccfef
#include <stdio.h>
Packit Service 9ccfef
#include <stdarg.h>
Packit Service 9ccfef
#include <string.h>
Packit Service 9ccfef
#include <ctype.h>
Packit Service 9ccfef
#include <time.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
#define  INDENT		4    /* indent factor */
Packit Service 9ccfef
#define  INDENTVALUE	16   /* column to start values, except multiline */
Packit Service 9ccfef
#define  INDENTTEXTS	 9   /* column to start multiline texts */
Packit Service 9ccfef
#define  INDENTMAX	72   /* max column to fill, break lines otherwise */
Packit Service 9ccfef
Packit Service 9ccfef
static char *convertType[] = {
Packit Service 9ccfef
    NULL,		 "INTEGER",	       NULL,	   "Integer32",
Packit Service 9ccfef
    NULL,		 "Bits",	       NULL,	   "BITS",
Packit Service 9ccfef
    NULL,		 "OctetString",	       NULL,	   "OCTET STRING",
Packit Service 9ccfef
    NULL,		 "ObjectIdentifier",   NULL,	   "OBJECT IDENTIFIER",
Packit Service 9ccfef
    NULL,		 "IpAddress",          NULL,	   "InetAddress",
Packit Service 9ccfef
    NULL,		 "Counter64",          NULL,	   "Unsigned64",
Packit Service 9ccfef
    NULL,		 "Counter32",          NULL,	   "Unsigned32",
Packit Service 9ccfef
    NULL,		 "Gauge32",            NULL,	   "Unsigned32",
Packit Service 9ccfef
    NULL, NULL, NULL, NULL };
Packit Service 9ccfef
Packit Service 9ccfef
static char *convertTypeMibToPib[] = {
Packit Service 9ccfef
    NULL,		 "SnmpAdminString",    NULL,	   "OCTET STRING",
Packit Service 9ccfef
    NULL, NULL, NULL, NULL };
Packit Service 9ccfef
Packit Service 9ccfef
static char *convertImport[] = {
Packit Service 9ccfef
    "SNMPv2-SMI", "Integer32",      "COPS-PR-SPPI", "Integer32",
Packit Service 9ccfef
    "SNMPv2-SMI", "Unsigned32",     "COPS-PR-SPPI", "Unsigned32",
Packit Service 9ccfef
    "SNMPv2-SMI", "TimeTicks",      "COPS-PR-SPPI", "TimeTicks",
Packit Service 9ccfef
    "SNMPv2-SMI", "IpAddress",      "INET-ADDRESS-MIB", "InetAddress",
Packit Service 9ccfef
    "SNMPv2-SMI", "MODULE-IDENTITY","COPS-PR-SPPI", "MODULE-IDENTITY",
Packit Service 9ccfef
    "SNMPv2-SMI", "MODULE-COMPLIANCE","COPS-PR-SPPI", "MODULE-COMPLIANCE",
Packit Service 9ccfef
    "SNMPv2-SMI", "OBJECT-TYPE",    "COPS-PR-SPPI", "OBJECT-TYPE",
Packit Service 9ccfef
    "SNMPv2-SMI", "OBJECT-IDENTITY","COPS-PR-SPPI", "OBJECT-IDENTITY",
Packit Service 9ccfef
    "SNMPv2-TC",  "TEXTUAL-CONVENTION","COPS-PR-SPPI", "TEXTUAL-CONVENTION",
Packit Service 9ccfef
    NULL, NULL, NULL, NULL };
Packit Service 9ccfef
Packit Service 9ccfef
static int current_column = 0;
Packit Service 9ccfef
static int silent = 0;
Packit Service 9ccfef
static int mibtopib = 0;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
typedef struct Import {
Packit Service 9ccfef
    char          *module;
Packit Service 9ccfef
    char          *name;
Packit Service 9ccfef
    struct Import *nextPtr;
Packit Service 9ccfef
} Import;
Packit Service 9ccfef
Packit Service 9ccfef
static Import *importList = NULL;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int invalidType(SmiBasetype basetype)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return (basetype == SMI_BASETYPE_FLOAT32)
Packit Service 9ccfef
	|| (basetype == SMI_BASETYPE_FLOAT64)
Packit Service 9ccfef
	|| (basetype == SMI_BASETYPE_FLOAT128);
Packit Service 9ccfef
}
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
					     "<unknown>";
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getAccessString(SmiAccess access, int pibaccess)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return
Packit Service 9ccfef
        (access == SMI_ACCESS_NOTIFY)	      ? "notify" :
Packit Service 9ccfef
        (access == SMI_ACCESS_INSTALL)	      ? "install" :
Packit Service 9ccfef
        (access == SMI_ACCESS_INSTALL_NOTIFY) ? "install-notify" :
Packit Service 9ccfef
        (access == SMI_ACCESS_REPORT_ONLY)    ? "report-only" :
Packit Service 9ccfef
        (access == SMI_ACCESS_NOT_ACCESSIBLE) ?
Packit Service 9ccfef
             (pibaccess == 1 ? "report-only" : "not-accessible") :
Packit Service 9ccfef
        mibtopib                              ? "notify" : 
Packit Service 9ccfef
					        "<unknown>";
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int isSmiOnlyType(char *type)
Packit Service 9ccfef
{
Packit Service 9ccfef
    return (!strcmp(type, "Counter32") ||
Packit Service 9ccfef
            !strcmp(type, "Counter64") ||
Packit Service 9ccfef
            !strcmp(type, "Gauge32"));
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getTimeString(time_t t)
Packit Service 9ccfef
{
Packit Service 9ccfef
    static char   *s = NULL;
Packit Service 9ccfef
    struct tm	  *tm;
Packit Service 9ccfef
Packit Service 9ccfef
    if (s) xfree(s);
Packit Service 9ccfef
Packit Service 9ccfef
    tm = gmtime(&t);
Packit Service 9ccfef
    smiAsprintf(&s, "%04d%02d%02d%02d%02dZ",
Packit Service 9ccfef
		tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
Packit Service 9ccfef
		tm->tm_hour, tm->tm_min);
Packit Service 9ccfef
    return s;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getTypeString(SmiBasetype basetype, SmiType *smiType)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int         i;
Packit Service 9ccfef
    char        *typeModule, *typeName;
Packit Service 9ccfef
Packit Service 9ccfef
    typeName = smiType ? smiType->name : NULL;
Packit Service 9ccfef
    typeModule = smiType ? smiGetTypeModule(smiType)->name : NULL;
Packit Service 9ccfef
Packit Service 9ccfef
    if (typeName &&
Packit Service 9ccfef
	(basetype != SMI_BASETYPE_ENUM) &&
Packit Service 9ccfef
	(basetype != SMI_BASETYPE_BITS)) {
Packit Service 9ccfef
        if (mibtopib)
Packit Service 9ccfef
            for(i=0; convertTypeMibToPib[i+1]; i += 4) {
Packit Service 9ccfef
	        if ((!strcmp(typeName, convertTypeMibToPib[i+1])) &&
Packit Service 9ccfef
	            ((!typeModule) || (!convertTypeMibToPib[i]) ||
Packit Service 9ccfef
	             (!strcmp(typeModule, convertTypeMibToPib[i])))) {
Packit Service 9ccfef
	            return convertTypeMibToPib[i+3];
Packit Service 9ccfef
	        }
Packit Service 9ccfef
            }
Packit Service 9ccfef
	for(i=0; convertType[i+1]; i += 4) {
Packit Service 9ccfef
	    if ((!strcmp(typeName, convertType[i+1])) &&
Packit Service 9ccfef
		((!typeModule) || (!convertType[i]) ||
Packit Service 9ccfef
		 (!strcmp(typeModule, convertType[i])))) {
Packit Service 9ccfef
		return convertType[i+3];
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if ((!typeModule) || (!strlen(typeModule)) || (!typeName)) {
Packit Service 9ccfef
	if (basetype == SMI_BASETYPE_ENUM) {
Packit Service 9ccfef
	    return "INTEGER";
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (basetype == SMI_BASETYPE_BITS) {
Packit Service 9ccfef
            return "BITS";
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
	
Packit Service 9ccfef
    /* TODO: fully qualified if unambigous */
Packit Service 9ccfef
Packit Service 9ccfef
    return typeName;
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->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 *getUppercaseString(char *s)
Packit Service 9ccfef
{
Packit Service 9ccfef
    static char *ss;
Packit Service 9ccfef
Packit Service 9ccfef
    ss = xstrdup(s);
Packit Service 9ccfef
    ss[0] = (char)toupper((int)ss[0]);
Packit Service 9ccfef
    return ss;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static int isObjectGroup(SmiNode *groupNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode     *smiNode;
Packit Service 9ccfef
    SmiElement  *smiElement;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (smiElement = smiGetFirstElement(groupNode); smiElement;
Packit Service 9ccfef
	 smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
Packit Service 9ccfef
	smiNode = smiGetElementNode(smiElement);
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (smiNode->nodekind != SMI_NODEKIND_SCALAR
Packit Service 9ccfef
	    && smiNode->nodekind != SMI_NODEKIND_COLUMN) {
Packit Service 9ccfef
	    return 0;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return 1;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static Import* addImport(char *module, char *name)
Packit Service 9ccfef
{
Packit Service 9ccfef
    Import **import, *newImport;
Packit Service 9ccfef
    int    i;
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0; convertImport[i]; i += 4) {
Packit Service 9ccfef
	if (convertImport[i] && convertImport[i+1]
Packit Service 9ccfef
	    && !strcmp(module, convertImport[i])
Packit Service 9ccfef
	    && !strcmp(name, convertImport[i+1])) {
Packit Service 9ccfef
	    module = convertImport[i+2];
Packit Service 9ccfef
	    name = convertImport[i+3];
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	} else if (convertImport[i] && !convertImport[i+1]
Packit Service 9ccfef
		   && !strcmp(module, convertImport[i])) {
Packit Service 9ccfef
	    module = convertImport[i+2];
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (!module || !name) {
Packit Service 9ccfef
	return NULL;
Packit Service 9ccfef
    }
Packit Service 9ccfef
	    
Packit Service 9ccfef
    for (import = &importList; *import; import = &(*import)->nextPtr) {
Packit Service 9ccfef
	int c = strcmp((*import)->module, module);
Packit Service 9ccfef
	if (c < 0) continue;
Packit Service 9ccfef
	if (c == 0) {
Packit Service 9ccfef
	    int d = strcmp((*import)->name, name);
Packit Service 9ccfef
	    if (d < 0) continue;
Packit Service 9ccfef
	    if (d == 0) return *import;
Packit Service 9ccfef
	    if (d > 0) break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (c > 0) break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    newImport = xmalloc(sizeof(Import));
Packit Service 9ccfef
    if (! newImport) {
Packit Service 9ccfef
	return NULL;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    newImport->module = module;
Packit Service 9ccfef
    newImport->name = name;
Packit Service 9ccfef
    newImport->nextPtr = *import;
Packit Service 9ccfef
    *import = newImport;
Packit Service 9ccfef
	
Packit Service 9ccfef
    return *import;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void createImportList(SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode     *smiNode;
Packit Service 9ccfef
    SmiType     *smiType;
Packit Service 9ccfef
    SmiNodekind kind = SMI_NODEKIND_SCALAR | SMI_NODEKIND_COLUMN;
Packit Service 9ccfef
    SmiImport   *smiImport;
Packit Service 9ccfef
    SmiModule	*smiModule2;
Packit Service 9ccfef
Packit Service 9ccfef
    if (mibtopib) {
Packit Service 9ccfef
        addImport("TUBS-SMI", "ibrmibtopib");
Packit Service 9ccfef
        if (smiGetFirstNode(smiModule, SMI_NODEKIND_COLUMN)) {
Packit Service 9ccfef
            addImport("COPS-PR-SPPI", "MODULE-COMPLIANCE");
Packit Service 9ccfef
            addImport("COPS-PR-SPPI", "OBJECT-GROUP");
Packit Service 9ccfef
            addImport("COPS-PR-SPPI", "OBJECT-IDENTITY");
Packit Service 9ccfef
            addImport("COPS-PR-SPPI-TC", "InstanceId");
Packit Service 9ccfef
        }
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    for(smiNode = smiGetFirstNode(smiModule, kind); smiNode;
Packit Service 9ccfef
	smiNode = smiGetNextNode(smiNode, kind)) {
Packit Service 9ccfef
	smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
	if (smiType && (smiType->decl == SMI_DECL_IMPLICIT_TYPE)) {
Packit Service 9ccfef
	    smiType = smiGetParentType(smiType);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (smiType) {
Packit Service 9ccfef
	    smiModule2 = smiGetTypeModule(smiType);
Packit Service 9ccfef
	    if (smiModule2 && (smiModule2 != smiModule)) {
Packit Service 9ccfef
		if (strlen(smiModule2->name) && smiType->name &&
Packit Service 9ccfef
                    !isSmiOnlyType(smiType->name)) {
Packit Service 9ccfef
		    addImport(smiModule2->name, smiType->name);
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiType && smiType->basetype == SMI_BASETYPE_INTEGER32) {
Packit Service 9ccfef
	    addImport("COPS-PR-SPPI", "Integer32");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiType && smiType->basetype == SMI_BASETYPE_INTEGER64) {
Packit Service 9ccfef
	    addImport("COPS-PR-SPPI", "Integer64");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiType && smiType->basetype == SMI_BASETYPE_UNSIGNED32) {
Packit Service 9ccfef
	    addImport("COPS-PR-SPPI", "Unsigned32");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiType && smiType->basetype == SMI_BASETYPE_UNSIGNED64) {
Packit Service 9ccfef
	    addImport("COPS-PR-SPPI", "Unsigned64");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if ((smiNode->value.basetype == SMI_BASETYPE_OBJECTIDENTIFIER) &&
Packit Service 9ccfef
	    (!strcmp(smiNode->value.value.ptr, "zeroDotZero"))) {
Packit Service 9ccfef
	    addImport("SNMPv2-SMI", "zeroDotZero");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    smiNode = smiGetFirstNode(smiModule,
Packit Service 9ccfef
			      SMI_NODEKIND_SCALAR | SMI_NODEKIND_COLUMN
Packit Service 9ccfef
			      | SMI_NODEKIND_TABLE | SMI_NODEKIND_ROW);
Packit Service 9ccfef
    if (smiNode) {
Packit Service 9ccfef
	addImport("COPS-PR-SPPI", "OBJECT-TYPE");
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    smiNode = smiGetModuleIdentityNode(smiModule);
Packit Service 9ccfef
    if (smiNode) {
Packit Service 9ccfef
	if (strcmp("COPS-PR-SPPI", smiModule->name)) {
Packit Service 9ccfef
	    addImport("COPS-PR-SPPI", "MODULE-IDENTITY");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
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
	if (smiNode->status != SMI_STATUS_UNKNOWN &&
Packit Service 9ccfef
	    smiNode != smiGetModuleIdentityNode(smiModule)) {
Packit Service 9ccfef
	    if (strcmp("COPS-PR-SPPI", smiModule->name)) {
Packit Service 9ccfef
		addImport("COPS-PR-SPPI", "OBJECT-IDENTITY");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_COMPLIANCE);
Packit Service 9ccfef
    if (smiNode) {
Packit Service 9ccfef
	if (strcmp("COPS-PR-SPPI", smiModule->name)) {
Packit Service 9ccfef
	    addImport("COPS-PR-SPPI", "MODULE-COMPLIANCE");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for(smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_GROUP);
Packit Service 9ccfef
	smiNode;
Packit Service 9ccfef
	smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_GROUP)) {
Packit Service 9ccfef
	if (strcmp("COPS-PR-SPPI", smiModule->name)) {
Packit Service 9ccfef
	    addImport("COPS-PR-SPPI", "OBJECT-GROUP");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for(smiType = smiGetFirstType(smiModule);
Packit Service 9ccfef
	smiType; smiType = smiGetNextType(smiType)) {
Packit Service 9ccfef
	if (smiType->description) {
Packit Service 9ccfef
	    if (strcmp("COPS-PR-SPPI", smiModule->name)) {
Packit Service 9ccfef
		addImport("COPS-PR-SPPI", "TEXTUAL-CONVENTION");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
        if (smiType->decl == SMI_DECL_TEXTUALCONVENTION) {
Packit Service 9ccfef
            switch (smiType->basetype) {
Packit Service 9ccfef
	    case SMI_BASETYPE_INTEGER32:
Packit Service 9ccfef
		addImport("COPS-PR-SPPI", "Integer32");
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    case SMI_BASETYPE_INTEGER64:
Packit Service 9ccfef
		addImport("COPS-PR-SPPI", "Integer64");
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    case SMI_BASETYPE_UNSIGNED32:
Packit Service 9ccfef
		addImport("COPS-PR-SPPI", "Unsigned32");
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    case SMI_BASETYPE_UNSIGNED64:
Packit Service 9ccfef
		addImport("COPS-PR-SPPI", "Unsigned64");
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    default:
Packit Service 9ccfef
		break;
Packit Service 9ccfef
            }
Packit Service 9ccfef
        }
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiImport = smiGetFirstImport(smiModule); smiImport;
Packit Service 9ccfef
	 smiImport = smiGetNextImport(smiImport)) {
Packit Service 9ccfef
	if ((islower((int) smiImport->name[0]) ||
Packit Service 9ccfef
	    (smiImport->module && !strcmp(smiImport->module, "SNMPv2-SMI")) ||
Packit Service 9ccfef
	    (smiImport->module && !strcmp(smiImport->module, "SNMPv2-TC"))) &&
Packit Service 9ccfef
            !isSmiOnlyType(smiImport->name)) {
Packit Service 9ccfef
	    addImport(smiImport->module, smiImport->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void freeImportList(void)
Packit Service 9ccfef
{
Packit Service 9ccfef
    Import *import, *freeme;
Packit Service 9ccfef
Packit Service 9ccfef
    for (import = importList; import; ) {
Packit Service 9ccfef
	freeme = import;
Packit Service 9ccfef
	import = import->nextPtr;
Packit Service 9ccfef
	xfree(freeme);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    importList = NULL;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprint(FILE *f, char *fmt, ...)
Packit Service 9ccfef
{
Packit Service 9ccfef
    va_list ap;
Packit Service 9ccfef
    char    *s;
Packit Service 9ccfef
    char    *p;
Packit Service 9ccfef
    
Packit Service 9ccfef
    va_start(ap, fmt);
Packit Service 9ccfef
    current_column += smiVasprintf(&s, fmt, ap);
Packit Service 9ccfef
    va_end(ap);
Packit Service 9ccfef
    fputs(s, f);
Packit Service 9ccfef
    if ((p = strrchr(s, '\n'))) {
Packit Service 9ccfef
	current_column = strlen(p) - 1;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    free(s);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintSegment(FILE *f, int column, char *string,
Packit Service 9ccfef
			  int length, int comment)
Packit Service 9ccfef
{
Packit Service 9ccfef
    char *format;
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (comment) {
Packit Service 9ccfef
	format = "-- %*c%s";
Packit Service 9ccfef
	/* if (column >= 3) column -= 3; */
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	format = "%*c%s";
Packit Service 9ccfef
    }
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprint(f, format, column, ' ', string);
Packit Service 9ccfef
    if (length) {
Packit Service 9ccfef
	fprint(f, "%*c", length - strlen(string) - column, ' ');
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintWrapped(FILE *f, int column, char *string, int comment)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if ((current_column + strlen(string)) > INDENTMAX) {
Packit Service 9ccfef
	putc('\n', f);
Packit Service 9ccfef
	current_column = 0;
Packit Service 9ccfef
	fprintSegment(f, column, "", 0, comment);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprint(f, "%s", string);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintMultilineString(FILE *f, const char *s, const int comment)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i, len;
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprintSegment(f, INDENTTEXTS - 1, "\"", 0, comment);
Packit Service 9ccfef
    if (s) {
Packit Service 9ccfef
	len = strlen(s);
Packit Service 9ccfef
	for (i=0; i < len; i++) {
Packit Service 9ccfef
	    putc(s[i], f);
Packit Service 9ccfef
	    current_column++;
Packit Service 9ccfef
	    if (s[i] == '\n') {
Packit Service 9ccfef
		current_column = 0;
Packit Service 9ccfef
		fprintSegment(f, INDENTTEXTS, "", 0, comment);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    putc('\"', f);
Packit Service 9ccfef
    current_column++;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getValueString(SmiValue *valuePtr, SmiType *typePtr)
Packit Service 9ccfef
{
Packit Service 9ccfef
    static char    s[1024];
Packit Service 9ccfef
    char           ss[9];
Packit Service 9ccfef
    int		   n;
Packit Service 9ccfef
    unsigned int   i;
Packit Service 9ccfef
    SmiNamedNumber *nn;
Packit Service 9ccfef
    SmiNode        *nodePtr;
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_ENUM:
Packit Service 9ccfef
	for (nn = smiGetFirstNamedNumber(typePtr); nn;
Packit Service 9ccfef
	     nn = smiGetNextNamedNumber(nn)) {
Packit Service 9ccfef
	    if (nn->value.value.unsigned32 == valuePtr->value.unsigned32)
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (nn) {
Packit Service 9ccfef
	    sprintf(s, "%s", nn->name);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    sprintf(s, "%ld", valuePtr->value.integer32);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_OCTETSTRING:
Packit Service 9ccfef
	for (i = 0; i < valuePtr->len; i++) {
Packit Service 9ccfef
	    if (!isprint((int)valuePtr->value.ptr[i])) break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (i == valuePtr->len) {
Packit Service 9ccfef
	    sprintf(s, "\"%s\"", valuePtr->value.ptr);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
            sprintf(s, "'%*s'H", 2 * valuePtr->len, " ");
Packit Service 9ccfef
            for (i=0; i < valuePtr->len; i++) {
Packit Service 9ccfef
                sprintf(ss, "%02x", valuePtr->value.ptr[i]);
Packit Service 9ccfef
                strncpy(&s[1+2*i], ss, 2);
Packit Service 9ccfef
            }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_BITS:
Packit Service 9ccfef
	sprintf(s, "{");
Packit Service 9ccfef
	for (i = 0, n = 0; i < valuePtr->len * 8; i++) {
Packit Service 9ccfef
	    if (valuePtr->value.ptr[i/8] & (1 << (7-(i%8)))) {
Packit Service 9ccfef
		for (nn = smiGetFirstNamedNumber(typePtr); nn;
Packit Service 9ccfef
		     nn = smiGetNextNamedNumber(nn)) {
Packit Service 9ccfef
		    if (nn->value.value.unsigned32 == i)
Packit Service 9ccfef
			break;
Packit Service 9ccfef
		}
Packit Service 9ccfef
		if (nn) {
Packit Service 9ccfef
		    if (n)
Packit Service 9ccfef
			sprintf(&s[strlen(s)], ", ");
Packit Service 9ccfef
		    n++;
Packit Service 9ccfef
		    sprintf(&s[strlen(s)], "%s", nn->name);
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
	sprintf(&s[strlen(s)], "}");
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
    case SMI_BASETYPE_UNKNOWN:
Packit Service 9ccfef
    case SMI_BASETYPE_POINTER:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_BASETYPE_OBJECTIDENTIFIER:
Packit Service 9ccfef
	nodePtr = smiGetNodeByOID(valuePtr->len, valuePtr->value.oid);
Packit Service 9ccfef
	if (nodePtr) {
Packit Service 9ccfef
	    sprintf(s, "%s", nodePtr->name);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    strcpy(s, "{");
Packit Service 9ccfef
	    for (i=0; i < valuePtr->len; i++) {
Packit Service 9ccfef
		if (i) strcat(s, " ");
Packit Service 9ccfef
		sprintf(&s[strlen(s)], "%u", valuePtr->value.oid[i]);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    strcat(s, "}");
Packit Service 9ccfef
	}
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 fprintSubtype(FILE *f, SmiType *smiType, const int comment)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiRange       *range;
Packit Service 9ccfef
    SmiNamedNumber *nn;
Packit Service 9ccfef
    char	   s[1024];
Packit Service 9ccfef
    int		   i;
Packit Service 9ccfef
Packit Service 9ccfef
    if ((smiType->basetype == SMI_BASETYPE_ENUM) ||
Packit Service 9ccfef
	(smiType->basetype == SMI_BASETYPE_BITS)) {
Packit Service 9ccfef
	for(i = 0, nn = smiGetFirstNamedNumber(smiType);
Packit Service 9ccfef
	    nn; i++, nn = smiGetNextNamedNumber(nn)) {
Packit Service 9ccfef
	    if (i) {
Packit Service 9ccfef
		fprint(f, ", ");
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		if (comment) {
Packit Service 9ccfef
		    fprint(f, "\n");
Packit Service 9ccfef
		    fprintSegment(f, INDENT, "", INDENTVALUE, comment);
Packit Service 9ccfef
		    fprint(f, "  { ");
Packit Service 9ccfef
		} else {
Packit Service 9ccfef
		    fprint(f, " { ");
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    sprintf(s, "%s(%s)", nn->name,
Packit Service 9ccfef
		    getValueString(&nn->value, smiType));
Packit Service 9ccfef
	    fprintWrapped(f, INDENTVALUE + INDENT, s, comment);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (i) {
Packit Service 9ccfef
	    fprint(f, " }");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    } else {
Packit Service 9ccfef
	for(i = 0, range = smiGetFirstRange(smiType);
Packit Service 9ccfef
	    range; i++, range = smiGetNextRange(range)) {
Packit Service 9ccfef
	    if (i) {
Packit Service 9ccfef
		fprint(f, " | ");
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		if (smiType->basetype == SMI_BASETYPE_OCTETSTRING) {
Packit Service 9ccfef
		    fprint(f, " (SIZE(");
Packit Service 9ccfef
		} else {
Packit Service 9ccfef
		    fprint(f, " (");
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }	    
Packit Service 9ccfef
	    if (memcmp(&range->minValue, &range->maxValue,
Packit Service 9ccfef
		       sizeof(SmiValue))) {
Packit Service 9ccfef
		sprintf(s, "%s", getValueString(&range->minValue, smiType));
Packit Service 9ccfef
		sprintf(&s[strlen(s)], "..%s", 
Packit Service 9ccfef
			getValueString(&range->maxValue, smiType));
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		sprintf(s, "%s", getValueString(&range->minValue, smiType));
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintWrapped(f, INDENTVALUE + INDENT, s, 0);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	if (i) {
Packit Service 9ccfef
	    if (smiType->basetype == SMI_BASETYPE_OCTETSTRING) {
Packit Service 9ccfef
		fprint(f, ")");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprint(f, ")");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintIndex(FILE *f, SmiNode *indexNode, const int comment)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    int        n, j;
Packit Service 9ccfef
Packit Service 9ccfef
    /* PIBs can contain both a PIB-INDEX | EXTENDS | AUGMENTS and an
Packit Service 9ccfef
       INDEX clause. The index list's first element is the PIB-INDEX
Packit Service 9ccfef
       (or EXTENDS/AUGMENTS) followed by the elements belonging to the
Packit Service 9ccfef
       INDEX clause. */
Packit Service 9ccfef
    
Packit Service 9ccfef
    for (n = 0, smiElement = smiGetFirstElement(indexNode); smiElement;
Packit Service 9ccfef
	 n++, smiElement = smiGetNextElement(smiElement));
Packit Service 9ccfef
    if (mibtopib) {
Packit Service 9ccfef
        SmiNode *smiParentNode = smiGetParentNode(indexNode);
Packit Service 9ccfef
        size_t len = strlen(smiParentNode->name);
Packit Service 9ccfef
        char *instanceId = xmalloc(len + 11);
Packit Service 9ccfef
Packit Service 9ccfef
        strcpy(instanceId, smiParentNode->name);
Packit Service 9ccfef
        if (len > 54)
Packit Service 9ccfef
          len = 54;
Packit Service 9ccfef
        strcpy(&instanceId[len], "InstanceId");
Packit Service 9ccfef
        fprintSegment(f, INDENT, "PIB-INDEX", INDENTVALUE, 0);
Packit Service 9ccfef
        fprint(f, "{ ");
Packit Service 9ccfef
        fprintWrapped(f, INDENTVALUE + 2, instanceId, 0);
Packit Service 9ccfef
        fprint(f, " }\n");
Packit Service 9ccfef
        fprintSegment(f, INDENT, "INDEX", INDENTVALUE, 0);
Packit Service 9ccfef
        fprint(f, "{ ");
Packit Service 9ccfef
        for (j = 0, smiElement = smiGetFirstElement(indexNode); smiElement;
Packit Service 9ccfef
	     j++, smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
             if (j)
Packit Service 9ccfef
                 fprint(f, ", ");
Packit Service 9ccfef
             fprintWrapped(f, INDENTVALUE + 2,
Packit Service 9ccfef
                           smiGetElementNode(smiElement)->name, 0);
Packit Service 9ccfef
        }
Packit Service 9ccfef
        xfree(instanceId);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    else
Packit Service 9ccfef
        for (j = 0, smiElement = smiGetFirstElement(indexNode); smiElement;
Packit Service 9ccfef
	     j++, smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
            if (!j) {
Packit Service 9ccfef
                switch (indexNode->indexkind) {
Packit Service 9ccfef
                    case SMI_INDEX_INDEX:
Packit Service 9ccfef
                        fprintSegment(f, INDENT, "PIB-INDEX", INDENTVALUE,
Packit Service 9ccfef
                                      comment);
Packit Service 9ccfef
                        break;
Packit Service 9ccfef
                    case SMI_INDEX_AUGMENT:
Packit Service 9ccfef
                        fprintSegment(f, INDENT, "AUGMENTS", INDENTVALUE,
Packit Service 9ccfef
                                      comment);
Packit Service 9ccfef
                        break;
Packit Service 9ccfef
                    case SMI_INDEX_SPARSE:
Packit Service 9ccfef
                        fprintSegment(f, INDENT, "EXTENDS", INDENTVALUE,
Packit Service 9ccfef
                                      comment);
Packit Service 9ccfef
                        break;
Packit Service 9ccfef
		    case SMI_INDEX_UNKNOWN:
Packit Service 9ccfef
		    case SMI_INDEX_REORDER:
Packit Service 9ccfef
		    case SMI_INDEX_EXPAND:
Packit Service 9ccfef
                        fprintSegment(f, INDENT, "-- unsupported indexing --",
Packit Service 9ccfef
				      INDENTVALUE, comment);
Packit Service 9ccfef
			break;
Packit Service 9ccfef
                }
Packit Service 9ccfef
                fprint(f, "{ ");
Packit Service 9ccfef
            } else if (j == 1) {
Packit Service 9ccfef
                fprint(f, " }\n");
Packit Service 9ccfef
                fprintSegment(f, INDENT, "INDEX", INDENTVALUE, comment);
Packit Service 9ccfef
                fprint(f, "{ ");
Packit Service 9ccfef
            } else
Packit Service 9ccfef
	        fprint(f, ", ");
Packit Service 9ccfef
	    if (indexNode->implied && ((j+1) == n)) {
Packit Service 9ccfef
	        fprintWrapped(f, INDENTVALUE + 2, "IMPLIED ", 0);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintWrapped(f, INDENTVALUE + 2,
Packit Service 9ccfef
		          smiGetElementNode(smiElement)->name, 0);
Packit Service 9ccfef
	    /* TODO: non-local name if non-local */
Packit Service 9ccfef
        } /* TODO: empty? -> print error */
Packit Service 9ccfef
    fprint(f, " }\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintUniqueness(FILE *f, SmiNode *indexNode, const int comment)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    int        j;
Packit Service 9ccfef
Packit Service 9ccfef
    smiElement = smiGetFirstUniquenessElement(indexNode);
Packit Service 9ccfef
    if (!smiElement)
Packit Service 9ccfef
        return;
Packit Service 9ccfef
    fprintSegment(f, INDENT, "UNIQUENESS", INDENTVALUE, comment);
Packit Service 9ccfef
    fprint(f, "{ ");
Packit Service 9ccfef
    for (j = 0; smiElement; j++,
Packit Service 9ccfef
         smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
        if (j)
Packit Service 9ccfef
	    fprint(f, ", ");
Packit Service 9ccfef
	fprintWrapped(f, INDENTVALUE + 2,
Packit Service 9ccfef
		      smiGetElementNode(smiElement)->name, 0);
Packit Service 9ccfef
	/* TODO: non-local name if non-local */
Packit Service 9ccfef
    } /* TODO: empty? -> print error */
Packit Service 9ccfef
    fprint(f, " }\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintInstallErrors(FILE *f, SmiNode *indexNode, const int comment)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    SmiNode    *smiNode;
Packit Service 9ccfef
    int        j;
Packit Service 9ccfef
    char       *id;
Packit Service 9ccfef
Packit Service 9ccfef
    smiElement = smiGetFirstElement(indexNode);
Packit Service 9ccfef
    if (!smiElement)
Packit Service 9ccfef
        return;
Packit Service 9ccfef
    fprintSegment(f, INDENT, "INSTALL-ERRORS", INDENTVALUE, comment);
Packit Service 9ccfef
    fprint(f, "{ ");
Packit Service 9ccfef
    for (j = 0; smiElement; j++,
Packit Service 9ccfef
         smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
        smiNode = smiGetElementNode(smiElement);
Packit Service 9ccfef
        id = xmalloc(strlen(smiNode->name) + 10);
Packit Service 9ccfef
        sprintf(id, "%s (%ld)%s", smiNode->name,
Packit Service 9ccfef
                smiNode->oidlen ? (long)smiNode->oid : 0,
Packit Service 9ccfef
                smiGetNextElement(smiElement) ? ", " : "");
Packit Service 9ccfef
        fprintWrapped(f, 2+INDENTVALUE, id, 0);
Packit Service 9ccfef
        xfree(id);
Packit Service 9ccfef
	/* TODO: non-local name if non-local */
Packit Service 9ccfef
    } /* TODO: empty? -> print error */
Packit Service 9ccfef
    fprint(f, " }\n");
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintImports(FILE *f)
Packit Service 9ccfef
{
Packit Service 9ccfef
    Import        *import;
Packit Service 9ccfef
    char	  *lastModulename = NULL;
Packit Service 9ccfef
    char	  *importedModulename, *importedDescriptor;
Packit Service 9ccfef
    int		  i;
Packit Service 9ccfef
Packit Service 9ccfef
    for(import = importList; import; import = import->nextPtr) {
Packit Service 9ccfef
	importedModulename = import->module;
Packit Service 9ccfef
	importedDescriptor = import->name;
Packit Service 9ccfef
Packit Service 9ccfef
	if (!strlen(importedModulename))
Packit Service 9ccfef
	    continue;
Packit Service 9ccfef
	
Packit Service 9ccfef
	for(i = 0; convertImport[i]; i += 4) {
Packit Service 9ccfef
	    if (convertImport[i] && convertImport[i+1]
Packit Service 9ccfef
		&& !strcmp(importedModulename, convertImport[i])
Packit Service 9ccfef
		&& !strcmp(importedDescriptor, convertImport[i+1])) {
Packit Service 9ccfef
		importedModulename = convertImport[i+2];
Packit Service 9ccfef
		importedDescriptor = convertImport[i+3];
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    } else if (convertImport[i] && !convertImport[i+1]
Packit Service 9ccfef
		       && !strcmp(importedModulename, convertImport[i])) {
Packit Service 9ccfef
		importedModulename = convertImport[i+2];
Packit Service 9ccfef
		break;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (importedModulename && importedDescriptor &&
Packit Service 9ccfef
	    strlen(importedDescriptor)) {
Packit Service 9ccfef
	    if ((!lastModulename) ||
Packit Service 9ccfef
		strcmp(importedModulename, lastModulename)) {
Packit Service 9ccfef
		if (!lastModulename) {
Packit Service 9ccfef
		    fprint(f, "IMPORTS");
Packit Service 9ccfef
		} else {
Packit Service 9ccfef
		    fprint(f, "\n");
Packit Service 9ccfef
		    fprintSegment(f, 2 * INDENT, "", 0, 0);
Packit Service 9ccfef
		    fprint(f, "FROM %s", lastModulename);
Packit Service 9ccfef
		}
Packit Service 9ccfef
		fprint(f, "\n");
Packit Service 9ccfef
		fprintSegment(f, INDENT, "", 0, 0);
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprint(f, ", ");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintWrapped(f, INDENT, importedDescriptor, 0);
Packit Service 9ccfef
	    lastModulename = importedModulename;
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    if (lastModulename) {
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintSegment(f, 2 * INDENT, "", 0, 0);
Packit Service 9ccfef
	fprint(f, "FROM %s;\n\n", lastModulename);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintModuleIdentity(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiRevision  *smiRevision;
Packit Service 9ccfef
    SmiNode      *smiNode, *smiNode2;
Packit Service 9ccfef
    SmiElement   *smiElement;
Packit Service 9ccfef
    char         *id;
Packit Service 9ccfef
Packit Service 9ccfef
    smiNode = smiGetModuleIdentityNode(smiModule);
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (smiNode) {
Packit Service 9ccfef
Packit Service 9ccfef
        fprint(f, "%s MODULE-IDENTITY\n", smiNode->name);
Packit Service 9ccfef
        fprintSegment(f, INDENT, "SUBJECT-CATEGORIES", INDENTVALUE, 0);
Packit Service 9ccfef
        fprint(f, "{ ");
Packit Service 9ccfef
        smiElement = smiGetFirstElement(smiNode);
Packit Service 9ccfef
        if (smiElement && smiGetElementNode(smiElement))
Packit Service 9ccfef
        {
Packit Service 9ccfef
            for (; smiElement; smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
                smiNode2 = smiGetElementNode(smiElement);
Packit Service 9ccfef
                id = xmalloc(strlen(smiNode2->name) + 10);
Packit Service 9ccfef
                if (smiNode2->oidlen)
Packit Service 9ccfef
                    sprintf(id, "%s (%ld)%s", smiNode2->name, (long)smiNode2->oid,
Packit Service 9ccfef
                            smiGetNextElement(smiElement) ? ", " : "");
Packit Service 9ccfef
                else
Packit Service 9ccfef
                    sprintf(id, "%s%s", smiNode2->name,
Packit Service 9ccfef
                            smiGetNextElement(smiElement) ? ", " : "");
Packit Service 9ccfef
                fprintWrapped(f, 2+INDENTVALUE, id, 0);
Packit Service 9ccfef
                xfree(id);
Packit Service 9ccfef
            }
Packit Service 9ccfef
            fprint(f, " }\n");
Packit Service 9ccfef
        } else {
Packit Service 9ccfef
        /* No SUBJECT-CATEGORIES entry was present, add one */
Packit Service 9ccfef
            fprint(f, "all } -- added by smidump\n");
Packit Service 9ccfef
        }
Packit Service 9ccfef
	fprintSegment(f, INDENT, "LAST-UPDATED", INDENTVALUE, 0);
Packit Service 9ccfef
	smiRevision = smiGetFirstRevision(smiModule);
Packit Service 9ccfef
	if (smiRevision)
Packit Service 9ccfef
	    fprint(f, "\"%s\"\n", getTimeString(smiRevision->date));
Packit Service 9ccfef
	else
Packit Service 9ccfef
	    fprint(f, "\"197001010000Z\"\n");
Packit Service 9ccfef
	fprintSegment(f, INDENT, "ORGANIZATION", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, smiModule->organization, 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintSegment(f, INDENT, "CONTACT-INFO", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, smiModule->contactinfo, 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintSegment(f, INDENT, "DESCRIPTION", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	if (smiModule->description) {
Packit Service 9ccfef
	    fprintMultilineString(f, smiModule->description, 0);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprintMultilineString(f, "...", 0);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
Packit Service 9ccfef
	for(; smiRevision;
Packit Service 9ccfef
	    smiRevision = smiGetNextRevision(smiRevision)) {
Packit Service 9ccfef
	    if (!smiRevision->description
Packit Service 9ccfef
		|| strcmp(smiRevision->description,
Packit Service 9ccfef
       "[Revision added by libsmi due to a LAST-UPDATED clause.]")) {
Packit Service 9ccfef
		fprintSegment(f, INDENT, "REVISION", INDENTVALUE, 0);
Packit Service 9ccfef
		fprint(f, "\"%s\"\n", getTimeString(smiRevision->date));
Packit Service 9ccfef
		fprintSegment(f, INDENT, "DESCRIPTION", INDENTVALUE,
Packit Service 9ccfef
			      0);
Packit Service 9ccfef
		fprint(f, "\n");
Packit Service 9ccfef
		if (smiRevision->description) {
Packit Service 9ccfef
		    fprintMultilineString(f, smiRevision->description,
Packit Service 9ccfef
					  0);
Packit Service 9ccfef
		} else {
Packit Service 9ccfef
		    fprintMultilineString(f, "...", 0);
Packit Service 9ccfef
		}
Packit Service 9ccfef
		fprint(f, "\n");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiNode) {
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "::= ", 0, 0);
Packit Service 9ccfef
            if (!mibtopib)
Packit Service 9ccfef
	        fprint(f, "{ %s }\n\n", getOidString(smiNode, 0));
Packit Service 9ccfef
            else
Packit Service 9ccfef
                fprint(f, "{ ibrmibtopib %d }\n\n",
Packit Service 9ccfef
                       smiNode->oid[smiNode->oidlen - 1]);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	/* TODO: else error */
Packit Service 9ccfef
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintTypeDefinitions(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiType	 *smiType;
Packit Service 9ccfef
    int		 invalid;
Packit Service 9ccfef
Packit Service 9ccfef
    for(smiType = smiGetFirstType(smiModule);
Packit Service 9ccfef
	smiType; smiType = smiGetNextType(smiType)) {
Packit Service 9ccfef
	if (smiType->status == SMI_STATUS_UNKNOWN) {
Packit Service 9ccfef
	    invalid = invalidType(smiType->basetype);
Packit Service 9ccfef
	    if (invalid) {
Packit Service 9ccfef
		fprint(f, "-- %s ::=\n", smiType->name);
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprint(f, "%s ::=\n", smiType->name);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "", 0, invalid);
Packit Service 9ccfef
	    fprint(f, "%s", getTypeString(smiType->basetype,
Packit Service 9ccfef
					  smiGetParentType(smiType)));
Packit Service 9ccfef
	    fprintSubtype(f, smiType, invalid);
Packit Service 9ccfef
	    fprint(f, "\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintTextualConventions(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiType	 *smiType;
Packit Service 9ccfef
    int		 invalid;
Packit Service 9ccfef
    
Packit Service 9ccfef
    for(smiType = smiGetFirstType(smiModule);
Packit Service 9ccfef
	smiType; smiType = smiGetNextType(smiType)) {
Packit Service 9ccfef
	if (smiType->status != SMI_STATUS_UNKNOWN) {
Packit Service 9ccfef
	    invalid = invalidType(smiType->basetype);
Packit Service 9ccfef
            fprint(f, "%s ::= TEXTUAL-CONVENTION\n", smiType->name);
Packit Service 9ccfef
Packit Service 9ccfef
	    if (smiType->format) {
Packit Service 9ccfef
		fprintSegment(f, INDENT, "DISPLAY-HINT", INDENTVALUE,
Packit Service 9ccfef
			      invalid);
Packit Service 9ccfef
		fprint(f, "\"%s\"\n", smiType->format);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "STATUS", INDENTVALUE,
Packit Service 9ccfef
			  invalid);
Packit Service 9ccfef
	    fprint(f, "%s\n", getStatusString(smiType->status));
Packit Service 9ccfef
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "DESCRIPTION", INDENTVALUE,
Packit Service 9ccfef
			  invalid);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    if (smiType->description) {
Packit Service 9ccfef
		fprintMultilineString(f, smiType->description,
Packit Service 9ccfef
				      invalid);
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprintMultilineString(f, "...", invalid);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
Packit Service 9ccfef
	    if (smiType->reference) {
Packit Service 9ccfef
		fprintSegment(f, INDENT, "REFERENCE", INDENTVALUE,
Packit Service 9ccfef
			      invalid);
Packit Service 9ccfef
		fprint(f, "\n");
Packit Service 9ccfef
		fprintMultilineString(f, smiType->reference,
Packit Service 9ccfef
				      invalid);
Packit Service 9ccfef
		fprint(f, "\n");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "SYNTAX", INDENTVALUE,
Packit Service 9ccfef
			  invalid);
Packit Service 9ccfef
	    fprint(f, "%s",
Packit Service 9ccfef
		   getTypeString(smiType->basetype,
Packit Service 9ccfef
				 smiGetParentType(smiType)));
Packit Service 9ccfef
	    fprintSubtype(f, smiType, invalid);
Packit Service 9ccfef
	    fprint(f, "\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintObjects(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode	 *smiNode, *rowNode, *colNode, *smiParentNode, *relatedNode;
Packit Service 9ccfef
    SmiType	 *smiType;
Packit Service 9ccfef
    SmiNodekind  nodekinds;
Packit Service 9ccfef
    int		 i, invalid, create, assignement, indentsequence, addinstanceid;
Packit Service 9ccfef
    
Packit Service 9ccfef
    nodekinds =  SMI_NODEKIND_NODE | SMI_NODEKIND_TABLE |
Packit Service 9ccfef
	SMI_NODEKIND_ROW | SMI_NODEKIND_COLUMN | SMI_NODEKIND_SCALAR;
Packit Service 9ccfef
            
Packit Service 9ccfef
    for(smiNode = smiGetFirstNode(smiModule, nodekinds);
Packit Service 9ccfef
	smiNode; smiNode = smiGetNextNode(smiNode, nodekinds)) {
Packit Service 9ccfef
Packit Service 9ccfef
	smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
	smiParentNode = smiGetParentNode(smiNode);
Packit Service 9ccfef
	
Packit Service 9ccfef
	create = smiParentNode ? smiParentNode->create : 0;
Packit Service 9ccfef
	
Packit Service 9ccfef
	invalid = !smiType ? 0 : invalidType(smiType->basetype);
Packit Service 9ccfef
	assignement = 0;
Packit Service 9ccfef
Packit Service 9ccfef
	if (invalid && silent
Packit Service 9ccfef
	    && (smiNode->nodekind == SMI_NODEKIND_SCALAR
Packit Service 9ccfef
		|| smiNode->nodekind == SMI_NODEKIND_COLUMN)) {
Packit Service 9ccfef
	    continue;
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiNode == smiGetModuleIdentityNode(smiModule)) {
Packit Service 9ccfef
	    continue;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if ((smiNode->nodekind == SMI_NODEKIND_NODE) &&
Packit Service 9ccfef
	    (smiNode->status == SMI_STATUS_UNKNOWN)) {
Packit Service 9ccfef
	    assignement = 1;
Packit Service 9ccfef
	    fprint(f, "%s OBJECT IDENTIFIER\n", smiNode->name);
Packit Service 9ccfef
	} else if (smiNode->nodekind == SMI_NODEKIND_NODE) {
Packit Service 9ccfef
	    fprint(f, "%s OBJECT-IDENTITY\n", smiNode->name);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    if (invalid) {
Packit Service 9ccfef
		fprint(f, "-- %s OBJECT-TYPE\n", smiNode->name);
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprint(f, "%s OBJECT-TYPE\n", smiNode->name);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if ((smiNode->nodekind == SMI_NODEKIND_TABLE) ||
Packit Service 9ccfef
	    (smiNode->nodekind == SMI_NODEKIND_ROW) ||
Packit Service 9ccfef
	    (smiType)) {	    fprintSegment(f, INDENT, "SYNTAX", INDENTVALUE, invalid);
Packit Service 9ccfef
	    if (smiNode->nodekind == SMI_NODEKIND_TABLE) {
Packit Service 9ccfef
		fprint(f, "SEQUENCE OF ");
Packit Service 9ccfef
		rowNode = smiGetFirstChildNode(smiNode);
Packit Service 9ccfef
		if (rowNode) {
Packit Service 9ccfef
		    smiType = smiGetNodeType(rowNode);
Packit Service 9ccfef
		    if (smiType) {
Packit Service 9ccfef
			fprint(f, "%s\n", smiType->name);
Packit Service 9ccfef
		    } else {
Packit Service 9ccfef
			/* guess type name is uppercase row name */
Packit Service 9ccfef
			char *s = getUppercaseString(rowNode->name);
Packit Service 9ccfef
			fprint(f, "%s\n", s);
Packit Service 9ccfef
			xfree(s);
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    /* TODO: print non-local name qualified */
Packit Service 9ccfef
		} else {
Packit Service 9ccfef
		    fprint(f, "<unknown>\n");
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    } else if (smiNode->nodekind == SMI_NODEKIND_ROW) {
Packit Service 9ccfef
		if (smiType) {
Packit Service 9ccfef
		    fprint(f, "%s\n", smiType->name);
Packit Service 9ccfef
		} else {
Packit Service 9ccfef
		    char *s = getUppercaseString(smiNode->name);
Packit Service 9ccfef
		    /* guess type name is uppercase row name */
Packit Service 9ccfef
		    fprint(f, "%s\n", s);
Packit Service 9ccfef
		    xfree(s);
Packit Service 9ccfef
		}
Packit Service 9ccfef
		/* TODO: print non-local name qualified */
Packit Service 9ccfef
	    } else if (smiType) {
Packit Service 9ccfef
		if (!smiType->name) {
Packit Service 9ccfef
		    /*
Packit Service 9ccfef
		     * an implicitly restricted type.
Packit Service 9ccfef
		     */
Packit Service 9ccfef
		    fprint(f, "%s", getTypeString(smiType->basetype,
Packit Service 9ccfef
						  smiGetParentType(smiType)));
Packit Service 9ccfef
		    fprintSubtype(f, smiType, invalid);
Packit Service 9ccfef
		    fprint(f, "\n");
Packit Service 9ccfef
		} else {
Packit Service 9ccfef
		    fprint(f, "%s\n",
Packit Service 9ccfef
			   getTypeString(smiType->basetype, smiType));
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (! assignement && smiNode->nodekind == SMI_NODEKIND_TABLE) {
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "PIB-ACCESS", INDENTVALUE, 0);
Packit Service 9ccfef
	    fprint(f, "%s\n", getAccessString(smiNode->access, 1));
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
        if (! assignement && smiType && smiType->name &&
Packit Service 9ccfef
            !strcmp(smiType->name, "ReferenceId")) {
Packit Service 9ccfef
            relatedNode = smiGetRelatedNode(smiNode);
Packit Service 9ccfef
            if (relatedNode) {
Packit Service 9ccfef
                fprintSegment(f, INDENT, "PIB-REFERENCES", INDENTVALUE, 0);
Packit Service 9ccfef
                fprint(f, "{ %s }\n", relatedNode->name);
Packit Service 9ccfef
            }
Packit Service 9ccfef
        }
Packit Service 9ccfef
Packit Service 9ccfef
        if (! assignement && smiType && smiType->name &&
Packit Service 9ccfef
            !strcmp(smiType->name, "TagReferenceId")) {
Packit Service 9ccfef
            relatedNode = smiGetRelatedNode(smiNode);
Packit Service 9ccfef
            if (relatedNode) {
Packit Service 9ccfef
                fprintSegment(f, INDENT, "PIB-TAG", INDENTVALUE, 0);
Packit Service 9ccfef
                fprint(f, "{ %s }\n", relatedNode->name);
Packit Service 9ccfef
            }
Packit Service 9ccfef
        }
Packit Service 9ccfef
Packit Service 9ccfef
	if (! assignement) {
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "STATUS", INDENTVALUE, invalid);
Packit Service 9ccfef
	    fprint(f, "%s\n", getStatusString(smiNode->status));
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
	if (! assignement) {
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "DESCRIPTION", INDENTVALUE, invalid);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    if (smiNode->description) {
Packit Service 9ccfef
		fprintMultilineString(f, smiNode->description, invalid);
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprintMultilineString(f, "...", invalid);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
        
Packit Service 9ccfef
        if (smiNode->nodekind == SMI_NODEKIND_TABLE)
Packit Service 9ccfef
            fprintInstallErrors(f, smiNode, invalid);
Packit Service 9ccfef
	    
Packit Service 9ccfef
	if (! assignement && smiNode->reference) {
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "REFERENCE", INDENTVALUE, invalid);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, smiNode->reference, invalid);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	}
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
	    fprintIndex(f, smiNode, invalid);
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_INDEX_AUGMENT:
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "AUGMENTS", INDENTVALUE, invalid);
Packit Service 9ccfef
	    fprint(f, "{ %s }\n", relatedNode->name);
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_INDEX_SPARSE:
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "EXTENDS", INDENTVALUE, invalid);
Packit Service 9ccfef
	    fprint(f, "{ %s }\n", relatedNode->name);
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	case SMI_INDEX_UNKNOWN:
Packit Service 9ccfef
	case SMI_INDEX_REORDER:
Packit Service 9ccfef
	case SMI_INDEX_EXPAND:
Packit Service 9ccfef
	    break;
Packit Service 9ccfef
	}
Packit Service 9ccfef
	
Packit Service 9ccfef
        if (smiNode->nodekind == SMI_NODEKIND_ROW)
Packit Service 9ccfef
            fprintUniqueness(f, smiNode, invalid);
Packit Service 9ccfef
        
Packit Service 9ccfef
	if (smiNode->value.basetype != SMI_BASETYPE_UNKNOWN) {
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "DEFVAL", INDENTVALUE, invalid);
Packit Service 9ccfef
	    fprint(f, "{ %s }", getValueString(&smiNode->value, smiType));
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT, "::= ", 0, invalid);
Packit Service 9ccfef
	fprint(f, "{ %s }\n\n", getOidString(smiNode, 0));
Packit Service 9ccfef
Packit Service 9ccfef
	smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
        addinstanceid = 0;
Packit Service 9ccfef
	if (smiNode->nodekind == SMI_NODEKIND_ROW) {
Packit Service 9ccfef
            if (mibtopib)
Packit Service 9ccfef
                addinstanceid = 1;
Packit Service 9ccfef
	    if (smiType) {
Packit Service 9ccfef
		fprint(f, "%s ::= SEQUENCE {", smiType->name);
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		/* guess type name is uppercase row name */
Packit Service 9ccfef
		char *s = getUppercaseString(smiNode->name);
Packit Service 9ccfef
		fprint(f, "%s ::= SEQUENCE {", s);
Packit Service 9ccfef
		xfree(s);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    /* Find the last valid node in this sequence. We need it
Packit Service 9ccfef
	     * to suppress its trailing comma. Compute the longest
Packit Service 9ccfef
	     * column name so that we can adjust the indentation of
Packit Service 9ccfef
	     * the type names in the SEQUENCE definition. */
Packit Service 9ccfef
	    for(indentsequence = 0, colNode = smiGetFirstChildNode(smiNode);
Packit Service 9ccfef
		colNode;
Packit Service 9ccfef
		colNode = smiGetNextChildNode(colNode)) {
Packit Service 9ccfef
		int len = strlen(colNode->name);
Packit Service 9ccfef
		if (len > indentsequence) indentsequence = len;
Packit Service 9ccfef
		smiType = smiGetNodeType(colNode);
Packit Service 9ccfef
		if (smiType && !invalidType(smiType->basetype)) {
Packit Service 9ccfef
		    relatedNode = colNode;
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
            if (mibtopib) {
Packit Service 9ccfef
                int len = strlen(smiParentNode->name) + 10;
Packit Service 9ccfef
                if (len > 64)
Packit Service 9ccfef
                  len = 64;
Packit Service 9ccfef
                indentsequence = len;
Packit Service 9ccfef
            }
Packit Service 9ccfef
	    if (relatedNode) relatedNode = smiGetNextChildNode(relatedNode);
Packit Service 9ccfef
	    indentsequence = (2*INDENT + indentsequence + 1) / INDENT * INDENT;
Packit Service 9ccfef
	    /* TODO: non-local name? */
Packit Service 9ccfef
	    for(i = 0, invalid = 0, colNode = smiGetFirstChildNode(smiNode);
Packit Service 9ccfef
		colNode;
Packit Service 9ccfef
		colNode = smiGetNextChildNode(colNode)) {
Packit Service 9ccfef
		if (! invalid || ! silent) {
Packit Service 9ccfef
		    if (i && (relatedNode != colNode)) {
Packit Service 9ccfef
			fprint(f, ",");
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    fprint(f, "\n");
Packit Service 9ccfef
		}
Packit Service 9ccfef
		
Packit Service 9ccfef
		smiType = smiGetNodeType(colNode);
Packit Service 9ccfef
		invalid = (smiType == NULL) || invalidType(smiType->basetype);
Packit Service 9ccfef
Packit Service 9ccfef
		if (! invalid || ! silent) {
Packit Service 9ccfef
		    fprintSegment(f, INDENT, colNode->name, indentsequence,
Packit Service 9ccfef
				  invalid);
Packit Service 9ccfef
		    if (smiType && smiType->decl == SMI_DECL_IMPLICIT_TYPE) {
Packit Service 9ccfef
			fprint(f, "%s", getTypeString(smiType->basetype,
Packit Service 9ccfef
					      smiGetParentType(smiType)));
Packit Service 9ccfef
		    } else if (smiType) {
Packit Service 9ccfef
			fprint(f, "%s", getTypeString(smiType->basetype,
Packit Service 9ccfef
					      smiGetNodeType(colNode)));
Packit Service 9ccfef
		    } else {
Packit Service 9ccfef
			fprint(f, "<unknown>");
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		}
Packit Service 9ccfef
		i++;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
            if (mibtopib) {
Packit Service 9ccfef
                size_t len = strlen(smiParentNode->name);
Packit Service 9ccfef
                int maxid;
Packit Service 9ccfef
                char *instanceId = xmalloc(len + 11);
Packit Service 9ccfef
                strcpy(instanceId, smiParentNode->name);
Packit Service 9ccfef
                if (len > 54)
Packit Service 9ccfef
                  len = 54;
Packit Service 9ccfef
                strcpy(&instanceId[len], "InstanceId");
Packit Service 9ccfef
                fprint(f, ",\n");
Packit Service 9ccfef
                fprintSegment(f, INDENT, instanceId, indentsequence, 0);
Packit Service 9ccfef
                fprint(f, "InstanceId\n}\n\n");
Packit Service 9ccfef
                
Packit Service 9ccfef
                fprint(f, "%s OBJECT-TYPE\n", instanceId);
Packit Service 9ccfef
	        fprintSegment(f, INDENT, "SYNTAX", INDENTVALUE, 0);
Packit Service 9ccfef
                fprint(f, "InstanceId\n");
Packit Service 9ccfef
                fprintSegment(f, INDENT, "STATUS", INDENTVALUE, 0);
Packit Service 9ccfef
                fprint(f, "current\n");
Packit Service 9ccfef
                fprintSegment(f, INDENT, "DESCRIPTION", INDENTVALUE, 0);
Packit Service 9ccfef
                fprint(f, "\n");
Packit Service 9ccfef
		fprintMultilineString(f, "Added by smidump for automatic " \
Packit Service 9ccfef
                                      "MIB to PIB conversion.", 0);
Packit Service 9ccfef
                fprint(f, "\n");
Packit Service 9ccfef
	        fprintSegment(f, INDENT, "::= ", 0, 0);
Packit Service 9ccfef
                for (maxid = 0, colNode = smiGetFirstChildNode(smiNode);
Packit Service 9ccfef
                     colNode; colNode = smiGetNextChildNode(colNode))
Packit Service 9ccfef
                     if (colNode->oidlen &&
Packit Service 9ccfef
                         (colNode->oid[colNode->oidlen - 1] > maxid))
Packit Service 9ccfef
                         maxid = colNode->oid[colNode->oidlen - 1];
Packit Service 9ccfef
	        fprint(f, "{ %s %d }\n\n",
Packit Service 9ccfef
                       smiGetFirstChildNode(smiParentNode)->name, 
Packit Service 9ccfef
                       (maxid + 1) > 128 ? (maxid + 1) : 128);
Packit Service 9ccfef
                xfree(instanceId);
Packit Service 9ccfef
            } else
Packit Service 9ccfef
 	        fprint(f, "\n}\n\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintGroups(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode	 *smiNode;
Packit Service 9ccfef
    SmiElement   *smiElement;
Packit Service 9ccfef
    int          j, objectGroup = 0;
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
	objectGroup = isObjectGroup(smiNode);
Packit Service 9ccfef
Packit Service 9ccfef
	if (!objectGroup) {
Packit Service 9ccfef
	    fprint(f, "%s OBJECT IDENTIFIER\n", smiNode->name);
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "::= ", 0, 0);
Packit Service 9ccfef
	    fprint(f, "{ %s }\n\n", getOidString(smiNode, 0));
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	if (!objectGroup) {
Packit Service 9ccfef
	    continue;
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	fprint(f, "%s %s\n", smiNode->name, "OBJECT-GROUP");
Packit Service 9ccfef
	fprintSegment(f, INDENT, "OBJECTS", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "{ ");
Packit Service 9ccfef
	for (j = 0, smiElement = smiGetFirstElement(smiNode);
Packit Service 9ccfef
	     smiElement;
Packit Service 9ccfef
	     j++, smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	    if (j) {
Packit Service 9ccfef
		fprint(f, ", ");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    fprintWrapped(f, INDENTVALUE + 2,
Packit Service 9ccfef
			  smiGetElementNode(smiElement)->name, 0);
Packit Service 9ccfef
	    /* TODO: non-local name if non-local */
Packit Service 9ccfef
	} /* TODO: empty? -> print error */
Packit Service 9ccfef
	fprint(f, " }\n");
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT, "STATUS", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "%s\n", getStatusString(smiNode->status));
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT, "DESCRIPTION", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	if (smiNode->description) {
Packit Service 9ccfef
	    fprintMultilineString(f, smiNode->description, 0);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprintMultilineString(f, "...", 0);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiNode->reference) {
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "REFERENCE", INDENTVALUE, 0);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, smiNode->reference, 0);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT, "::= ", 0, 0);
Packit Service 9ccfef
	fprint(f, "{ %s }\n\n", getOidString(smiNode, 0));
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintModuleCompliances(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode	  *smiNode, *smiNode2;
Packit Service 9ccfef
    SmiModule     *smiModule2;
Packit Service 9ccfef
    SmiType	  *smiType;
Packit Service 9ccfef
    SmiOption	  *smiOption;
Packit Service 9ccfef
    SmiRefinement *smiRefinement;
Packit Service 9ccfef
    SmiElement    *smiElement;
Packit Service 9ccfef
    char	  *module;
Packit Service 9ccfef
    char	  *done = NULL; /* "+" separated list of module names */
Packit Service 9ccfef
    char	  s[1024];
Packit Service 9ccfef
    int		  j;
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
	fprint(f, "%s MODULE-COMPLIANCE\n", smiNode->name);
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT, "STATUS", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "%s\n", getStatusString(smiNode->status));
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT, "DESCRIPTION", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	if (smiNode->description) {
Packit Service 9ccfef
	    fprintMultilineString(f, smiNode->description, 0);
Packit Service 9ccfef
	} else {
Packit Service 9ccfef
	    fprintMultilineString(f, "...", 0);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
Packit Service 9ccfef
	if (smiNode->reference) {
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "REFERENCE", INDENTVALUE, 0);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintMultilineString(f, smiNode->reference, 0);
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	/* `this module' always first */
Packit Service 9ccfef
	done = xstrdup("+");
Packit Service 9ccfef
	for (module = smiModule->name; module; ) {
Packit Service 9ccfef
Packit Service 9ccfef
	    fprint(f, "\n");
Packit Service 9ccfef
	    fprintSegment(f, INDENT, "MODULE", INDENTVALUE, 0);
Packit Service 9ccfef
	    if (strlen(module) && strcmp(smiModule->name, module)) {
Packit Service 9ccfef
		fprint(f, "%s\n", module);
Packit Service 9ccfef
	    } else {
Packit Service 9ccfef
		fprint(f, "-- this module\n");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
Packit Service 9ccfef
	    for (j = 0, smiElement = smiGetFirstElement(smiNode);
Packit Service 9ccfef
		 smiElement;
Packit Service 9ccfef
		 smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
		if (!strcmp(smiGetNodeModule(smiGetElementNode(smiElement))->name, module)) {
Packit Service 9ccfef
		    if (j) {
Packit Service 9ccfef
			fprint(f, ", ");
Packit Service 9ccfef
		    } else {
Packit Service 9ccfef
			fprint(f, "\n");
Packit Service 9ccfef
			fprintSegment(f, 2 * INDENT, "MANDATORY-GROUPS",
Packit Service 9ccfef
				      INDENTVALUE, 0);
Packit Service 9ccfef
			fprint(f, "{ ");
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    j++;
Packit Service 9ccfef
		    fprintWrapped(f, INDENTVALUE + 2,
Packit Service 9ccfef
				  smiGetElementNode(smiElement)->name,
Packit Service 9ccfef
				  0);
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    if (j) {
Packit Service 9ccfef
		fprint(f, " }\n");
Packit Service 9ccfef
	    }
Packit Service 9ccfef
Packit Service 9ccfef
	    for(smiOption = smiGetFirstOption(smiNode); smiOption;
Packit Service 9ccfef
		smiOption = smiGetNextOption(smiOption)) {
Packit Service 9ccfef
		smiNode2 = smiGetOptionNode(smiOption);
Packit Service 9ccfef
		smiModule2 = smiGetNodeModule(smiNode2);
Packit Service 9ccfef
		if (!strcmp(smiModule2->name, module)) {
Packit Service 9ccfef
		    fprint(f, "\n");
Packit Service 9ccfef
		    fprintSegment(f, 2 * INDENT, "GROUP",
Packit Service 9ccfef
				  INDENTVALUE, 0);
Packit Service 9ccfef
		    fprint(f, "%s\n", smiNode2->name);
Packit Service 9ccfef
		    fprintSegment(f, 2 * INDENT, "DESCRIPTION",
Packit Service 9ccfef
				  INDENTVALUE, 0);
Packit Service 9ccfef
		    fprint(f, "\n");
Packit Service 9ccfef
		    if (smiOption->description) {
Packit Service 9ccfef
			fprintMultilineString(f, smiOption->description,
Packit Service 9ccfef
					      0);
Packit Service 9ccfef
		    } else {
Packit Service 9ccfef
			fprintMultilineString(f, "...", 0);
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    fprint(f, "\n");
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
Packit Service 9ccfef
	    for(smiRefinement = smiGetFirstRefinement(smiNode);
Packit Service 9ccfef
		smiRefinement;
Packit Service 9ccfef
		smiRefinement = smiGetNextRefinement(smiRefinement)) {
Packit Service 9ccfef
		smiNode2 = smiGetRefinementNode(smiRefinement);
Packit Service 9ccfef
		smiModule2 = smiGetNodeModule(smiNode2);
Packit Service 9ccfef
		if (!strcmp(smiModule2->name, module)) {
Packit Service 9ccfef
		    fprint(f, "\n");
Packit Service 9ccfef
		    fprintSegment(f, 2 * INDENT, "OBJECT",
Packit Service 9ccfef
				  INDENTVALUE, 0);
Packit Service 9ccfef
		    fprint(f, "%s\n", smiNode2->name);
Packit Service 9ccfef
Packit Service 9ccfef
		    smiType = smiGetRefinementType(smiRefinement);
Packit Service 9ccfef
		    if (smiType) {
Packit Service 9ccfef
			fprintSegment(f, 2 * INDENT, "SYNTAX", INDENTVALUE,
Packit Service 9ccfef
				      0);
Packit Service 9ccfef
			fprint(f, "%s",
Packit Service 9ccfef
			       getTypeString(smiType->basetype,
Packit Service 9ccfef
					     smiGetParentType(smiType)));
Packit Service 9ccfef
			fprintSubtype(f, smiType, 0);
Packit Service 9ccfef
			fprint(f, "\n");
Packit Service 9ccfef
		    }
Packit Service 9ccfef
Packit Service 9ccfef
/*		    if ((smiRefinement->access == SMI_ACCESS_NOTIFY) ||
Packit Service 9ccfef
                        (smiRefinement->access >= SMI_REPORT_ONLY)) {*/
Packit Service 9ccfef
                    if (smiRefinement->access != SMI_ACCESS_UNKNOWN) {
Packit Service 9ccfef
			fprintSegment(f, 2 * INDENT, "PIB-MIN-ACCESS",
Packit Service 9ccfef
				      INDENTVALUE, 0);
Packit Service 9ccfef
			fprint(f, "%s\n",
Packit Service 9ccfef
			       getAccessString(smiRefinement->access, 0));
Packit Service 9ccfef
			/* we assume, that read-create does not appear in
Packit Service 9ccfef
			 * an OT refinement.
Packit Service 9ccfef
			 */
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    fprintSegment(f, 2 * INDENT, "DESCRIPTION",
Packit Service 9ccfef
				  INDENTVALUE, 0);
Packit Service 9ccfef
		    fprint(f, "\n");
Packit Service 9ccfef
		    if (smiRefinement->description) {
Packit Service 9ccfef
			fprintMultilineString(f,
Packit Service 9ccfef
					      smiRefinement->description,
Packit Service 9ccfef
					      0);
Packit Service 9ccfef
		    } else {
Packit Service 9ccfef
			fprintMultilineString(f, "...", 0);
Packit Service 9ccfef
		    }
Packit Service 9ccfef
		    fprint(f, "\n");
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
Packit Service 9ccfef
	    /*
Packit Service 9ccfef
	     * search the next module name in the list of mandatory
Packit Service 9ccfef
	     * groups, optional groups and refinements.
Packit Service 9ccfef
	     */
Packit Service 9ccfef
	    done = xrealloc(done,
Packit Service 9ccfef
			    strlen(done)+strlen(module)+2*sizeof(char));
Packit Service 9ccfef
	    strcat(done, module);
Packit Service 9ccfef
	    strcat(done, "+");
Packit Service 9ccfef
	    module = NULL;
Packit Service 9ccfef
	    for (smiElement = smiGetFirstElement(smiNode);
Packit Service 9ccfef
		 smiElement;
Packit Service 9ccfef
		 smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
		sprintf(s, "+%s+",
Packit Service 9ccfef
		    smiGetNodeModule(smiGetElementNode(smiElement))->name);
Packit Service 9ccfef
		if ((!strstr(done, s))) {
Packit Service 9ccfef
		    module =
Packit Service 9ccfef
		     smiGetNodeModule(smiGetElementNode(smiElement))->name;
Packit Service 9ccfef
		    break;
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    if (!module) {
Packit Service 9ccfef
		; /* TODO: search in options list */
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    if (!module) {
Packit Service 9ccfef
		; /* TODO: search in refinements list */
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintSegment(f, INDENT, "::= ", 0, 0);
Packit Service 9ccfef
	fprint(f, "{ %s }\n\n", getOidString(smiNode, 0));
Packit Service 9ccfef
    }
Packit Service 9ccfef
    xfree(done);
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (mibtopib) {
Packit Service 9ccfef
        char *newCompliance = xmalloc(65);
Packit Service 9ccfef
        char *newGroup = xmalloc(65);
Packit Service 9ccfef
        char *newId = xmalloc(65);
Packit Service 9ccfef
        int len, maxid;
Packit Service 9ccfef
        
Packit Service 9ccfef
        for (maxid = 0, smiNode2 = smiGetFirstChildNode(smiNode);
Packit Service 9ccfef
             smiNode2; smiNode2 = smiGetNextChildNode(smiNode2))
Packit Service 9ccfef
             if (smiNode2->oidlen &&
Packit Service 9ccfef
                 (smiNode2->oid[smiNode2->oidlen - 1] > maxid))
Packit Service 9ccfef
                 maxid = smiNode2->oid[smiNode2->oidlen - 1];
Packit Service 9ccfef
        maxid++;
Packit Service 9ccfef
Packit Service 9ccfef
        smiNode = smiGetModuleIdentityNode(smiModule);
Packit Service 9ccfef
        if (!smiNode || !newCompliance || !newGroup)
Packit Service 9ccfef
            return;
Packit Service 9ccfef
        len = strlen(smiNode->name);
Packit Service 9ccfef
        
Packit Service 9ccfef
        memset(newId, 0, 65);
Packit Service 9ccfef
        strncpy(newId, smiNode->name, 46);
Packit Service 9ccfef
        strcat(newId + (len > 46 ? 46 : len), "MIBtoPIBCompliance");
Packit Service 9ccfef
Packit Service 9ccfef
        memset(newCompliance, 0, 65);
Packit Service 9ccfef
        strncpy(newCompliance, smiNode->name, 46);
Packit Service 9ccfef
        strcat(newCompliance + (len > 46 ? 46 : len), "MIBtoPIBModuleComp");
Packit Service 9ccfef
Packit Service 9ccfef
        memset(newGroup, 0, 65);
Packit Service 9ccfef
        strncpy(newGroup, smiNode->name, 51);
Packit Service 9ccfef
        strcat(newGroup + (len > 51 ? 51 : len), "MIBtoPIBGroup");
Packit Service 9ccfef
Packit Service 9ccfef
        fprintf(f, "-- The following three items were added in order " \
Packit Service 9ccfef
                "to create a RFC compliant\n-- SPPI module. They do not " \
Packit Service 9ccfef
                "provide any usable content.\n-- %s\n-- %s\n-- %s\n\n",
Packit Service 9ccfef
                newId, newCompliance, newGroup);
Packit Service 9ccfef
        
Packit Service 9ccfef
        fprint(f, "%s OBJECT-IDENTITY\n", newId);
Packit Service 9ccfef
        fprintSegment(f, INDENT, "STATUS", INDENTVALUE, 0);
Packit Service 9ccfef
        fprint(f, "current\n");
Packit Service 9ccfef
	fprintSegment(f, INDENT, "DESCRIPTION", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
        fprintMultilineString(f, "Added by smidump for automatic " \
Packit Service 9ccfef
                              "MIB to PIB conversion.", 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintSegment(f, INDENT, "::= ", 0, 0);
Packit Service 9ccfef
	fprint(f, "{ %s %d }\n\n", smiNode->name, (maxid > 128 ? maxid : 128));
Packit Service 9ccfef
        
Packit Service 9ccfef
        fprint(f, "%s MODULE-COMPLIANCE\n", newCompliance);
Packit Service 9ccfef
	fprintSegment(f, INDENT, "STATUS", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "current\n");
Packit Service 9ccfef
	fprintSegment(f, INDENT, "DESCRIPTION", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
        fprintMultilineString(f, "Added by smidump for automatic " \
Packit Service 9ccfef
                              "MIB to PIB conversion.", 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
        
Packit Service 9ccfef
        fprintSegment(f, INDENT, "MODULE", INDENTVALUE, 0);
Packit Service 9ccfef
        fprint(f, "-- this module\n");
Packit Service 9ccfef
        
Packit Service 9ccfef
        fprintSegment(f, 2 * INDENT, "MANDATORY-GROUPS", INDENTVALUE, 0);
Packit Service 9ccfef
        fprint(f, "{ ");
Packit Service 9ccfef
        
Packit Service 9ccfef
	fprintWrapped(f, INDENTVALUE + 2, newGroup, 0);
Packit Service 9ccfef
        fprint(f, "}\n");
Packit Service 9ccfef
        
Packit Service 9ccfef
	fprintSegment(f, INDENT, "::= ", 0, 0);
Packit Service 9ccfef
	fprint(f, "{ %s 1 }\n\n", newId);
Packit Service 9ccfef
Packit Service 9ccfef
	fprint(f, "%s OBJECT-GROUP\n", newGroup);
Packit Service 9ccfef
	fprintSegment(f, INDENT, "OBJECTS", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "{ ");
Packit Service 9ccfef
        for (len=0, smiNode2 = smiGetFirstNode(smiModule, SMI_NODEKIND_COLUMN);
Packit Service 9ccfef
            smiNode2; len = 1,
Packit Service 9ccfef
            smiNode2 = smiGetNextNode(smiNode2, SMI_NODEKIND_COLUMN)) {
Packit Service 9ccfef
            if (len)
Packit Service 9ccfef
                fprint(f, ", ");
Packit Service 9ccfef
	    fprintWrapped(f, INDENTVALUE + 2, smiNode2->name, 0);
Packit Service 9ccfef
        }
Packit Service 9ccfef
        for (smiNode2 = smiGetFirstNode(smiModule, SMI_NODEKIND_ROW);
Packit Service 9ccfef
             smiNode2; smiNode2 = smiGetNextNode(smiNode2, SMI_NODEKIND_ROW)) {
Packit Service 9ccfef
            SmiNode *smiParentNode = smiGetParentNode(smiNode2);
Packit Service 9ccfef
            size_t len = strlen(smiParentNode->name);
Packit Service 9ccfef
            char *instanceId = xmalloc(len + 11);
Packit Service 9ccfef
Packit Service 9ccfef
            strcpy(instanceId, smiParentNode->name);
Packit Service 9ccfef
            if (len > 54)
Packit Service 9ccfef
              len = 54;
Packit Service 9ccfef
            strcpy(&instanceId[len], "InstanceId");
Packit Service 9ccfef
            if (len)
Packit Service 9ccfef
                fprint(f, ", ");
Packit Service 9ccfef
	    fprintWrapped(f, INDENTVALUE + 2, instanceId, 0);
Packit Service 9ccfef
            xfree(instanceId);
Packit Service 9ccfef
        }
Packit Service 9ccfef
Packit Service 9ccfef
	fprint(f, " }\n");
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT, "STATUS", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "current\n");
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT, "DESCRIPTION", INDENTVALUE, 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
	fprintMultilineString(f, "Added by smidump for automatic" \
Packit Service 9ccfef
                              "MIB to PIB conversion.", 0);
Packit Service 9ccfef
	fprint(f, "\n");
Packit Service 9ccfef
Packit Service 9ccfef
	fprintSegment(f, INDENT, "::= ", 0, 0);
Packit Service 9ccfef
	fprint(f, "{ %s 2 }\n\n", newId);
Packit Service 9ccfef
Packit Service 9ccfef
        xfree(newCompliance);
Packit Service 9ccfef
        xfree(newGroup);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void doDumpSppi(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if (smiModule->language != SMI_LANGUAGE_SPPI) /* MIB to PIB conversion */
Packit Service 9ccfef
        mibtopib = 1;
Packit Service 9ccfef
    else
Packit Service 9ccfef
        mibtopib = 0;
Packit Service 9ccfef
Packit Service 9ccfef
    createImportList(smiModule);
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprint(f, "--\n");
Packit Service 9ccfef
    fprint(f, "-- This SPPI module has been generated by smidump "
Packit Service 9ccfef
	   SMI_VERSION_STRING ". Do not edit.\n");
Packit Service 9ccfef
    fprint(f, "--\n\n");
Packit Service 9ccfef
    fprint(f, "%s%s PIB-DEFINITIONS ::= BEGIN\n\n", smiModule->name,
Packit Service 9ccfef
           mibtopib ? "-PIB" : "");
Packit Service 9ccfef
	
Packit Service 9ccfef
    fprintImports(f);
Packit Service 9ccfef
    fprintModuleIdentity(f, smiModule);
Packit Service 9ccfef
    fprintTypeDefinitions(f, smiModule);
Packit Service 9ccfef
    fprintTextualConventions(f, smiModule);
Packit Service 9ccfef
    fprintObjects(f, smiModule);
Packit Service 9ccfef
    fprintGroups(f, smiModule);
Packit Service 9ccfef
    fprintModuleCompliances(f, smiModule);
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprint(f, "END -- end of module %s.\n", smiModule->name);
Packit Service 9ccfef
Packit Service 9ccfef
    freeImportList();
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void dumpSppi(int modc, SmiModule **modv, int flags, char *output)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int  i;
Packit Service 9ccfef
    FILE *f = stdout;
Packit Service 9ccfef
Packit Service 9ccfef
    silent = (flags & SMIDUMP_FLAG_SILENT);
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
	doDumpSppi(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 initSppi()
Packit Service 9ccfef
{
Packit Service 9ccfef
    static SmidumpDriver driver = {
Packit Service 9ccfef
	"sppi",
Packit Service 9ccfef
	dumpSppi,
Packit Service 9ccfef
	0,
Packit Service 9ccfef
	SMIDUMP_DRIVER_CANT_UNITE,
Packit Service 9ccfef
	"SPPI (RFC 3159)",
Packit Service 9ccfef
	NULL,
Packit Service 9ccfef
	NULL
Packit Service 9ccfef
    };
Packit Service 9ccfef
    
Packit Service 9ccfef
    smidumpRegisterDriver(&driver);
Packit Service 9ccfef
}