Blame tools/dump-compliance.c

Packit Service 9ccfef
/*
Packit Service 9ccfef
 * dump-compliances.c --
Packit Service 9ccfef
 *
Packit Service 9ccfef
 *      Operations to dump compliances in a human readable format.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Copyright (c) 2005 J. Schoenwaelder, International University Bremen.
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-compliances.c 1571 2003-07-14 22:58:42Z schoenw $
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 *getFlags(SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
Packit Service 9ccfef
    switch (smiNode->access) {
Packit Service 9ccfef
    case SMI_ACCESS_UNKNOWN:
Packit Service 9ccfef
	return "---";
Packit Service 9ccfef
    case SMI_ACCESS_NOT_ACCESSIBLE:
Packit Service 9ccfef
	return "---";
Packit Service 9ccfef
    case SMI_ACCESS_NOTIFY:
Packit Service 9ccfef
	return "--n";
Packit Service 9ccfef
    case SMI_ACCESS_EVENT_ONLY:
Packit Service 9ccfef
	return "--n";
Packit Service 9ccfef
    case SMI_ACCESS_READ_ONLY:
Packit Service 9ccfef
	return "r-n";
Packit Service 9ccfef
    case SMI_ACCESS_READ_WRITE:
Packit Service 9ccfef
	return "rwn";
Packit Service 9ccfef
    case SMI_ACCESS_NOT_IMPLEMENTED:
Packit Service 9ccfef
	return "---";
Packit Service 9ccfef
    case SMI_ACCESS_INSTALL:
Packit Service 9ccfef
	return "-i-";
Packit Service 9ccfef
    case SMI_ACCESS_INSTALL_NOTIFY:
Packit Service 9ccfef
	return "-in";
Packit Service 9ccfef
    case SMI_ACCESS_REPORT_ONLY:
Packit Service 9ccfef
	return "--r";
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return "";
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char getStatusChar(SmiStatus status)
Packit Service 9ccfef
{
Packit Service 9ccfef
    switch (status) {
Packit Service 9ccfef
    case SMI_STATUS_UNKNOWN:
Packit Service 9ccfef
	return '+';
Packit Service 9ccfef
    case SMI_STATUS_CURRENT:
Packit Service 9ccfef
	return '+';
Packit Service 9ccfef
    case SMI_STATUS_DEPRECATED:
Packit Service 9ccfef
	return 'x';
Packit Service 9ccfef
    case SMI_STATUS_MANDATORY:
Packit Service 9ccfef
        return '+';
Packit Service 9ccfef
    case SMI_STATUS_OPTIONAL:
Packit Service 9ccfef
	return '+';
Packit Service 9ccfef
    case SMI_STATUS_OBSOLETE:
Packit Service 9ccfef
	return 'o';
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    return ' ';
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static char *getTypeName(SmiNode *smiNode)
Packit Service 9ccfef
{
Packit Service 9ccfef
    char *type;
Packit Service 9ccfef
    SmiType *smiType, *parentType;
Packit Service 9ccfef
Packit Service 9ccfef
    smiType = smiGetNodeType(smiNode);
Packit Service 9ccfef
Packit Service 9ccfef
    if (!smiType || smiNode->nodekind == SMI_NODEKIND_TABLE)
Packit Service 9ccfef
	return NULL;
Packit Service 9ccfef
    
Packit Service 9ccfef
    if (smiType->decl == SMI_DECL_IMPLICIT_TYPE) {
Packit Service 9ccfef
	parentType = smiGetParentType(smiType);
Packit Service 9ccfef
	if (!parentType)
Packit Service 9ccfef
	    return NULL;
Packit Service 9ccfef
	smiType = parentType;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    type = xstrdup(smiType->name);
Packit Service 9ccfef
    return type;
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintGroup(FILE *f, SmiNode *smiNode, char c,
Packit Service 9ccfef
			int *typelen, int *namelen, int pass)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    SmiNode *smiObject;
Packit Service 9ccfef
    SmiModule *smiModule;
Packit Service 9ccfef
    char *type_name;
Packit Service 9ccfef
    int tlen = 9, nlen = 9;
Packit Service 9ccfef
Packit Service 9ccfef
    switch (smiNode->nodekind) {
Packit Service 9ccfef
    case SMI_NODEKIND_GROUP:
Packit Service 9ccfef
	for (smiElement = smiGetFirstElement(smiNode);
Packit Service 9ccfef
	     smiElement;
Packit Service 9ccfef
	     smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	    smiObject = smiGetElementNode(smiElement);
Packit Service 9ccfef
	    smiModule = smiGetNodeModule(smiNode);
Packit Service 9ccfef
	    type_name = getTypeName(smiObject);
Packit Service 9ccfef
	    if (pass == 1) {
Packit Service 9ccfef
		if (type_name) {
Packit Service 9ccfef
		    int newlen = strlen(type_name);
Packit Service 9ccfef
		    tlen = (tlen < newlen) ? newlen : tlen;
Packit Service 9ccfef
		}
Packit Service 9ccfef
		if (smiObject->name) {
Packit Service 9ccfef
		    int newlen = strlen(smiObject->name);
Packit Service 9ccfef
		    nlen = (nlen < newlen) ? newlen : nlen;
Packit Service 9ccfef
		}
Packit Service 9ccfef
	    } else if (pass == 2) {
Packit Service 9ccfef
		fprintf(f, "  %c%c%s %-*s %-*s (%s)\n",
Packit Service 9ccfef
			getStatusChar(smiObject->status), c,
Packit Service 9ccfef
			getFlags(smiObject),
Packit Service 9ccfef
			*typelen, type_name ? type_name : "-",
Packit Service 9ccfef
			*namelen, smiObject->name, smiNode->name);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    xfree(type_name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    case SMI_NODEKIND_SCALAR:
Packit Service 9ccfef
    case SMI_NODEKIND_COLUMN:
Packit Service 9ccfef
	smiObject = smiNode;
Packit Service 9ccfef
	type_name = getTypeName(smiObject);
Packit Service 9ccfef
	if (pass == 1) {
Packit Service 9ccfef
	    if (type_name) {
Packit Service 9ccfef
		int newlen = strlen(type_name);
Packit Service 9ccfef
		tlen = tlen < newlen ? newlen : tlen;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    if (smiObject->name) {
Packit Service 9ccfef
		int newlen = strlen(smiObject->name);
Packit Service 9ccfef
		nlen = (nlen < newlen) ? newlen : nlen;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	} else if (pass == 2) {
Packit Service 9ccfef
	    fprintf(f, "  %c%c%s %-*s %s\n",
Packit Service 9ccfef
		    getStatusChar(smiObject->status), 'r',
Packit Service 9ccfef
		    getFlags(smiObject),
Packit Service 9ccfef
		    *typelen, type_name ? type_name : "-",
Packit Service 9ccfef
		    smiObject->name);
Packit Service 9ccfef
	}
Packit Service 9ccfef
	xfree(type_name);
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    default:
Packit Service 9ccfef
	break;
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    if (pass == 1) {
Packit Service 9ccfef
	if (typelen) *typelen = tlen;
Packit Service 9ccfef
	if (namelen) *namelen = nlen;
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintCompliance(FILE *f, SmiNode *smiNode,
Packit Service 9ccfef
			     int *typelen, int *namelen, int pass)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiElement *smiElement;
Packit Service 9ccfef
    SmiOption *smiOption;
Packit Service 9ccfef
    SmiRefinement *smiRefinement;
Packit Service 9ccfef
    int tlen = 0, nlen = 0;
Packit Service 9ccfef
Packit Service 9ccfef
    for (smiElement = smiGetFirstElement(smiNode);
Packit Service 9ccfef
	 smiElement;
Packit Service 9ccfef
	 smiElement = smiGetNextElement(smiElement)) {
Packit Service 9ccfef
	fprintGroup(f, smiGetElementNode(smiElement), 'm',
Packit Service 9ccfef
		    (pass == 1) ? &tlen : typelen,
Packit Service 9ccfef
		    (pass == 1) ? &nlen : namelen, pass);
Packit Service 9ccfef
	if (pass == 1) {
Packit Service 9ccfef
	    if (typelen) {
Packit Service 9ccfef
		*typelen = *typelen < tlen ? tlen : *typelen;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    if (namelen) {
Packit Service 9ccfef
		*namelen = *namelen < nlen ? nlen : *namelen;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
Packit Service 9ccfef
    for(smiOption = smiGetFirstOption(smiNode);
Packit Service 9ccfef
	smiOption;
Packit Service 9ccfef
	smiOption = smiGetNextOption(smiOption)) {
Packit Service 9ccfef
	fprintGroup(f, smiGetOptionNode(smiOption), 'c',
Packit Service 9ccfef
		    (pass == 1) ? &tlen : typelen,
Packit Service 9ccfef
		    (pass == 1) ? &nlen : namelen, pass);
Packit Service 9ccfef
	if (pass == 1) {
Packit Service 9ccfef
	    if (typelen) {
Packit Service 9ccfef
		*typelen = *typelen < tlen ? tlen : *typelen;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    if (namelen) {
Packit Service 9ccfef
		*namelen = *namelen < nlen ? nlen : *namelen;
Packit Service 9ccfef
	    }
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
	fprintGroup(f, smiGetRefinementNode(smiRefinement), 'r',
Packit Service 9ccfef
		    (pass == 1) ? &tlen : typelen,
Packit Service 9ccfef
		    (pass == 1) ? &nlen : namelen, pass);
Packit Service 9ccfef
	if (pass == 1) {
Packit Service 9ccfef
	    if (typelen) {
Packit Service 9ccfef
		*typelen = *typelen < tlen ? tlen : *typelen;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	    if (namelen) {
Packit Service 9ccfef
		*namelen = *namelen < nlen ? nlen : *namelen;
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void fprintCompliances(FILE *f, SmiModule *smiModule)
Packit Service 9ccfef
{
Packit Service 9ccfef
    SmiNode *smiNode;
Packit Service 9ccfef
    int i, typelen = 0, namelen = 0;
Packit Service 9ccfef
Packit Service 9ccfef
    for (i = 0, smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_COMPLIANCE);
Packit Service 9ccfef
	 smiNode;
Packit Service 9ccfef
	 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_COMPLIANCE), i++) {
Packit Service 9ccfef
	fprintf(f, "%s%s:\n", i ? "\n" : "", smiNode->name);
Packit Service 9ccfef
	fprintCompliance(f, smiNode, &typelen, &namelen, 1);
Packit Service 9ccfef
	fprintCompliance(f, smiNode, &typelen, &namelen, 2);
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
static void
Packit Service 9ccfef
dumpCompliances(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
    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
	if (! (flags & SMIDUMP_FLAG_SILENT)) {
Packit Service 9ccfef
	    fprintf(f, "# %s compliances (generated by smidump "
Packit Service 9ccfef
		    SMI_VERSION_STRING ")\n\n", 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
	fprintCompliances(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 initCompliances()
Packit Service 9ccfef
{
Packit Service 9ccfef
    static SmidumpDriver driver = {
Packit Service 9ccfef
	"compliances",
Packit Service 9ccfef
	dumpCompliances,
Packit Service 9ccfef
	SMI_FLAG_NODESCR,
Packit Service 9ccfef
	SMIDUMP_DRIVER_CANT_UNITE,
Packit Service 9ccfef
	"compliances with all included objects / notifications",
Packit Service 9ccfef
	/* opt, */ NULL,
Packit Service 9ccfef
	NULL
Packit Service 9ccfef
    };
Packit Service 9ccfef
    
Packit Service 9ccfef
    smidumpRegisterDriver(&driver);
Packit Service 9ccfef
}