|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* dump-corba.c --
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Operations to dump CORBA IDL and OID definitions. This is based
|
|
Packit |
022b05 |
* on the JIDM Specification Translation developed by the JIDM task
|
|
Packit |
022b05 |
* force, published as Open Group <URL:http://www.opengroup.org/>
|
|
Packit |
022b05 |
* document C802 (ISBN 1-85912-256-6, January 2000).
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
|
|
Packit |
022b05 |
* Copyright (c) 1999 J. Schoenwaelder, Technical University of Braunschweig.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* See the file "COPYING" for information on usage and redistribution
|
|
Packit |
022b05 |
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* @(#) $Id: dump-corba.c 8090 2008-04-18 12:56:29Z strauss $
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <config.h>
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <stdlib.h>
|
|
Packit |
022b05 |
#include <stdio.h>
|
|
Packit |
022b05 |
#include <stdarg.h>
|
|
Packit |
022b05 |
#include <string.h>
|
|
Packit |
022b05 |
#include <ctype.h>
|
|
Packit |
022b05 |
#include <time.h>
|
|
Packit |
022b05 |
#ifdef HAVE_UNISTD_H
|
|
Packit |
022b05 |
#include <unistd.h>
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
#ifdef HAVE_WIN_H
|
|
Packit |
022b05 |
#include "win.h"
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include "smi.h"
|
|
Packit |
022b05 |
#include "smidump.h"
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#define INDENT 4 /* indent factor */
|
|
Packit |
022b05 |
#define INDENTVALUE 20 /* column to start values, except multiline */
|
|
Packit |
022b05 |
#define INDENTTEXTS 13 /* column to start multiline texts */
|
|
Packit |
022b05 |
#define INDENTMAX 72 /* max column to fill, break lines otherwise */
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int current_column = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int silent = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* The following list of IDL keywords is taken from the CORBA
|
|
Packit |
022b05 |
* 2.3.1 IDL specification section 3.2.4 (October 1999).
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *idlKeywords[] = {
|
|
Packit |
022b05 |
"abstract",
|
|
Packit |
022b05 |
"any", "attribute", "boolean", "case",
|
|
Packit |
022b05 |
"char", "const", "context", "custom",
|
|
Packit |
022b05 |
"default", "double", "enum", "exception",
|
|
Packit |
022b05 |
"factory", "FALSE", "fixed", "float",
|
|
Packit |
022b05 |
"in", "inout", "interface", "long",
|
|
Packit |
022b05 |
"module", "native", "object", "octet",
|
|
Packit |
022b05 |
"oneway", "out", "private", "public",
|
|
Packit |
022b05 |
"raises", "readonly", "sequence", "short",
|
|
Packit |
022b05 |
"string", "struct", "supports", "switch",
|
|
Packit |
022b05 |
"TRUE", "truncatable", "typedef", "unsigned",
|
|
Packit |
022b05 |
"union", "valuebase", "valuetype", "void",
|
|
Packit |
022b05 |
"wchar", "wstring", NULL
|
|
Packit |
022b05 |
};
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Structure used to build a list of imported types.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typedef struct Import {
|
|
Packit |
022b05 |
char *module;
|
|
Packit |
022b05 |
char *name;
|
|
Packit |
022b05 |
struct Import *nextPtr;
|
|
Packit |
022b05 |
} Import;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static Import *importList = NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Structure used to build dictionaries that translate names
|
|
Packit |
022b05 |
* into IDL names following the generic JIDM rules.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typedef struct IdlEntry {
|
|
Packit |
022b05 |
char *module;
|
|
Packit |
022b05 |
char *name;
|
|
Packit |
022b05 |
char *idlname;
|
|
Packit |
022b05 |
struct IdlEntry *nextPtr;
|
|
Packit |
022b05 |
} IdlEntry;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static IdlEntry *idlModuleNameList = NULL;
|
|
Packit |
022b05 |
static IdlEntry *idlNodeNameList = NULL;
|
|
Packit |
022b05 |
static IdlEntry *idlTypeNameList = NULL;
|
|
Packit |
022b05 |
static IdlEntry *idlVBTypeNameList = NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static IdlEntry **idlNameLists[] = {
|
|
Packit |
022b05 |
&idlModuleNameList, &idlNodeNameList,
|
|
Packit |
022b05 |
&idlTypeNameList, &idlVBTypeNameList,
|
|
Packit |
022b05 |
NULL
|
|
Packit |
022b05 |
};
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static FILE * createFile(char *name, char *suffix)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *fullname;
|
|
Packit |
022b05 |
FILE *f;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fullname = xmalloc(strlen(name) + (suffix ? strlen(suffix) : 0) + 2);
|
|
Packit |
022b05 |
strcpy(fullname, name);
|
|
Packit |
022b05 |
if (suffix) {
|
|
Packit |
022b05 |
strcat(fullname, suffix);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (!access(fullname, R_OK)) {
|
|
Packit |
022b05 |
fprintf(stderr, "smidump: %s already exists\n", fullname);
|
|
Packit |
022b05 |
xfree(fullname);
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
f = fopen(fullname, "w");
|
|
Packit |
022b05 |
if (!f) {
|
|
Packit |
022b05 |
fprintf(stderr, "smidump: cannot open %s for writing: ", fullname);
|
|
Packit |
022b05 |
perror(NULL);
|
|
Packit |
022b05 |
xfree(fullname);
|
|
Packit |
022b05 |
exit(1);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
xfree(fullname);
|
|
Packit |
022b05 |
return f;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char* dictFindName(IdlEntry *list, char *module, char* name)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
IdlEntry *p;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (p = list; p; p = p->nextPtr) {
|
|
Packit |
022b05 |
if (! strcasecmp(p->module, module)
|
|
Packit |
022b05 |
&& ((! p->name && ! name) || ! strcasecmp(p->name, name))) {
|
|
Packit |
022b05 |
return p->idlname;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char* dictAddName(IdlEntry **listPtr, char *module, char *name)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
IdlEntry *p;
|
|
Packit |
022b05 |
char *s, *idl;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Create a new IDL identifier by translating hyphens
|
|
Packit |
022b05 |
* to underscores.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
s = name ? name : module;
|
|
Packit |
022b05 |
idl = xmalloc(strlen(s) + 1);
|
|
Packit |
022b05 |
for (i = 0; s[i]; i++) {
|
|
Packit |
022b05 |
idl[i] = (s[i] == '-') ? '_' : s[i];
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
idl[i] = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Check for any collisions with IDL keywords or previously
|
|
Packit |
022b05 |
* created IDL identifiers.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0; idlKeywords[i]; i++) {
|
|
Packit |
022b05 |
if (! strcasecmp(idlKeywords[i], idl)) {
|
|
Packit |
022b05 |
fprintf(stderr, "smidump: "
|
|
Packit |
022b05 |
"`%s' (%s%s%s) collides with IDL keyword `%s'\n",
|
|
Packit |
022b05 |
idl, module, name ? "::" : "", name ? name : "",
|
|
Packit |
022b05 |
idlKeywords[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0; idlNameLists[i]; i++) {
|
|
Packit |
022b05 |
IdlEntry *list = *(idlNameLists[i]);
|
|
Packit |
022b05 |
for (p = list; p; p = p->nextPtr) {
|
|
Packit |
022b05 |
if (! strcasecmp(p->idlname, idl)) {
|
|
Packit |
022b05 |
fprintf(stderr, "smidump: "
|
|
Packit |
022b05 |
"`%s' (%s%s%s) collides with `%s' (%s%s%s)\n",
|
|
Packit |
022b05 |
idl, module,
|
|
Packit |
022b05 |
name ? "::" : "", name ? name : "",
|
|
Packit |
022b05 |
p->idlname, p->module,
|
|
Packit |
022b05 |
p->name ? "::" : "", p->name ? p->name : "");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Safe the translated identifier in the dictionary.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
p = xmalloc(sizeof(IdlEntry));
|
|
Packit |
022b05 |
p->module = xstrdup(module);
|
|
Packit |
022b05 |
p->name = name ? xstrdup(name) : NULL;
|
|
Packit |
022b05 |
p->idlname = idl;
|
|
Packit |
022b05 |
p->nextPtr = *listPtr;
|
|
Packit |
022b05 |
*listPtr = p;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return idl;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void dictFree(IdlEntry **list)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
IdlEntry *p, *q;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (p = *list; p; ) {
|
|
Packit |
022b05 |
q = p;
|
|
Packit |
022b05 |
p = p->nextPtr;
|
|
Packit |
022b05 |
xfree(q->module);
|
|
Packit |
022b05 |
if (q->name) xfree(q->name);
|
|
Packit |
022b05 |
xfree(q->idlname);
|
|
Packit |
022b05 |
xfree(q);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
*list = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char* getIdlModuleName(char *module)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *s;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
s = dictFindName(idlModuleNameList, module, NULL);
|
|
Packit |
022b05 |
if (! s) {
|
|
Packit |
022b05 |
s = dictAddName(&idlModuleNameList, module, NULL);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getIdlNodeName(char *module, char *name)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *s;
|
|
Packit |
022b05 |
s = dictFindName(idlNodeNameList, module, name);
|
|
Packit |
022b05 |
if (! s) {
|
|
Packit |
022b05 |
s = dictAddName(&idlNodeNameList, module, name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char* getIdlTypeName(char *module, char *name)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *s, *type_name;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
type_name = xmalloc(strlen(name) + 10);
|
|
Packit |
022b05 |
sprintf(type_name, "%sType", name);
|
|
Packit |
022b05 |
type_name[0] = toupper((int) type_name[0]);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
s = dictFindName(idlTypeNameList, module, type_name);
|
|
Packit |
022b05 |
if (! s) {
|
|
Packit |
022b05 |
s = dictAddName(&idlTypeNameList, module, type_name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
xfree(type_name);
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char* getIdlVBTypeName(char *module, char *name, int *isnew)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *s, *vbTypeName;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
vbTypeName = xmalloc(strlen(name) + 10);
|
|
Packit |
022b05 |
sprintf(vbTypeName, "%sVBType", name);
|
|
Packit |
022b05 |
vbTypeName[0] = toupper((int) vbTypeName[0]);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (isnew) {
|
|
Packit |
022b05 |
*isnew = 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
s = dictFindName(idlVBTypeNameList, module, vbTypeName);
|
|
Packit |
022b05 |
if (! s) {
|
|
Packit |
022b05 |
if (isnew) {
|
|
Packit |
022b05 |
*isnew = 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
s = dictAddName(&idlVBTypeNameList, module, vbTypeName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
xfree(vbTypeName);
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int current(SmiStatus status)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
switch (status) {
|
|
Packit |
022b05 |
case SMI_STATUS_CURRENT:
|
|
Packit |
022b05 |
case SMI_STATUS_UNKNOWN:
|
|
Packit |
022b05 |
case SMI_STATUS_MANDATORY:
|
|
Packit |
022b05 |
case SMI_STATUS_OPTIONAL:
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getTimeString(time_t t)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
static char *s = NULL;
|
|
Packit |
022b05 |
struct tm *tm;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (s) xfree(s);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
tm = gmtime(&t);
|
|
Packit |
022b05 |
smiAsprintf(&s, "%04d%02d%02d%02d%02dZ",
|
|
Packit |
022b05 |
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
|
|
Packit |
022b05 |
tm->tm_hour, tm->tm_min);
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getAccessString(SmiAccess access, int create)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (create && (access == SMI_ACCESS_READ_WRITE)) {
|
|
Packit |
022b05 |
return "read-create";
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
return
|
|
Packit |
022b05 |
(access == SMI_ACCESS_NOT_ACCESSIBLE) ? "not-accessible" :
|
|
Packit |
022b05 |
(access == SMI_ACCESS_NOTIFY) ? "accessible-for-notify" :
|
|
Packit |
022b05 |
(access == SMI_ACCESS_READ_ONLY) ? "read-only" :
|
|
Packit |
022b05 |
(access == SMI_ACCESS_READ_WRITE) ? "read-write" :
|
|
Packit |
022b05 |
"<unknown>";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getBaseTypeString(SmiBasetype basetype)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
switch(basetype) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNKNOWN:
|
|
Packit |
022b05 |
return "ASN1_Null";
|
|
Packit |
022b05 |
case SMI_BASETYPE_POINTER:
|
|
Packit |
022b05 |
return "ASN1_Null";
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER32:
|
|
Packit |
022b05 |
case SMI_BASETYPE_ENUM:
|
|
Packit |
022b05 |
return "ASN1_Integer";
|
|
Packit |
022b05 |
case SMI_BASETYPE_OCTETSTRING:
|
|
Packit |
022b05 |
case SMI_BASETYPE_BITS:
|
|
Packit |
022b05 |
return "ASN1_OctetString";
|
|
Packit |
022b05 |
case SMI_BASETYPE_OBJECTIDENTIFIER:
|
|
Packit |
022b05 |
return "ASN1_ObjectIdentifier";
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED32:
|
|
Packit |
022b05 |
return "ASN1_Unsigned";
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER64:
|
|
Packit |
022b05 |
return "ASN1_Integer64";
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED64:
|
|
Packit |
022b05 |
return "ASN1_Unsigned64";
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT32:
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT64:
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT128:
|
|
Packit |
022b05 |
return "ASN1_Real";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getIdlAnyTypeName(SmiNode *smiNode, SmiType *smiType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiModule *smiModule;
|
|
Packit |
022b05 |
char *typeName;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! smiType->name) {
|
|
Packit |
022b05 |
smiModule = smiGetNodeModule(smiNode);
|
|
Packit |
022b05 |
if (smiModule && strlen(smiModule->name)) {
|
|
Packit |
022b05 |
typeName = getIdlTypeName(smiModule->name, smiNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
typeName = getBaseTypeString(smiType->basetype);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiModule = smiGetTypeModule(smiType);
|
|
Packit |
022b05 |
if (smiModule && strlen(smiModule->name)) {
|
|
Packit |
022b05 |
typeName = getIdlTypeName(smiModule->name, smiType->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
typeName = getBaseTypeString(smiType->basetype);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return typeName;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getValueString(SmiValue *valuePtr, SmiType *typePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
static char s[1024];
|
|
Packit |
022b05 |
char ss[9];
|
|
Packit |
022b05 |
int n;
|
|
Packit |
022b05 |
unsigned int i;
|
|
Packit |
022b05 |
SmiNamedNumber *nn;
|
|
Packit |
022b05 |
SmiNode *nodePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
s[0] = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (valuePtr->basetype) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED32:
|
|
Packit |
022b05 |
sprintf(s, "%lu", valuePtr->value.unsigned32);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER32:
|
|
Packit |
022b05 |
sprintf(s, "%ld", valuePtr->value.integer32);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED64:
|
|
Packit |
022b05 |
sprintf(s, UINT64_FORMAT, valuePtr->value.unsigned64);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER64:
|
|
Packit |
022b05 |
sprintf(s, INT64_FORMAT, valuePtr->value.integer64);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT32:
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT64:
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT128:
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_ENUM:
|
|
Packit |
022b05 |
for (nn = smiGetFirstNamedNumber(typePtr); nn;
|
|
Packit |
022b05 |
nn = smiGetNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
if (nn->value.value.unsigned32 == valuePtr->value.unsigned32)
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (nn) {
|
|
Packit |
022b05 |
sprintf(s, "%s", nn->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
sprintf(s, "%ld", valuePtr->value.integer32);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OCTETSTRING:
|
|
Packit |
022b05 |
for (i = 0; i < valuePtr->len; i++) {
|
|
Packit |
022b05 |
if (!isprint((int)valuePtr->value.ptr[i])) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (i == valuePtr->len) {
|
|
Packit |
022b05 |
sprintf(s, "\"%s\"", valuePtr->value.ptr);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
sprintf(s, "'%*s'H", 2 * valuePtr->len, "");
|
|
Packit |
022b05 |
for (i=0; i < valuePtr->len; i++) {
|
|
Packit |
022b05 |
sprintf(ss, "%02x", valuePtr->value.ptr[i]);
|
|
Packit |
022b05 |
strncpy(&s[1+2*i], ss, 2);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_BITS:
|
|
Packit |
022b05 |
sprintf(s, "{");
|
|
Packit |
022b05 |
for (i = 0, n = 0; i < valuePtr->len * 8; i++) {
|
|
Packit |
022b05 |
if (valuePtr->value.ptr[i/8] & (1 << (7-(i%8)))) {
|
|
Packit |
022b05 |
for (nn = smiGetFirstNamedNumber(typePtr); nn;
|
|
Packit |
022b05 |
nn = smiGetNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
if (nn->value.value.unsigned32 == i)
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (nn) {
|
|
Packit |
022b05 |
if (n)
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], ", ");
|
|
Packit |
022b05 |
n++;
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "%s", nn->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "}");
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNKNOWN:
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_POINTER:
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OBJECTIDENTIFIER:
|
|
Packit |
022b05 |
/* TODO */
|
|
Packit |
022b05 |
nodePtr = smiGetNodeByOID(valuePtr->len, valuePtr->value.oid);
|
|
Packit |
022b05 |
if (nodePtr) {
|
|
Packit |
022b05 |
sprintf(s, "%s", nodePtr->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
strcpy(s, "{");
|
|
Packit |
022b05 |
for (i=0; i < valuePtr->len; i++) {
|
|
Packit |
022b05 |
if (i) strcat(s, " ");
|
|
Packit |
022b05 |
sprintf(&s[strlen(s)], "%u", valuePtr->value.oid[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
strcat(s, "}");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static Import* addImport(char *module, char *name)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Import **import, *newImport;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (import = &importList; *import; import = &(*import)->nextPtr) {
|
|
Packit |
022b05 |
int c = strcmp((*import)->module, module);
|
|
Packit |
022b05 |
if (c < 0) continue;
|
|
Packit |
022b05 |
if (c == 0) {
|
|
Packit |
022b05 |
int d = strcmp((*import)->name, name);
|
|
Packit |
022b05 |
if (d < 0) continue;
|
|
Packit |
022b05 |
if (d == 0) return *import;
|
|
Packit |
022b05 |
if (d > 0) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (c > 0) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
newImport = xmalloc(sizeof(Import));
|
|
Packit |
022b05 |
newImport->module = module;
|
|
Packit |
022b05 |
newImport->name = name;
|
|
Packit |
022b05 |
newImport->nextPtr = *import;
|
|
Packit |
022b05 |
*import = newImport;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return *import;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void createImportList(SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
SmiModule *smiTypeModule;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
SmiNode *smiNodeIndex;
|
|
Packit |
022b05 |
SmiNodekind kind = SMI_NODEKIND_SCALAR
|
|
Packit |
022b05 |
| SMI_NODEKIND_COLUMN | SMI_NODEKIND_ROW;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(smiModule, kind);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, kind)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (smiNode->nodekind) {
|
|
Packit |
022b05 |
case SMI_NODEKIND_ROW:
|
|
Packit |
022b05 |
for (smiElement = smiGetFirstElement(smiNode); smiElement;
|
|
Packit |
022b05 |
smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
smiNodeIndex = smiGetElementNode(smiElement);
|
|
Packit |
022b05 |
smiType = smiGetNodeType(smiNodeIndex);
|
|
Packit |
022b05 |
if (smiType) {
|
|
Packit |
022b05 |
smiTypeModule = smiGetTypeModule(smiType);
|
|
Packit |
022b05 |
if (smiTypeModule &&
|
|
Packit |
022b05 |
strcmp(smiTypeModule->name, smiModule->name)) {
|
|
Packit |
022b05 |
if (strlen(smiTypeModule->name)) {
|
|
Packit |
022b05 |
addImport(smiTypeModule->name, smiType->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiType->basetype == SMI_BASETYPE_INTEGER32) {
|
|
Packit |
022b05 |
addImport("SNMPv2-SMI", "Integer32");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_NODEKIND_SCALAR:
|
|
Packit |
022b05 |
case SMI_NODEKIND_COLUMN:
|
|
Packit |
022b05 |
smiType = smiGetNodeType(smiNode);
|
|
Packit |
022b05 |
if (smiType) {
|
|
Packit |
022b05 |
smiTypeModule = smiGetTypeModule(smiType);
|
|
Packit |
022b05 |
if (smiTypeModule &&
|
|
Packit |
022b05 |
strcmp(smiTypeModule->name, smiModule->name)) {
|
|
Packit |
022b05 |
if (strlen(smiTypeModule->name)) {
|
|
Packit |
022b05 |
addImport(smiTypeModule->name, smiType->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiType->basetype == SMI_BASETYPE_INTEGER32) {
|
|
Packit |
022b05 |
addImport("SNMPv2-SMI", "Integer32");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void freeImportList(void)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Import *import, *freeme;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (import = importList; import; ) {
|
|
Packit |
022b05 |
freeme = import;
|
|
Packit |
022b05 |
import = import->nextPtr;
|
|
Packit |
022b05 |
xfree(freeme);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
importList = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprint(FILE *f, char *fmt, ...)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
va_list ap;
|
|
Packit |
022b05 |
char *s;
|
|
Packit |
022b05 |
char *p;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
va_start(ap, fmt);
|
|
Packit |
022b05 |
current_column += smiVasprintf(&s, fmt, ap);
|
|
Packit |
022b05 |
va_end(ap);
|
|
Packit |
022b05 |
fputs(s, f);
|
|
Packit |
022b05 |
if ((p = strrchr(s, '\n'))) {
|
|
Packit |
022b05 |
current_column = strlen(p) - 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
free(s);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintSegment(FILE *f, int column, char *string, int length)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
fprint(f, "%*c%s", column, ' ', string);
|
|
Packit |
022b05 |
if (length) {
|
|
Packit |
022b05 |
fprint(f, "%*c", length - strlen(string) - column, ' ');
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintMultilineString(FILE *f, const char *s)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i, len;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, INDENTTEXTS - 1, "\"", 0);
|
|
Packit |
022b05 |
if (s) {
|
|
Packit |
022b05 |
len = strlen(s);
|
|
Packit |
022b05 |
for (i=0; i < len; i++) {
|
|
Packit |
022b05 |
putc(s[i], f);
|
|
Packit |
022b05 |
current_column++;
|
|
Packit |
022b05 |
if (s[i] == '\n') {
|
|
Packit |
022b05 |
current_column = 0;
|
|
Packit |
022b05 |
fprintSegment(f, INDENTTEXTS, "", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
putc('\"', f);
|
|
Packit |
022b05 |
current_column++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintMultiline(FILE *f, const char *s)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i, len;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, INDENTTEXTS, "", 0);
|
|
Packit |
022b05 |
if (s) {
|
|
Packit |
022b05 |
len = strlen(s);
|
|
Packit |
022b05 |
for (i=0; i < len; i++) {
|
|
Packit |
022b05 |
putc(s[i], f);
|
|
Packit |
022b05 |
current_column++;
|
|
Packit |
022b05 |
if (s[i] == '\n') {
|
|
Packit |
022b05 |
current_column = 0;
|
|
Packit |
022b05 |
fprintSegment(f, INDENTTEXTS, "", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
putc('\n', f);
|
|
Packit |
022b05 |
current_column++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *
|
|
Packit |
022b05 |
getStringTime(time_t t)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
static char s[27];
|
|
Packit |
022b05 |
struct tm *tm;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
tm = gmtime(&t);
|
|
Packit |
022b05 |
sprintf(s, "%04d-%02d-%02d %02d:%02d",
|
|
Packit |
022b05 |
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
|
|
Packit |
022b05 |
tm->tm_hour, tm->tm_min);
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void
|
|
Packit |
022b05 |
fprintCommentString(FILE *f, char *s)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i, len;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (s) {
|
|
Packit |
022b05 |
fprintf(f, " * ");
|
|
Packit |
022b05 |
len = strlen(s);
|
|
Packit |
022b05 |
for (i = 0; i < len; i++) {
|
|
Packit |
022b05 |
fputc(s[i], f);
|
|
Packit |
022b05 |
if (s[i] == '\n') {
|
|
Packit |
022b05 |
fprintf(f, " * ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fputc('\n', f);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char* translate(char *s)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
s = xstrdup(s);
|
|
Packit |
022b05 |
for (i = 0; s[i]; i++) {
|
|
Packit |
022b05 |
if (s[i] == '-') s[i] = '_';
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int isGroup(SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *childNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (childNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
childNode;
|
|
Packit |
022b05 |
childNode = smiGetNextChildNode(childNode)) {
|
|
Packit |
022b05 |
if ((childNode->nodekind == SMI_NODEKIND_SCALAR
|
|
Packit |
022b05 |
|| childNode->nodekind == SMI_NODEKIND_TABLE)
|
|
Packit |
022b05 |
&& current(childNode->status)) {
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int isCreatable(SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *childNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((isGroup(smiNode) || smiNode->nodekind == SMI_NODEKIND_ROW)
|
|
Packit |
022b05 |
&& current(smiNode->status)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (childNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
childNode;
|
|
Packit |
022b05 |
childNode = smiGetNextChildNode(childNode)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((childNode->nodekind == SMI_NODEKIND_SCALAR
|
|
Packit |
022b05 |
|| childNode->nodekind == SMI_NODEKIND_COLUMN)
|
|
Packit |
022b05 |
&& current(childNode->status)
|
|
Packit |
022b05 |
&& childNode->access == SMI_ACCESS_READ_WRITE) {
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintDescription(FILE *f, SmiNode *smiNode, int indent)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintSegment(f, indent, "/*\n", 0);
|
|
Packit |
022b05 |
if (smiNode->description) {
|
|
Packit |
022b05 |
fprintMultiline(f, smiNode->description);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiNode->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, indent, "REFERENCE:", 0);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, smiNode->reference);
|
|
Packit |
022b05 |
fprint(f, "\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiNode->units) {
|
|
Packit |
022b05 |
fprintSegment(f, indent, "UNITS:", 0);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, smiNode->units);
|
|
Packit |
022b05 |
fprint(f, "\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, indent, "*/\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintIndex(FILE *f, SmiNode *indexNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
int j;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (j = 0, smiElement = smiGetFirstElement(indexNode);
|
|
Packit |
022b05 |
smiElement;
|
|
Packit |
022b05 |
j++, smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
if (j) {
|
|
Packit |
022b05 |
fprint(f, " ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, smiGetElementNode(smiElement)->name);
|
|
Packit |
022b05 |
/* TODO: non-local name if non-local */
|
|
Packit |
022b05 |
} /* TODO: empty? -> print error */
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintIncludes(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Import *import;
|
|
Packit |
022b05 |
char *lastModulename = NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprint(f, "#include <ASN1Types.idl>\n");
|
|
Packit |
022b05 |
fprint(f, "#include <SNMPMgmt.idl>\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (import = importList; import; import = import->nextPtr) {
|
|
Packit |
022b05 |
if (!lastModulename
|
|
Packit |
022b05 |
|| strcmp(lastModulename, import->module)) {
|
|
Packit |
022b05 |
fprint(f, "#include <%s.idl>\n",
|
|
Packit |
022b05 |
getIdlModuleName(import->module));
|
|
Packit |
022b05 |
lastModulename = import->module;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintImportedTypedefs(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Import *import;
|
|
Packit |
022b05 |
int cnt = 0;
|
|
Packit |
022b05 |
char *idlTypeName;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (import = importList; import; import = import->nextPtr) {
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
idlTypeName = getIdlTypeName(import->module, import->name);
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "typedef ", 0);
|
|
Packit |
022b05 |
fprint(f, "%s::%s %s;\n",
|
|
Packit |
022b05 |
getIdlModuleName(import->module), idlTypeName, idlTypeName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (cnt) {
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintModule(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiRevision *smiRevision;
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
char *idlModuleName;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiNode = smiGetModuleIdentityNode(smiModule);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
idlModuleName = getIdlModuleName(smiModule->name);
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "const ", 0);
|
|
Packit |
022b05 |
fprint(f, "string moduleIdentity = \"%s\";\n", smiNode->name);
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "const ", 0);
|
|
Packit |
022b05 |
fprint(f, "ASN1_ObjectIdentifier %s = \"::%s::%s\";\n\n",
|
|
Packit |
022b05 |
getIdlModuleName(smiNode->name),
|
|
Packit |
022b05 |
idlModuleName, smiNode->name);
|
|
Packit |
022b05 |
if (! silent) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "/*\n", 0);
|
|
Packit |
022b05 |
if (smiModule->description) {
|
|
Packit |
022b05 |
fprintMultiline(f, smiModule->description);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiRevision = smiGetFirstRevision(smiModule);
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "LAST-UPDATED:", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, smiRevision
|
|
Packit |
022b05 |
? getTimeString(smiRevision->date) : "197001010000Z");
|
|
Packit |
022b05 |
fprint(f, "\n\n");
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "ORGANIZATION:", 0);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, smiModule->organization);
|
|
Packit |
022b05 |
fprint(f, "\n\n");
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "CONTACT-INFO:", 0);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, smiModule->contactinfo);
|
|
Packit |
022b05 |
fprint(f, "\n\n");
|
|
Packit |
022b05 |
for (; smiRevision;
|
|
Packit |
022b05 |
smiRevision = smiGetNextRevision(smiRevision)) {
|
|
Packit |
022b05 |
if (! smiRevision->description ||
|
|
Packit |
022b05 |
strcmp(smiRevision->description,
|
|
Packit |
022b05 |
"[Revision added by libsmi due to a LAST-UPDATED clause.]")) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "REVISION:", INDENTVALUE);
|
|
Packit |
022b05 |
fprint(f, "\"%s\"\n", getTimeString(smiRevision->date));
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "REVISION-DESCRIPTION:", 0);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
if (smiRevision->description) {
|
|
Packit |
022b05 |
fprintMultilineString(f, smiRevision->description);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprintMultilineString(f, "...");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "*/", 0);
|
|
Packit |
022b05 |
fprint(f, "\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintType(FILE *f, SmiNode *smiNode, SmiType *smiType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNamedNumber *nn;
|
|
Packit |
022b05 |
char *idlTypeName;
|
|
Packit |
022b05 |
char *nnName;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! silent) {
|
|
Packit |
022b05 |
if (smiType->name) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "/*\n", 0);
|
|
Packit |
022b05 |
if (smiType->description) {
|
|
Packit |
022b05 |
fprintMultiline(f, smiType->description);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiType->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "REFERENCE:", 0);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, smiType->reference);
|
|
Packit |
022b05 |
fprint(f, "\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiType->format) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "DISPLAY-HINT:", 0);
|
|
Packit |
022b05 |
fprint(f, " %s\n", smiType->format);
|
|
Packit |
022b05 |
fprint(f, "\n\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "*/\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! smiType->name) {
|
|
Packit |
022b05 |
idlTypeName = getIdlTypeName(smiGetNodeModule(smiNode)->name,
|
|
Packit |
022b05 |
smiNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
idlTypeName = getIdlTypeName(smiGetTypeModule(smiType)->name,
|
|
Packit |
022b05 |
smiType->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "typedef ", 0);
|
|
Packit |
022b05 |
fprint(f, "%s %s; \n",
|
|
Packit |
022b05 |
getBaseTypeString(smiType->basetype), idlTypeName);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiType->basetype == SMI_BASETYPE_ENUM) {
|
|
Packit |
022b05 |
for (nn = smiGetFirstNamedNumber(smiType);
|
|
Packit |
022b05 |
nn;
|
|
Packit |
022b05 |
nn = smiGetNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "const ", 0);
|
|
Packit |
022b05 |
nnName = translate(nn->name);
|
|
Packit |
022b05 |
fprint(f, "%s %s_%s = %s;\n", idlTypeName, idlTypeName, nnName,
|
|
Packit |
022b05 |
getValueString(&nn->value, smiType));
|
|
Packit |
022b05 |
xfree(nnName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "const string ", 0);
|
|
Packit |
022b05 |
fprint(f, "%s_NameNumberList = \"", idlTypeName);
|
|
Packit |
022b05 |
for (i = 0, nn = smiGetFirstNamedNumber(smiType);
|
|
Packit |
022b05 |
nn;
|
|
Packit |
022b05 |
i++, nn = smiGetNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
nnName = translate(nn->name);
|
|
Packit |
022b05 |
if (i) {
|
|
Packit |
022b05 |
fprint(f, " , ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "%s (%s)", nnName, getValueString(&nn->value, smiType));
|
|
Packit |
022b05 |
xfree(nnName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "\";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintTypedefs(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
SmiNodekind kind = SMI_NODEKIND_SCALAR | SMI_NODEKIND_COLUMN;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiType = smiGetFirstType(smiModule);
|
|
Packit |
022b05 |
smiType;
|
|
Packit |
022b05 |
smiType = smiGetNextType(smiType)) {
|
|
Packit |
022b05 |
if (current(smiType->status)) {
|
|
Packit |
022b05 |
fprintType(f, NULL, smiType);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(smiModule, kind);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, kind)) {
|
|
Packit |
022b05 |
if (current(smiNode->status)) {
|
|
Packit |
022b05 |
smiType = smiGetNodeType(smiNode);
|
|
Packit |
022b05 |
if (smiType && ! smiType->name) {
|
|
Packit |
022b05 |
fprintType(f, smiNode, smiType);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintAttribute(FILE *f, SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *idlTypeName = NULL, *idlNodeName;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
SmiModule *smiModule;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->access < SMI_ACCESS_READ_ONLY) {
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiType = smiGetNodeType(smiNode);
|
|
Packit |
022b05 |
smiModule = smiGetNodeModule(smiNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! smiType) {
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
idlNodeName = getIdlNodeName(smiModule->name, smiNode->name);
|
|
Packit |
022b05 |
idlTypeName = getIdlAnyTypeName(smiNode, smiType);
|
|
Packit |
022b05 |
if (! silent) {
|
|
Packit |
022b05 |
fprintDescription(f, smiNode, 2*INDENT);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT,
|
|
Packit |
022b05 |
smiNode->access == SMI_ACCESS_READ_ONLY
|
|
Packit |
022b05 |
? "readonly attribute" : "attribute", 0);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprint(f, " %s %s;\n", idlTypeName, idlNodeName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintGroupInterface(FILE *f, SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *childNode;
|
|
Packit |
022b05 |
char *idlNodeName;
|
|
Packit |
022b05 |
SmiModule *smiModule, *childModule;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiModule = smiGetNodeModule(smiNode);
|
|
Packit |
022b05 |
idlNodeName = getIdlNodeName(smiModule->name, smiNode->name);
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "interface", 0);
|
|
Packit |
022b05 |
fprint(f, " %s : SNMPMgmt::SmiEntry {\n", idlNodeName);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (childNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
childNode;
|
|
Packit |
022b05 |
childNode = smiGetNextChildNode(childNode)) {
|
|
Packit |
022b05 |
if (childNode->nodekind == SMI_NODEKIND_TABLE
|
|
Packit |
022b05 |
&& current(childNode->status)) {
|
|
Packit |
022b05 |
if (! silent) {
|
|
Packit |
022b05 |
fprintDescription(f, childNode, 2*INDENT);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "SNMPMgmt::SmiTableIterator", 0);
|
|
Packit |
022b05 |
childModule = smiGetNodeModule(childNode);
|
|
Packit |
022b05 |
fprint(f, " get_%s();\n", getIdlNodeName(childModule->name,
|
|
Packit |
022b05 |
childNode->name));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (childNode->nodekind == SMI_NODEKIND_SCALAR
|
|
Packit |
022b05 |
&& current(childNode->status)) {
|
|
Packit |
022b05 |
fprintAttribute(f, childNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintRowInterface(FILE *f, SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *childNode, *relatedNode;
|
|
Packit |
022b05 |
char *idlModuleName, *idlNodeName;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
idlNodeName = getIdlNodeName(smiGetNodeModule(smiNode)->name,
|
|
Packit |
022b05 |
smiNode->name);
|
|
Packit |
022b05 |
if (! silent) {
|
|
Packit |
022b05 |
fprintDescription(f, smiNode, INDENT);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "interface", 0);
|
|
Packit |
022b05 |
if (smiNode->indexkind == SMI_INDEX_AUGMENT
|
|
Packit |
022b05 |
|| smiNode->indexkind == SMI_INDEX_SPARSE) {
|
|
Packit |
022b05 |
relatedNode = smiGetRelatedNode(smiNode);
|
|
Packit |
022b05 |
idlModuleName = getIdlModuleName(smiGetNodeModule(relatedNode)->name);
|
|
Packit |
022b05 |
fprint(f, " %s : %s::%s {\n", idlNodeName,
|
|
Packit |
022b05 |
idlModuleName, relatedNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprint(f, " %s : SNMPMgmt::SmiEntry {\n", idlNodeName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->indexkind == SMI_INDEX_INDEX
|
|
Packit |
022b05 |
|| smiNode->indexkind == SMI_INDEX_REORDER) {
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "const ", 0);
|
|
Packit |
022b05 |
fprint(f, "string IndexVarList = \"");
|
|
Packit |
022b05 |
fprintIndex(f, smiNode);
|
|
Packit |
022b05 |
fprint(f, "\";\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* SMI_INDEX_EXPAND ? */
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (childNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
childNode;
|
|
Packit |
022b05 |
childNode = smiGetNextChildNode(childNode)) {
|
|
Packit |
022b05 |
if (childNode->nodekind == SMI_NODEKIND_COLUMN
|
|
Packit |
022b05 |
&& current(childNode->status)) {
|
|
Packit |
022b05 |
fprintAttribute(f, childNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintInterfaces(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
|
|
Packit |
022b05 |
if (isGroup(smiNode)) {
|
|
Packit |
022b05 |
fprintGroupInterface(f, smiNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiNode->nodekind == SMI_NODEKIND_ROW
|
|
Packit |
022b05 |
&& current(smiNode->status)) {
|
|
Packit |
022b05 |
fprintRowInterface(f, smiNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintConstructor(FILE *f, SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *childNode;
|
|
Packit |
022b05 |
SmiNode *indexNode;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
SmiModule *smiModule;
|
|
Packit |
022b05 |
SmiElement *smiElement = NULL;
|
|
Packit |
022b05 |
char *idlNodeName;
|
|
Packit |
022b05 |
char *idlChildNodeName, *idlChildTypeName;
|
|
Packit |
022b05 |
int cnt = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiModule = smiGetNodeModule(smiNode);
|
|
Packit |
022b05 |
idlNodeName = getIdlNodeName(smiModule->name, smiNode->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "%s create_%s (\n", idlNodeName, idlNodeName);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* First include the INDEXes as parameters to allow row creation
|
|
Packit |
022b05 |
for rows with not-accesible index objects. */
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->indexkind == SMI_INDEX_INDEX
|
|
Packit |
022b05 |
|| smiNode->indexkind == SMI_INDEX_REORDER) {
|
|
Packit |
022b05 |
for (smiElement = smiGetFirstElement(smiNode);
|
|
Packit |
022b05 |
smiElement; smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
indexNode = smiGetElementNode(smiElement);
|
|
Packit |
022b05 |
idlChildNodeName =
|
|
Packit |
022b05 |
getIdlNodeName(smiGetNodeModule(indexNode)->name,
|
|
Packit |
022b05 |
indexNode->name);
|
|
Packit |
022b05 |
smiType = smiGetNodeType(indexNode);
|
|
Packit |
022b05 |
idlChildTypeName = getIdlAnyTypeName(indexNode, smiType);
|
|
Packit |
022b05 |
if (cnt > 1) {
|
|
Packit |
022b05 |
fprint(f, ",\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "in ", 0);
|
|
Packit |
022b05 |
fprint(f, "%s %s", idlChildTypeName, idlChildNodeName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (childNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
childNode;
|
|
Packit |
022b05 |
childNode = smiGetNextChildNode(childNode)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((childNode->nodekind == SMI_NODEKIND_SCALAR
|
|
Packit |
022b05 |
|| childNode->nodekind == SMI_NODEKIND_COLUMN)
|
|
Packit |
022b05 |
&& current(childNode->status)
|
|
Packit |
022b05 |
&& childNode->access == SMI_ACCESS_READ_WRITE) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* Test if this column is already used as parameter
|
|
Packit |
022b05 |
because it is an INDEX of the row. */
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (childNode->nodekind == SMI_NODEKIND_SCALAR
|
|
Packit |
022b05 |
|| childNode->nodekind == SMI_NODEKIND_COLUMN) {
|
|
Packit |
022b05 |
for (smiElement = smiGetFirstElement(smiNode);
|
|
Packit |
022b05 |
smiElement; smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
indexNode = smiGetElementNode(smiElement);
|
|
Packit |
022b05 |
if (indexNode == childNode) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! smiElement) {
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
idlChildNodeName =
|
|
Packit |
022b05 |
getIdlNodeName(smiGetNodeModule(childNode)->name,
|
|
Packit |
022b05 |
childNode->name);
|
|
Packit |
022b05 |
smiType = smiGetNodeType(childNode);
|
|
Packit |
022b05 |
idlChildTypeName = getIdlAnyTypeName(childNode, smiType);
|
|
Packit |
022b05 |
if (cnt > 1) {
|
|
Packit |
022b05 |
fprint(f, ",\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "in ", 0);
|
|
Packit |
022b05 |
fprint(f, "%s %s", idlChildTypeName, idlChildNodeName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, ") raises (\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "SNMPMgmt::AlreadyExists,\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "CosLifeCycle::InvalidCriteria,\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "CosLifeCycle::CannotMeetCriteria\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, ");\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintFactory(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
int cnt = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (isCreatable(smiNode)) {
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
if (cnt == 1) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "interface SmiEntryFactory : "
|
|
Packit |
022b05 |
"SNMPMgmt::GenericFactory {\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintConstructor(f, smiNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (cnt) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintNotificationVBTypes(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode, *listSmiNode;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
char *idlTypeName;
|
|
Packit |
022b05 |
char *idlVBTypeName;
|
|
Packit |
022b05 |
int isnew;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_NOTIFICATION);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiElement = smiGetFirstElement(smiNode);
|
|
Packit |
022b05 |
smiElement; smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
listSmiNode = smiGetElementNode(smiElement);
|
|
Packit |
022b05 |
idlVBTypeName = getIdlVBTypeName(
|
|
Packit |
022b05 |
smiGetNodeModule(listSmiNode)->name,
|
|
Packit |
022b05 |
listSmiNode->name, &isnew);
|
|
Packit |
022b05 |
if (isnew && listSmiNode) {
|
|
Packit |
022b05 |
smiType = smiGetNodeType(listSmiNode);
|
|
Packit |
022b05 |
if (smiType) {
|
|
Packit |
022b05 |
idlTypeName = getIdlAnyTypeName(listSmiNode, smiType);
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "struct ", 0);
|
|
Packit |
022b05 |
fprint(f, "%s {\n", idlVBTypeName);
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "string var_name;\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "string var_index;\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "%s %s;\n", idlTypeName,
|
|
Packit |
022b05 |
smiGetElementNode(smiElement)->name);
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintNotificationTypes(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
char *idlTypeName;
|
|
Packit |
022b05 |
char *idlVBTypeName;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_NOTIFICATION);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((smiElement = smiGetFirstElement(smiNode))) {
|
|
Packit |
022b05 |
idlTypeName = getIdlTypeName(smiGetNodeModule(smiNode)->name,
|
|
Packit |
022b05 |
smiNode->name);
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "struct ", 0);
|
|
Packit |
022b05 |
fprint(f, "%s {\n", idlTypeName);
|
|
Packit |
022b05 |
for (; smiElement; smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
idlVBTypeName = getIdlVBTypeName(smiGetNodeModule(
|
|
Packit |
022b05 |
smiGetElementNode(smiElement))->name,
|
|
Packit |
022b05 |
smiGetElementNode(smiElement)->name, NULL);
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "%s %s;\n", idlVBTypeName,
|
|
Packit |
022b05 |
smiGetElementNode(smiElement)->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintPushNotifications(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
char *idlNodeName;
|
|
Packit |
022b05 |
char *idlTypeName;
|
|
Packit |
022b05 |
int cnt = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_NOTIFICATION);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
if (cnt == 1) {
|
|
Packit |
022b05 |
if (! silent) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT,
|
|
Packit |
022b05 |
"/* typed push event communication */\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "interface Notifications : ", 0);
|
|
Packit |
022b05 |
fprint(f, "SNMPMgmt::Notifications {\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
idlNodeName = getIdlNodeName(smiModule->name,
|
|
Packit |
022b05 |
smiNode->name);
|
|
Packit |
022b05 |
if (! silent) {
|
|
Packit |
022b05 |
fprintDescription(f, smiNode, 2*INDENT);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "void ", 0);
|
|
Packit |
022b05 |
fprint(f, "%s (\n", idlNodeName);
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "in CosNaming::Name src_entry_name,\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "in CORBA::ScopedName event_type,\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "in ASN1_GeneralizedTime event_time", 0);
|
|
Packit |
022b05 |
if ((smiElement = smiGetFirstElement(smiNode))) {
|
|
Packit |
022b05 |
idlTypeName = getIdlTypeName(smiModule->name, smiNode->name);
|
|
Packit |
022b05 |
fprint(f, ",\n");
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "in ", 0);
|
|
Packit |
022b05 |
fprint(f, "%s notification_info", idlTypeName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, ");\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (cnt) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintPullNotifications(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
int cnt = 0;
|
|
Packit |
022b05 |
char *idlNodeName;
|
|
Packit |
022b05 |
char *idlTypeName;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_NOTIFICATION);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
if (cnt == 1) {
|
|
Packit |
022b05 |
if (! silent) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT,
|
|
Packit |
022b05 |
"/* typed pull event communication */\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "interface PullNotifications : ", 0);
|
|
Packit |
022b05 |
fprint(f, "SNMPMgmt::PullNotifications {\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
idlNodeName = getIdlNodeName(smiModule->name, smiNode->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! silent) {
|
|
Packit |
022b05 |
fprintDescription(f, smiNode, 2*INDENT);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "void ", 0);
|
|
Packit |
022b05 |
fprint(f, "pull_%s (\n", idlNodeName);
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "out CosNaming::Name src_entry_name,\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "out CORBA::ScopedName event_type,\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "out ASN1_GeneralizedTime event_time", 0);
|
|
Packit |
022b05 |
if ((smiElement = smiGetFirstElement(smiNode))) {
|
|
Packit |
022b05 |
idlTypeName = getIdlTypeName(smiModule->name, smiNode->name);
|
|
Packit |
022b05 |
fprint(f, ",\n");
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "out ", 0);
|
|
Packit |
022b05 |
fprint(f, "%s notification_info", idlTypeName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, ");\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "boolean ", 0);
|
|
Packit |
022b05 |
fprint(f, "try_%s (\n", idlNodeName);
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "out CosNaming::Name src_entry_name,\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "out CORBA::ScopedName event_type,\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "out ASN1_GeneralizedTime event_time", 0);
|
|
Packit |
022b05 |
if ((smiElement = smiGetFirstElement(smiNode))) {
|
|
Packit |
022b05 |
char *idlTypeName;
|
|
Packit |
022b05 |
idlTypeName = getIdlTypeName(smiModule->name, smiNode->name);
|
|
Packit |
022b05 |
fprint(f, ",\n");
|
|
Packit |
022b05 |
fprintSegment(f, 3*INDENT, "out ", 0);
|
|
Packit |
022b05 |
fprint(f, "%s notification_info", idlTypeName);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, ");\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (cnt) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintDefVals(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
int cnt = 0;
|
|
Packit |
022b05 |
char *idlTypeName;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiNode->value.basetype != SMI_BASETYPE_UNKNOWN) {
|
|
Packit |
022b05 |
smiType = smiGetNodeType(smiNode);
|
|
Packit |
022b05 |
if (smiType) {
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
if (cnt == 1) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "/* pseudo */\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "interface DefaultValues {\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! silent) {
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "/* DEFVAL: ", 0);
|
|
Packit |
022b05 |
fprint(f, " %s */\n",
|
|
Packit |
022b05 |
getValueString(&smiNode->value, smiType));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "", 0);
|
|
Packit |
022b05 |
idlTypeName = getIdlAnyTypeName(smiNode, smiType);
|
|
Packit |
022b05 |
fprint(f, "%s %s();\n\n", idlTypeName, smiNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (cnt) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintDisplayHints(FILE *f, SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
int cnt = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiType = smiGetFirstType(smiModule);
|
|
Packit |
022b05 |
smiType;
|
|
Packit |
022b05 |
smiType = smiGetNextType(smiType)) {
|
|
Packit |
022b05 |
if (current(smiType->status) && smiType->format) {
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
if (cnt == 1) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "/* pseudo */\n", 0);
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "interface TextualConventions {\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
if (! silent) {
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "/*\n", 0);
|
|
Packit |
022b05 |
if (smiType->description) {
|
|
Packit |
022b05 |
fprintMultiline(f, smiType->description);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiType->reference) {
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "REFERENCE:", 0);
|
|
Packit |
022b05 |
fprint(f, "\n");
|
|
Packit |
022b05 |
fprintMultilineString(f, smiType->reference);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiType->format) {
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "DISPLAY-HINT:", 0);
|
|
Packit |
022b05 |
fprint(f, " %s\n", smiType->format);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "*/\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "string %sToString (in %s Value);\n", smiType->name,
|
|
Packit |
022b05 |
getIdlTypeName(smiGetTypeModule(smiType)->name,
|
|
Packit |
022b05 |
smiType->name));
|
|
Packit |
022b05 |
fprintSegment(f, 2*INDENT, "", 0);
|
|
Packit |
022b05 |
fprint(f, "%s %sFromString (in string str);\n",
|
|
Packit |
022b05 |
getIdlTypeName(smiGetTypeModule(smiType)->name,
|
|
Packit |
022b05 |
smiType->name),
|
|
Packit |
022b05 |
smiType->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (cnt) {
|
|
Packit |
022b05 |
fprintSegment(f, INDENT, "};\n\n", 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void dumpIdl(SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *idlModuleName;
|
|
Packit |
022b05 |
FILE *f;
|
|
Packit |
022b05 |
SmiRevision *smiRevision;
|
|
Packit |
022b05 |
char *date;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
f = createFile(getIdlModuleName(smiModule->name), ".idl");
|
|
Packit |
022b05 |
if (! f) {
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"/* \t\t\t\t\t\t-- DO NOT EDIT --\n"
|
|
Packit |
022b05 |
" * Generated by smidump version " SMI_VERSION_STRING ":\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f, " * smidump -f corba %s\n *\n", smiModule->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" * Derived from %s:\n", smiModule->name);
|
|
Packit |
022b05 |
fprintCommentString(f, smiModule->description);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiRevision = smiGetFirstRevision(smiModule);
|
|
Packit |
022b05 |
smiRevision;
|
|
Packit |
022b05 |
smiRevision = smiGetNextRevision(smiRevision)) {
|
|
Packit |
022b05 |
date = getStringTime(smiRevision->date);
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" *\n"
|
|
Packit |
022b05 |
" * Revision %s:\n", date);
|
|
Packit |
022b05 |
fprintCommentString(f, smiRevision->description);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" *\n * $I" "d$\n"
|
|
Packit |
022b05 |
" */\n"
|
|
Packit |
022b05 |
"\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
idlModuleName = getIdlModuleName(smiModule->name);
|
|
Packit |
022b05 |
createImportList(smiModule);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprint(f, "#ifndef _%s_IDL_\n", idlModuleName);
|
|
Packit |
022b05 |
fprint(f, "#define _%s_IDL_\n\n", idlModuleName);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintIncludes(f, smiModule);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprint(f, "module %s {\n\n", idlModuleName);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintImportedTypedefs(f, smiModule);
|
|
Packit |
022b05 |
fprintModule(f, smiModule);
|
|
Packit |
022b05 |
fprintTypedefs(f, smiModule);
|
|
Packit |
022b05 |
fprintInterfaces(f, smiModule);
|
|
Packit |
022b05 |
fprintNotificationVBTypes(f, smiModule);
|
|
Packit |
022b05 |
fprintNotificationTypes(f, smiModule);
|
|
Packit |
022b05 |
fprintPushNotifications(f, smiModule);
|
|
Packit |
022b05 |
fprintPullNotifications(f, smiModule);
|
|
Packit |
022b05 |
fprintFactory(f, smiModule);
|
|
Packit |
022b05 |
fprintDefVals(f, smiModule);
|
|
Packit |
022b05 |
fprintDisplayHints(f, smiModule);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprint(f, "};\n\n");
|
|
Packit |
022b05 |
fprint(f, "#endif /* !_%s_IDL_ */\n", idlModuleName);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
freeImportList();
|
|
Packit |
022b05 |
dictFree(&idlModuleNameList);
|
|
Packit |
022b05 |
dictFree(&idlNodeNameList);
|
|
Packit |
022b05 |
dictFree(&idlTypeNameList);
|
|
Packit |
022b05 |
dictFree(&idlVBTypeNameList);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (fflush(f) || ferror(f)) {
|
|
Packit |
022b05 |
perror("smidump: write error");
|
|
Packit |
022b05 |
exit(1);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fclose(f);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void fprintNameAndOid(FILE *f, SmiNode *smiNode, SmiNode *smiParentNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
unsigned int i;
|
|
Packit |
022b05 |
char *idlModuleName;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
idlModuleName = getIdlModuleName(smiGetNodeModule(smiNode)->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiParentNode) {
|
|
Packit |
022b05 |
fprint(f, "::%s::%s::%s ",
|
|
Packit |
022b05 |
idlModuleName, smiParentNode->name, smiNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprint(f, "::%s::%s ", idlModuleName, smiNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
for (i = 0; i < smiNode->oidlen; i++) {
|
|
Packit |
022b05 |
fprint(f, "%s%u", i ? "." : "", smiNode->oid[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprint(f, " ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void dumpOid(SmiModule *smiModule)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
FILE *f;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
f = createFile(getIdlModuleName(smiModule->name), ".oid");
|
|
Packit |
022b05 |
if (! f) {
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (isGroup(smiNode)) {
|
|
Packit |
022b05 |
fprintNameAndOid(f, smiNode, NULL);
|
|
Packit |
022b05 |
fprint(f, "Group not-accessible\n");
|
|
Packit |
022b05 |
/* XXX what if the node is also of SMI_NODEKIND_MODULE ?? */
|
|
Packit |
022b05 |
continue;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiType = smiGetNodeType(smiNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (smiNode->nodekind) {
|
|
Packit |
022b05 |
case SMI_NODEKIND_NODE:
|
|
Packit |
022b05 |
if (current(smiNode->status)) {
|
|
Packit |
022b05 |
fprintNameAndOid(f, smiNode, NULL);
|
|
Packit |
022b05 |
fprint(f, "ASN1_ObjectIdentifier not-accessible\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_NODEKIND_SCALAR:
|
|
Packit |
022b05 |
if (smiType && current(smiNode->status)) {
|
|
Packit |
022b05 |
SmiNode *smiParentNode = smiGetParentNode(smiNode);
|
|
Packit |
022b05 |
fprintNameAndOid(f, smiNode, smiParentNode);
|
|
Packit |
022b05 |
fprint(f, "%s %s\n",
|
|
Packit |
022b05 |
getBaseTypeString(smiType->basetype),
|
|
Packit |
022b05 |
getAccessString(smiNode->access, 0));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_NODEKIND_TABLE:
|
|
Packit |
022b05 |
if (current(smiNode->status)) {
|
|
Packit |
022b05 |
fprintNameAndOid(f, smiNode, NULL);
|
|
Packit |
022b05 |
fprint(f, "Table not-accessible\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_NODEKIND_ROW:
|
|
Packit |
022b05 |
if (current(smiNode->status)) {
|
|
Packit |
022b05 |
fprintNameAndOid(f, smiNode, NULL);
|
|
Packit |
022b05 |
fprint(f, "TableEntry not-accessible\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_NODEKIND_COLUMN:
|
|
Packit |
022b05 |
if (smiType && current(smiNode->status)) {
|
|
Packit |
022b05 |
SmiNode *smiParentNode = smiGetParentNode(smiNode);
|
|
Packit |
022b05 |
int create = smiParentNode ? smiParentNode->create : 0;
|
|
Packit |
022b05 |
fprintNameAndOid(f, smiNode, smiParentNode);
|
|
Packit |
022b05 |
fprint(f, "%s %s\n",
|
|
Packit |
022b05 |
getBaseTypeString(smiType->basetype),
|
|
Packit |
022b05 |
getAccessString(smiNode->access, create));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_NODEKIND_NOTIFICATION:
|
|
Packit |
022b05 |
if (current(smiNode->status)) {
|
|
Packit |
022b05 |
SmiNode *smiParentNode = smiGetParentNode(smiNode);
|
|
Packit |
022b05 |
fprintNameAndOid(f, smiNode, smiParentNode);
|
|
Packit |
022b05 |
fprint(f, "Notification not-accessible\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_NODEKIND_GROUP:
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_NODEKIND_COMPLIANCE:
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
dictFree(&idlModuleNameList);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (fflush(f) || ferror(f)) {
|
|
Packit |
022b05 |
perror("smidump: write error");
|
|
Packit |
022b05 |
exit(1);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fclose(f);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void dumpCorba(int modc, SmiModule **modv, int flags, char *output)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
silent = (flags & SMIDUMP_FLAG_SILENT);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0; i < modc; i++) {
|
|
Packit |
022b05 |
dumpIdl(modv[i]);
|
|
Packit |
022b05 |
dumpOid(modv[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void initCorba()
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static SmidumpDriver driver = {
|
|
Packit |
022b05 |
"corba",
|
|
Packit |
022b05 |
dumpCorba,
|
|
Packit |
022b05 |
0,
|
|
Packit |
022b05 |
SMIDUMP_DRIVER_CANT_UNITE | SMIDUMP_DRIVER_CANT_OUTPUT,
|
|
Packit |
022b05 |
"corba IDL interface and OID definitions (JIDM)",
|
|
Packit |
022b05 |
NULL,
|
|
Packit |
022b05 |
NULL
|
|
Packit |
022b05 |
};
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smidumpRegisterDriver(&driver);
|
|
Packit |
022b05 |
}
|