|
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 |
}
|