|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* dump-jax.c --
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Operations to generate JAX AgentX class files.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Copyright (c) 2000 Frank Strauss, 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-jax.c 1455 2002-10-30 09:17:37Z schoenw $
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <config.h>
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include <stdlib.h>
|
|
Packit |
022b05 |
#include <stdio.h>
|
|
Packit |
022b05 |
#include <string.h>
|
|
Packit |
022b05 |
#include <ctype.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 |
static char *package = NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static struct {
|
|
Packit |
022b05 |
SmiBasetype basetype;
|
|
Packit |
022b05 |
char *smitype;
|
|
Packit |
022b05 |
char *javatype;
|
|
Packit |
022b05 |
char *agentxtype;
|
|
Packit |
022b05 |
} convertType[] = {
|
|
Packit |
022b05 |
{ SMI_BASETYPE_OCTETSTRING, "Opaque", "byte[]", "OPAQUE" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_UNSIGNED32, "TimeTicks", "long", "TIMETICKS" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_UNSIGNED32, "Counter", "long", "COUNTER32" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_UNSIGNED32, "Counter32", "long", "COUNTER32" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_OCTETSTRING, "IpAddress", "byte[]", "IPADDRESS" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_INTEGER32, NULL, "int", "INTEGER" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_OCTETSTRING, NULL, "byte[]", "OCTETSTRING" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_OBJECTIDENTIFIER, NULL, "AgentXOID", "OBJECTIDENTIFIER" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_UNSIGNED32, NULL, "long", "GAUGE32" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_INTEGER64, NULL, "long", "INTEGER" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_UNSIGNED64, NULL, "long", "COUNTER64" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_ENUM, NULL, "int", "INTEGER" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_BITS, NULL, "byte[]", "OCTETSTRING" },
|
|
Packit |
022b05 |
{ SMI_BASETYPE_UNKNOWN, NULL, NULL, NULL }
|
|
Packit |
022b05 |
};
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char* translate1Upper(char *m)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
static char *sarray[5];
|
|
Packit |
022b05 |
static int spos = 0;
|
|
Packit |
022b05 |
char *s;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
s = sarray[spos];
|
|
Packit |
022b05 |
spos++;
|
|
Packit |
022b05 |
if (spos == 5) spos = 0;
|
|
Packit |
022b05 |
if (s) xfree(s);
|
|
Packit |
022b05 |
s = xstrdup(m);
|
|
Packit |
022b05 |
for (i = 0; s[i]; i++) {
|
|
Packit |
022b05 |
if (s[i] == '-') s[i] = '_';
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (islower((int) s[0])) {
|
|
Packit |
022b05 |
s[0] = toupper(s[0]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return s;
|
|
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 *getJavaType(SmiType *smiType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiType) {
|
|
Packit |
022b05 |
for(i=0; convertType[i].basetype != SMI_BASETYPE_UNKNOWN; i++) {
|
|
Packit |
022b05 |
if (smiType->basetype == convertType[i].basetype)
|
|
Packit |
022b05 |
return convertType[i].javatype;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return "<UNKNOWN>";
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static char *getAgentXType(SmiType *smiType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
SmiType *parentType;
|
|
Packit |
022b05 |
SmiModule *smiModule;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiType) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
parentType = smiGetParentType(smiType);
|
|
Packit |
022b05 |
if (parentType) {
|
|
Packit |
022b05 |
smiModule = smiGetTypeModule(parentType);
|
|
Packit |
022b05 |
if (smiModule && strlen(smiModule->name)) {
|
|
Packit |
022b05 |
smiType = parentType;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(i=0; convertType[i].basetype != SMI_BASETYPE_UNKNOWN; i++) {
|
|
Packit |
022b05 |
if (smiType->basetype == convertType[i].basetype) {
|
|
Packit |
022b05 |
if (!convertType[i].smitype) {
|
|
Packit |
022b05 |
return convertType[i].agentxtype;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if ((smiType->name) &&
|
|
Packit |
022b05 |
(!strcmp(convertType[i].smitype, smiType->name))) {
|
|
Packit |
022b05 |
return convertType[i].agentxtype;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return "<UNKNOWN>";
|
|
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 |
if (smiNode->nodekind == SMI_NODEKIND_ROW) {
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
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 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static int isAccessible(SmiNode *groupNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
int num = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiNode = smiGetFirstChildNode(groupNode);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextChildNode(smiNode)) {
|
|
Packit |
022b05 |
if ((smiNode->nodekind == SMI_NODEKIND_SCALAR
|
|
Packit |
022b05 |
|| smiNode->nodekind == SMI_NODEKIND_COLUMN)
|
|
Packit |
022b05 |
&& (smiNode->access == SMI_ACCESS_READ_ONLY
|
|
Packit |
022b05 |
|| smiNode->access == SMI_ACCESS_READ_WRITE)) {
|
|
Packit |
022b05 |
num++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return num;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static unsigned int getMaxSize(SmiType *smiType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiRange *smiRange;
|
|
Packit |
022b05 |
SmiType *parentType;
|
|
Packit |
022b05 |
unsigned int max = 0, size;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (smiType->basetype) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_OCTETSTRING:
|
|
Packit |
022b05 |
size = 65535;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OBJECTIDENTIFIER:
|
|
Packit |
022b05 |
size = 128;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
return 0xffffffff;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(smiRange = smiGetFirstRange(smiType);
|
|
Packit |
022b05 |
smiRange ; smiRange = smiGetNextRange(smiRange)) {
|
|
Packit |
022b05 |
if (smiRange->maxValue.value.unsigned32 > max) {
|
|
Packit |
022b05 |
max = smiRange->maxValue.value.unsigned32;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (max > 0 && max < size) {
|
|
Packit |
022b05 |
size = max;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
parentType = smiGetParentType(smiType);
|
|
Packit |
022b05 |
if (parentType) {
|
|
Packit |
022b05 |
unsigned int psize = getMaxSize(parentType);
|
|
Packit |
022b05 |
if (psize < size) {
|
|
Packit |
022b05 |
size = psize;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return size;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void dumpTable(SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
FILE *f;
|
|
Packit |
022b05 |
SmiNode *parentNode, *columnNode;
|
|
Packit |
022b05 |
unsigned int i;
|
|
Packit |
022b05 |
char *vb_type;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
parentNode = smiGetParentNode(smiNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
f = createFile(translate1Upper(parentNode->name), ".java");
|
|
Packit |
022b05 |
if (! f) {
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"/*\n"
|
|
Packit |
022b05 |
" * This Java file has been generated by smidump "
|
|
Packit |
022b05 |
SMI_VERSION_STRING "." " Do not edit!\n"
|
|
Packit |
022b05 |
" * It is intended to be used within a Java AgentX sub-agent"
|
|
Packit |
022b05 |
" environment.\n"
|
|
Packit |
022b05 |
" *\n"
|
|
Packit |
022b05 |
" * $I" "d$\n"
|
|
Packit |
022b05 |
" */\n\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"/**\n"
|
|
Packit |
022b05 |
" This class represents a Java AgentX (JAX) implementation of\n"
|
|
Packit |
022b05 |
" the table %s defined in %s.\n"
|
|
Packit |
022b05 |
"\n"
|
|
Packit |
022b05 |
" @version 1\n"
|
|
Packit |
022b05 |
" @author smidump " SMI_VERSION_STRING "\n"
|
|
Packit |
022b05 |
" @see AgentXTable\n"
|
|
Packit |
022b05 |
" */\n\n", parentNode->name, smiGetNodeModule(smiNode)->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (package) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"package %s;\n\n", package);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"import java.util.Vector;\n"
|
|
Packit |
022b05 |
"\n"
|
|
Packit |
022b05 |
"import jax.AgentXOID;\n"
|
|
Packit |
022b05 |
"import jax.AgentXVarBind;\n"
|
|
Packit |
022b05 |
"import jax.AgentXResponsePDU;\n"
|
|
Packit |
022b05 |
"import jax.AgentXSetPhase;\n"
|
|
Packit |
022b05 |
"import jax.AgentXTable;\n"
|
|
Packit |
022b05 |
"import jax.AgentXEntry;\n"
|
|
Packit |
022b05 |
"\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f, "public class %s extends AgentXTable\n{\n\n",
|
|
Packit |
022b05 |
translate1Upper(parentNode->name));
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" // entry OID\n"
|
|
Packit |
022b05 |
" private final static long[] OID = {");
|
|
Packit |
022b05 |
for (i = 0; i < smiNode->oidlen; i++) {
|
|
Packit |
022b05 |
fprintf(f, "%s%d", i ? ", " : "", smiNode->oid[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, "};\n\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" // constructors\n"
|
|
Packit |
022b05 |
" public %s()\n", translate1Upper(parentNode->name));
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" {\n"
|
|
Packit |
022b05 |
" oid = new AgentXOID(OID);\n"
|
|
Packit |
022b05 |
"\n"
|
|
Packit |
022b05 |
" // register implemented columns\n");
|
|
Packit |
022b05 |
for (columnNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
columnNode;
|
|
Packit |
022b05 |
columnNode = smiGetNextChildNode(columnNode)) {
|
|
Packit |
022b05 |
if (columnNode->access >= SMI_ACCESS_READ_ONLY) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" columns.addElement(new Long(%d));\n",
|
|
Packit |
022b05 |
columnNode->oid[columnNode->oidlen-1]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" }\n\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public %s(boolean shared)\n",
|
|
Packit |
022b05 |
translate1Upper(parentNode->name));
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" {\n"
|
|
Packit |
022b05 |
" super(shared);\n"
|
|
Packit |
022b05 |
"\n"
|
|
Packit |
022b05 |
" oid = new AgentXOID(OID);\n"
|
|
Packit |
022b05 |
"\n"
|
|
Packit |
022b05 |
" // register implemented columns\n");
|
|
Packit |
022b05 |
for (columnNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
columnNode;
|
|
Packit |
022b05 |
columnNode = smiGetNextChildNode(columnNode)) {
|
|
Packit |
022b05 |
if (columnNode->access >= SMI_ACCESS_READ_ONLY) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" columns.addElement(new Long(%d));\n",
|
|
Packit |
022b05 |
columnNode->oid[columnNode->oidlen-1]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" }\n\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public AgentXVarBind getVarBind(AgentXEntry entry,"
|
|
Packit |
022b05 |
" long column)\n");
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" {\n"
|
|
Packit |
022b05 |
" AgentXOID oid = new AgentXOID(getOID(), column, entry.getInstance());\n"
|
|
Packit |
022b05 |
"\n"
|
|
Packit |
022b05 |
" switch ((int)column) {\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (columnNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
columnNode;
|
|
Packit |
022b05 |
columnNode = smiGetNextChildNode(columnNode)) {
|
|
Packit |
022b05 |
if (columnNode->access >= SMI_ACCESS_NOTIFY) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" case %d: // %s\n",
|
|
Packit |
022b05 |
columnNode->oid[columnNode->oidlen-1],
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" {\n");
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" %s value = ((%s)entry).get_%s();\n",
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(columnNode)),
|
|
Packit |
022b05 |
translate1Upper(smiNode->name),
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" return new AgentXVarBind(oid, "
|
|
Packit |
022b05 |
"AgentXVarBind.%s, value);\n",
|
|
Packit |
022b05 |
getAgentXType(smiGetNodeType(columnNode)));
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" }\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
"\n"
|
|
Packit |
022b05 |
" return null;\n"
|
|
Packit |
022b05 |
" }\n\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public int setEntry(AgentXSetPhase phase,\n"
|
|
Packit |
022b05 |
" AgentXEntry entry,\n"
|
|
Packit |
022b05 |
" long column,\n"
|
|
Packit |
022b05 |
" AgentXVarBind vb)\n");
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" {\n"
|
|
Packit |
022b05 |
"\n"
|
|
Packit |
022b05 |
" switch ((int)column) {\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (columnNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
columnNode;
|
|
Packit |
022b05 |
columnNode = smiGetNextChildNode(columnNode)) {
|
|
Packit |
022b05 |
if (columnNode->access >= SMI_ACCESS_READ_WRITE) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" case %d: // %s\n",
|
|
Packit |
022b05 |
columnNode->oid[columnNode->oidlen-1],
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" {\n");
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" if (vb.getType() != AgentXVarBind.%s)\n"
|
|
Packit |
022b05 |
" return AgentXResponsePDU.WRONG_TYPE;\n",
|
|
Packit |
022b05 |
getAgentXType(smiGetNodeType(columnNode)));
|
|
Packit |
022b05 |
vb_type = getJavaType(smiGetNodeType(columnNode));
|
|
Packit |
022b05 |
vb_type = strcmp("byte[]", vb_type) ? vb_type : "bytes";
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" else\n"
|
|
Packit |
022b05 |
" return ((%s)entry).set_%s(phase, vb.%sValue());\n",
|
|
Packit |
022b05 |
translate1Upper(smiNode->name),
|
|
Packit |
022b05 |
columnNode->name,
|
|
Packit |
022b05 |
vb_type);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" }\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
"\n"
|
|
Packit |
022b05 |
" return AgentXResponsePDU.NOT_WRITABLE;\n"
|
|
Packit |
022b05 |
" }\n\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"}\n\n");
|
|
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 dumpEntry(SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
FILE *f;
|
|
Packit |
022b05 |
SmiNode *columnNode, *indexNode;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
SmiRange *smiRange;
|
|
Packit |
022b05 |
SmiElement *element;
|
|
Packit |
022b05 |
int cnt;
|
|
Packit |
022b05 |
char *p;
|
|
Packit |
022b05 |
char init[20];
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
f = createFile(translate1Upper(smiNode->name), ".java");
|
|
Packit |
022b05 |
if (! f) {
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"/*\n"
|
|
Packit |
022b05 |
" * This Java file has been generated by smidump "
|
|
Packit |
022b05 |
SMI_VERSION_STRING "." " Do not edit!\n"
|
|
Packit |
022b05 |
" * It is intended to be used within a Java AgentX sub-agent"
|
|
Packit |
022b05 |
" environment.\n"
|
|
Packit |
022b05 |
" *\n"
|
|
Packit |
022b05 |
" * $I" "d$\n"
|
|
Packit |
022b05 |
" */\n\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"/**\n"
|
|
Packit |
022b05 |
" This class represents a Java AgentX (JAX) implementation of\n"
|
|
Packit |
022b05 |
" the table row %s defined in %s.\n"
|
|
Packit |
022b05 |
"\n"
|
|
Packit |
022b05 |
" @version 1\n"
|
|
Packit |
022b05 |
" @author smidump " SMI_VERSION_STRING "\n"
|
|
Packit |
022b05 |
" @see AgentXTable, AgentXEntry\n"
|
|
Packit |
022b05 |
" */\n\n", smiNode->name, smiGetNodeModule(smiNode)->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (package) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"package %s;\n\n", package);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"import jax.AgentXOID;\n"
|
|
Packit |
022b05 |
"import jax.AgentXSetPhase;\n"
|
|
Packit |
022b05 |
"import jax.AgentXResponsePDU;\n"
|
|
Packit |
022b05 |
"import jax.AgentXEntry;\n"
|
|
Packit |
022b05 |
"\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f, "public class %s extends AgentXEntry\n{\n\n",
|
|
Packit |
022b05 |
translate1Upper(smiNode->name));
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (columnNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
columnNode;
|
|
Packit |
022b05 |
columnNode = smiGetNextChildNode(columnNode)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiType = smiGetNodeType(columnNode);
|
|
Packit |
022b05 |
if (!smiType) continue;
|
|
Packit |
022b05 |
p = getJavaType(smiType);
|
|
Packit |
022b05 |
if (!strcmp(p, "long")) {
|
|
Packit |
022b05 |
strcpy(init, "0");
|
|
Packit |
022b05 |
} else if (!strcmp(p, "int")) {
|
|
Packit |
022b05 |
strcpy(init, "0");
|
|
Packit |
022b05 |
} else if (!strcmp(p, "byte[]")) {
|
|
Packit |
022b05 |
smiRange = smiGetFirstRange(smiType);
|
|
Packit |
022b05 |
if ((smiRange && (!smiGetNextRange(smiRange)) &&
|
|
Packit |
022b05 |
(!memcmp(&smiRange->minValue, &smiRange->maxValue,
|
|
Packit |
022b05 |
sizeof(SmiValue))))) {
|
|
Packit |
022b05 |
sprintf(init, "new byte[%ld]",
|
|
Packit |
022b05 |
smiRange->maxValue.value.integer32);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
sprintf(init, "new byte[0]");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (!strcmp(p, "AgentXOID")) {
|
|
Packit |
022b05 |
strcpy(init, "new AgentXOID()");
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
strcpy(init, "null");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" protected %s %s = %s;\n",
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(columnNode)),
|
|
Packit |
022b05 |
columnNode->name,
|
|
Packit |
022b05 |
init);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (columnNode->access == SMI_ACCESS_READ_WRITE) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" protected %s undo_%s = %s;\n",
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(columnNode)),
|
|
Packit |
022b05 |
columnNode->name,
|
|
Packit |
022b05 |
init);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
for (element = smiGetFirstElement(smiNode), cnt = 0;
|
|
Packit |
022b05 |
element;
|
|
Packit |
022b05 |
element = smiGetNextElement(element)) {
|
|
Packit |
022b05 |
indexNode = smiGetElementNode(element);
|
|
Packit |
022b05 |
for (columnNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
columnNode;
|
|
Packit |
022b05 |
columnNode = smiGetNextChildNode(columnNode)) {
|
|
Packit |
022b05 |
if (!strcmp(columnNode->name, indexNode->name))
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (!columnNode) {
|
|
Packit |
022b05 |
if (!cnt) {
|
|
Packit |
022b05 |
fprintf(f, " // foreign indices\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
fprintf(f, " protected %s %s;\n",
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(indexNode)),
|
|
Packit |
022b05 |
indexNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, "\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public %s(", translate1Upper(smiNode->name));
|
|
Packit |
022b05 |
for (element = smiGetFirstElement(smiNode), cnt = 0;
|
|
Packit |
022b05 |
element;
|
|
Packit |
022b05 |
element = smiGetNextElement(element)) {
|
|
Packit |
022b05 |
if (cnt) {
|
|
Packit |
022b05 |
fprintf(f, ",\n%*s", 4 + 7 + 1 + strlen(smiNode->name), " ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
indexNode = smiGetElementNode(element);
|
|
Packit |
022b05 |
fprintf(f, "%s %s",
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(indexNode)),
|
|
Packit |
022b05 |
indexNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, ")\n"
|
|
Packit |
022b05 |
" {\n");
|
|
Packit |
022b05 |
for (element = smiGetFirstElement(smiNode);
|
|
Packit |
022b05 |
element;
|
|
Packit |
022b05 |
element = smiGetNextElement(element)) {
|
|
Packit |
022b05 |
indexNode = smiGetElementNode(element);
|
|
Packit |
022b05 |
fprintf(f, " this.%s = %s;\n",
|
|
Packit |
022b05 |
indexNode->name, indexNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, "\n");
|
|
Packit |
022b05 |
for (element = smiGetFirstElement(smiNode);
|
|
Packit |
022b05 |
element;
|
|
Packit |
022b05 |
element = smiGetNextElement(element)) {
|
|
Packit |
022b05 |
indexNode = smiGetElementNode(element);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
p = getJavaType(smiGetNodeType(indexNode));
|
|
Packit |
022b05 |
if (!strcmp(p, "long")) {
|
|
Packit |
022b05 |
fprintf(f, " instance.append(%s);\n",
|
|
Packit |
022b05 |
indexNode->name);
|
|
Packit |
022b05 |
} else if (!strcmp(p, "int")) {
|
|
Packit |
022b05 |
fprintf(f, " instance.append(%s);\n",
|
|
Packit |
022b05 |
indexNode->name);
|
|
Packit |
022b05 |
} else if (!strcmp(p, "byte[]")) {
|
|
Packit |
022b05 |
smiType = smiGetNodeType(indexNode);
|
|
Packit |
022b05 |
smiRange = smiGetFirstRange(smiType);
|
|
Packit |
022b05 |
if ((smiRange && (!smiGetNextRange(smiRange)) &&
|
|
Packit |
022b05 |
(!memcmp(&smiRange->minValue, &smiRange->maxValue,
|
|
Packit |
022b05 |
sizeof(SmiValue)))) ||
|
|
Packit |
022b05 |
(smiNode->implied && (!smiGetNextElement(element)))) {
|
|
Packit |
022b05 |
fprintf(f, " instance.appendImplied(%s);\n",
|
|
Packit |
022b05 |
indexNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprintf(f, " instance.append(%s);\n",
|
|
Packit |
022b05 |
indexNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (!strcmp(p, "AgentXOID")) {
|
|
Packit |
022b05 |
if (smiNode->implied && (!smiGetNextElement(element))) {
|
|
Packit |
022b05 |
fprintf(f, " instance.appendImplied(%s);\n",
|
|
Packit |
022b05 |
indexNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprintf(f, " instance.append(%s);\n",
|
|
Packit |
022b05 |
indexNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprintf(f, " // [smidump: type of %s not supported]\n",
|
|
Packit |
022b05 |
indexNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
"\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (element = smiGetFirstElement(smiNode);
|
|
Packit |
022b05 |
element;
|
|
Packit |
022b05 |
element = smiGetNextElement(element)) {
|
|
Packit |
022b05 |
indexNode = smiGetElementNode(element);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public %s get_%s()\n"
|
|
Packit |
022b05 |
" {\n"
|
|
Packit |
022b05 |
" return %s;\n"
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
"\n",
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(indexNode)),
|
|
Packit |
022b05 |
indexNode->name, indexNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (columnNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
columnNode;
|
|
Packit |
022b05 |
columnNode = smiGetNextChildNode(columnNode)) {
|
|
Packit |
022b05 |
smiType = smiGetNodeType(columnNode);
|
|
Packit |
022b05 |
if (columnNode->access >= SMI_ACCESS_NOTIFY) {
|
|
Packit |
022b05 |
for (element = smiGetFirstElement(smiNode);
|
|
Packit |
022b05 |
element;
|
|
Packit |
022b05 |
element = smiGetNextElement(element)) {
|
|
Packit |
022b05 |
indexNode = smiGetElementNode(element);
|
|
Packit |
022b05 |
if (indexNode == columnNode) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (!element) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public %s get_%s()\n"
|
|
Packit |
022b05 |
" {\n"
|
|
Packit |
022b05 |
" return %s;\n"
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
"\n",
|
|
Packit |
022b05 |
getJavaType(smiType),
|
|
Packit |
022b05 |
columnNode->name, columnNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (columnNode->access == SMI_ACCESS_READ_WRITE) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public int set_%s(AgentXSetPhase phase, %s value)\n"
|
|
Packit |
022b05 |
" {\n",
|
|
Packit |
022b05 |
columnNode->name,
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(columnNode)));
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" switch (phase.getPhase()) {\n"
|
|
Packit |
022b05 |
" case AgentXSetPhase.TEST_SET:\n"
|
|
Packit |
022b05 |
" break;\n"
|
|
Packit |
022b05 |
" case AgentXSetPhase.COMMIT:\n"
|
|
Packit |
022b05 |
" undo_%s = %s;\n",
|
|
Packit |
022b05 |
columnNode->name,
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
if (!strcmp("byte[]", getJavaType(smiGetNodeType(columnNode)))) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" %s = new byte[value.length];\n"
|
|
Packit |
022b05 |
" for(int i = 0; i < value.length; i++)\n"
|
|
Packit |
022b05 |
" %s[i] = value[i];\n",
|
|
Packit |
022b05 |
columnNode->name,
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" %s = value;\n",
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" break;\n"
|
|
Packit |
022b05 |
" case AgentXSetPhase.UNDO:\n"
|
|
Packit |
022b05 |
" %s = undo_%s;\n"
|
|
Packit |
022b05 |
" break;\n",
|
|
Packit |
022b05 |
columnNode->name,
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" case AgentXSetPhase.CLEANUP:\n");
|
|
Packit |
022b05 |
if (!strcmp("byte[]",getJavaType(smiGetNodeType(columnNode)))) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" undo_%s = null;\n",
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" break;\n"
|
|
Packit |
022b05 |
" default:\n"
|
|
Packit |
022b05 |
" return AgentXResponsePDU.PROCESSING_ERROR;\n"
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
" return AgentXResponsePDU.NO_ERROR;\n"
|
|
Packit |
022b05 |
" }\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"}\n\n");
|
|
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 |
static void dumpEntryImpl(SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
FILE *f;
|
|
Packit |
022b05 |
SmiNode *columnNode, *indexNode;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
SmiElement *element;
|
|
Packit |
022b05 |
int cnt;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
f = createFile(translate1Upper(smiNode->name), "Impl.java");
|
|
Packit |
022b05 |
if (! f) {
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"/*\n"
|
|
Packit |
022b05 |
" * This Java file has been generated by smidump "
|
|
Packit |
022b05 |
SMI_VERSION_STRING ". It\n"
|
|
Packit |
022b05 |
" * is intended to be edited by the application programmer and\n"
|
|
Packit |
022b05 |
" * to be used within a Java AgentX sub-agent environment.\n"
|
|
Packit |
022b05 |
" *\n"
|
|
Packit |
022b05 |
" * $I" "d$\n"
|
|
Packit |
022b05 |
" */\n\n");
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"/**\n"
|
|
Packit |
022b05 |
" This class extends the Java AgentX (JAX) implementation of\n"
|
|
Packit |
022b05 |
" the table row %s defined in %s.\n"
|
|
Packit |
022b05 |
" */\n\n", smiNode->name, smiGetNodeModule(smiNode)->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (package) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"package %s;\n\n", package);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"import jax.AgentXOID;\n"
|
|
Packit |
022b05 |
"import jax.AgentXSetPhase;\n"
|
|
Packit |
022b05 |
"import jax.AgentXResponsePDU;\n"
|
|
Packit |
022b05 |
"import jax.AgentXEntry;\n"
|
|
Packit |
022b05 |
"\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f, "public class %sImpl extends %s\n{\n\n",
|
|
Packit |
022b05 |
translate1Upper(smiNode->name),
|
|
Packit |
022b05 |
translate1Upper(smiNode->name));
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" // constructor\n"
|
|
Packit |
022b05 |
" public %sImpl(", translate1Upper(smiNode->name));
|
|
Packit |
022b05 |
for (element = smiGetFirstElement(smiNode), cnt = 0;
|
|
Packit |
022b05 |
element;
|
|
Packit |
022b05 |
element = smiGetNextElement(element)) {
|
|
Packit |
022b05 |
if (cnt) {
|
|
Packit |
022b05 |
fprintf(f, ",\n%*s", 4 + 7 + 1 + strlen(smiNode->name), " ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
indexNode = smiGetElementNode(element);
|
|
Packit |
022b05 |
fprintf(f, "%s %s",
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(indexNode)),
|
|
Packit |
022b05 |
indexNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, ")\n"
|
|
Packit |
022b05 |
" {\n"
|
|
Packit |
022b05 |
" super(");
|
|
Packit |
022b05 |
for (element = smiGetFirstElement(smiNode), cnt = 0;
|
|
Packit |
022b05 |
element;
|
|
Packit |
022b05 |
element = smiGetNextElement(element)) {
|
|
Packit |
022b05 |
if (cnt) {
|
|
Packit |
022b05 |
fprintf(f, ",\n%*s", 2 + strlen(smiNode->name), " ");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
indexNode = smiGetElementNode(element);
|
|
Packit |
022b05 |
fprintf(f, "%s", indexNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,");\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
"\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (columnNode = smiGetFirstChildNode(smiNode);
|
|
Packit |
022b05 |
columnNode;
|
|
Packit |
022b05 |
columnNode = smiGetNextChildNode(columnNode)) {
|
|
Packit |
022b05 |
smiType = smiGetNodeType(columnNode);
|
|
Packit |
022b05 |
if (!smiType) continue;
|
|
Packit |
022b05 |
if (columnNode->access >= SMI_ACCESS_NOTIFY) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public %s get_%s()\n"
|
|
Packit |
022b05 |
" {\n"
|
|
Packit |
022b05 |
" return %s;\n"
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
"\n",
|
|
Packit |
022b05 |
getJavaType(smiType),
|
|
Packit |
022b05 |
columnNode->name, columnNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (columnNode->access == SMI_ACCESS_READ_WRITE) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public int set_%s(AgentXSetPhase phase, %s value)\n"
|
|
Packit |
022b05 |
" {\n",
|
|
Packit |
022b05 |
columnNode->name,
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(columnNode)));
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" switch (phase.getPhase()) {\n"
|
|
Packit |
022b05 |
" case AgentXSetPhase.TEST_SET:\n"
|
|
Packit |
022b05 |
" break;\n"
|
|
Packit |
022b05 |
" case AgentXSetPhase.COMMIT:\n"
|
|
Packit |
022b05 |
" undo_%s = %s;\n",
|
|
Packit |
022b05 |
columnNode->name,
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
if (!strcmp("byte[]", getJavaType(smiGetNodeType(columnNode)))) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" %s = new byte[value.length];\n"
|
|
Packit |
022b05 |
" for(int i = 0; i < value.length; i++)\n"
|
|
Packit |
022b05 |
" %s[i] = value[i];\n",
|
|
Packit |
022b05 |
columnNode->name,
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" %s = value;\n",
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" break;\n"
|
|
Packit |
022b05 |
" case AgentXSetPhase.UNDO:\n"
|
|
Packit |
022b05 |
" %s = undo_%s;\n"
|
|
Packit |
022b05 |
" break;\n",
|
|
Packit |
022b05 |
columnNode->name,
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" case AgentXSetPhase.CLEANUP:\n");
|
|
Packit |
022b05 |
if (!strcmp("byte[]",getJavaType(smiGetNodeType(columnNode)))) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" undo_%s = null;\n",
|
|
Packit |
022b05 |
columnNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" break;\n"
|
|
Packit |
022b05 |
" default:\n"
|
|
Packit |
022b05 |
" return AgentXResponsePDU.PROCESSING_ERROR;\n"
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
" return AgentXResponsePDU.NO_ERROR;\n"
|
|
Packit |
022b05 |
" }\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"}\n\n");
|
|
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 SmiNode *dumpScalars(SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
FILE *f;
|
|
Packit |
022b05 |
char *vb_type;
|
|
Packit |
022b05 |
SmiNode *parentNode, *currNode;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
SmiRange *smiRange;
|
|
Packit |
022b05 |
unsigned int i;
|
|
Packit |
022b05 |
char *p;
|
|
Packit |
022b05 |
char init[20];
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
parentNode = smiGetParentNode(smiNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
f = createFile(translate1Upper(parentNode->name), ".java");
|
|
Packit |
022b05 |
if (! f) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"/*\n"
|
|
Packit |
022b05 |
" * This Java file has been generated by smidump "
|
|
Packit |
022b05 |
SMI_VERSION_STRING "." " Do not edit!\n"
|
|
Packit |
022b05 |
" * It is intended to be used within a Java AgentX sub-agent"
|
|
Packit |
022b05 |
" environment.\n"
|
|
Packit |
022b05 |
" *\n"
|
|
Packit |
022b05 |
" * $I" "d$\n"
|
|
Packit |
022b05 |
" */\n\n");
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"/**\n"
|
|
Packit |
022b05 |
" This class represents a Java AgentX (JAX) implementation of\n"
|
|
Packit |
022b05 |
" the scalar group %s defined in %s.\n"
|
|
Packit |
022b05 |
"\n"
|
|
Packit |
022b05 |
" @version 1\n"
|
|
Packit |
022b05 |
" @author smidump " SMI_VERSION_STRING "\n"
|
|
Packit |
022b05 |
" @see AgentXGroup, AgentXScalars\n"
|
|
Packit |
022b05 |
" */\n\n", parentNode->name, smiGetNodeModule(smiNode)->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (package) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"package %s;\n\n", package);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"import java.util.Vector;\n"
|
|
Packit |
022b05 |
"import java.util.Enumeration;\n"
|
|
Packit |
022b05 |
"import jax.AgentXOID;\n"
|
|
Packit |
022b05 |
"import jax.AgentXVarBind;\n"
|
|
Packit |
022b05 |
"import jax.AgentXSetPhase;\n"
|
|
Packit |
022b05 |
"import jax.AgentXResponsePDU;\n"
|
|
Packit |
022b05 |
"import jax.AgentXScalars;\n"
|
|
Packit |
022b05 |
"\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f, "public class %s extends AgentXScalars\n{\n\n",
|
|
Packit |
022b05 |
translate1Upper(parentNode->name));
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" private final static long[] %sOID = {",
|
|
Packit |
022b05 |
translate1Upper(parentNode->name));
|
|
Packit |
022b05 |
for (i = 0; i < parentNode->oidlen; i++) {
|
|
Packit |
022b05 |
fprintf(f, "%s%d", i ? ", " : "", parentNode->oid[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, "};\n\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* ------- variable definitions */
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (currNode = smiNode;
|
|
Packit |
022b05 |
currNode && (currNode->nodekind == SMI_NODEKIND_SCALAR) ;
|
|
Packit |
022b05 |
currNode = smiGetNextNode(currNode,SMI_NODEKIND_ANY)) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" protected AgentXOID %sOID;\n"
|
|
Packit |
022b05 |
" protected final static long[] %sName = {",
|
|
Packit |
022b05 |
translate1Upper(currNode->name),
|
|
Packit |
022b05 |
translate1Upper(currNode->name)
|
|
Packit |
022b05 |
);
|
|
Packit |
022b05 |
for (i = 0; i < currNode->oidlen; i++) {
|
|
Packit |
022b05 |
fprintf(f, "%s%d", i ? ", " : "", currNode->oid[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, ", 0};\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiType = smiGetNodeType(currNode);
|
|
Packit |
022b05 |
p = getJavaType(smiType);
|
|
Packit |
022b05 |
if (!strcmp(p, "long")) {
|
|
Packit |
022b05 |
strcpy(init, "0");
|
|
Packit |
022b05 |
} else if (!strcmp(p, "int")) {
|
|
Packit |
022b05 |
strcpy(init, "0");
|
|
Packit |
022b05 |
} else if (!strcmp(p, "byte[]")) {
|
|
Packit |
022b05 |
smiRange = smiGetFirstRange(smiType);
|
|
Packit |
022b05 |
if ((smiRange && (!smiGetNextRange(smiRange)) &&
|
|
Packit |
022b05 |
(!memcmp(&smiRange->minValue, &smiRange->maxValue,
|
|
Packit |
022b05 |
sizeof(SmiValue))))) {
|
|
Packit |
022b05 |
sprintf(init, "new byte[%ld]",
|
|
Packit |
022b05 |
smiRange->maxValue.value.integer32);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
sprintf(init, "new byte[0]");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (!strcmp(p, "AgentXOID")) {
|
|
Packit |
022b05 |
strcpy(init, "new AgentXOID()");
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
strcpy(init, "null");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" protected %s %s = %s;\n",
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(currNode)),
|
|
Packit |
022b05 |
currNode->name,
|
|
Packit |
022b05 |
init);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (currNode->access == SMI_ACCESS_READ_WRITE) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" protected %s undo_%s = %s;\n",
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(currNode)),
|
|
Packit |
022b05 |
currNode->name,
|
|
Packit |
022b05 |
init);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
/* ------- constructor */
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public %s()\n {\n"
|
|
Packit |
022b05 |
" oid = new AgentXOID(%sOID);\n"
|
|
Packit |
022b05 |
" data = new Vector();\n",
|
|
Packit |
022b05 |
translate1Upper(parentNode->name),
|
|
Packit |
022b05 |
translate1Upper(parentNode->name));
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (currNode = smiNode;
|
|
Packit |
022b05 |
currNode && (currNode->nodekind == SMI_NODEKIND_SCALAR) ;
|
|
Packit |
022b05 |
currNode = smiGetNextNode(currNode,SMI_NODEKIND_ANY)) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" %sOID = new AgentXOID(%sName);\n"
|
|
Packit |
022b05 |
" data.addElement(%sOID);\n",
|
|
Packit |
022b05 |
translate1Upper(currNode->name),
|
|
Packit |
022b05 |
translate1Upper(currNode->name),
|
|
Packit |
022b05 |
translate1Upper(currNode->name));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f," }\n\n");
|
|
Packit |
022b05 |
/* ------- get & set methods */
|
|
Packit |
022b05 |
for (currNode = smiNode;
|
|
Packit |
022b05 |
currNode && (currNode->nodekind == SMI_NODEKIND_SCALAR) ;
|
|
Packit |
022b05 |
currNode = smiGetNextNode(currNode,SMI_NODEKIND_ANY)) {
|
|
Packit |
022b05 |
smiType = smiGetNodeType(currNode);
|
|
Packit |
022b05 |
if (currNode->access >= SMI_ACCESS_NOTIFY) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public %s get_%s()\n"
|
|
Packit |
022b05 |
" {\n"
|
|
Packit |
022b05 |
" return %s;\n"
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
"\n",
|
|
Packit |
022b05 |
getJavaType(smiType),
|
|
Packit |
022b05 |
currNode->name, currNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (currNode->access == SMI_ACCESS_READ_WRITE) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public int set_%s(AgentXSetPhase phase, %s value)\n"
|
|
Packit |
022b05 |
" {\n",
|
|
Packit |
022b05 |
currNode->name,
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(currNode)));
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" switch (phase.getPhase()) {\n"
|
|
Packit |
022b05 |
" case AgentXSetPhase.TEST_SET:\n"
|
|
Packit |
022b05 |
" break;\n"
|
|
Packit |
022b05 |
" case AgentXSetPhase.COMMIT:\n"
|
|
Packit |
022b05 |
" undo_%s = %s;\n",
|
|
Packit |
022b05 |
currNode->name,
|
|
Packit |
022b05 |
currNode->name);
|
|
Packit |
022b05 |
if (!strcmp("byte[]", getJavaType(smiGetNodeType(currNode)))) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" %s = new byte[value.length];\n"
|
|
Packit |
022b05 |
" for(int i = 0; i < value.length; i++)\n"
|
|
Packit |
022b05 |
" %s[i] = value[i];\n",
|
|
Packit |
022b05 |
currNode->name,
|
|
Packit |
022b05 |
currNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" %s = value;\n",
|
|
Packit |
022b05 |
currNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" break;\n"
|
|
Packit |
022b05 |
" case AgentXSetPhase.UNDO:\n"
|
|
Packit |
022b05 |
" %s = undo_%s;\n"
|
|
Packit |
022b05 |
" break;\n",
|
|
Packit |
022b05 |
currNode->name,
|
|
Packit |
022b05 |
currNode->name);
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" case AgentXSetPhase.CLEANUP:\n");
|
|
Packit |
022b05 |
if (!strcmp("byte[]",getJavaType(smiGetNodeType(currNode)))) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" undo_%s = null;\n",
|
|
Packit |
022b05 |
currNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" break;\n"
|
|
Packit |
022b05 |
" default:\n"
|
|
Packit |
022b05 |
" return AgentXResponsePDU.PROCESSING_ERROR;\n"
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
" return AgentXResponsePDU.NO_ERROR;\n"
|
|
Packit |
022b05 |
" }\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
/* ------ handle get get-next and set requests */
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public AgentXVarBind getScalar(AgentXOID pos,"
|
|
Packit |
022b05 |
" AgentXOID oid)\n"
|
|
Packit |
022b05 |
" {\n"
|
|
Packit |
022b05 |
" if ((pos == null) || (pos.compareTo(oid) != 0))\n"
|
|
Packit |
022b05 |
" return new AgentXVarBind(oid,"
|
|
Packit |
022b05 |
" AgentXVarBind.NOSUCHOBJECT);\n"
|
|
Packit |
022b05 |
" else {\n"
|
|
Packit |
022b05 |
);
|
|
Packit |
022b05 |
for (currNode = smiNode;
|
|
Packit |
022b05 |
currNode && (currNode->nodekind == SMI_NODEKIND_SCALAR) ;
|
|
Packit |
022b05 |
currNode = smiGetNextNode(currNode,SMI_NODEKIND_ANY)) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" if (pos == %sOID)\n"
|
|
Packit |
022b05 |
" return new AgentXVarBind(oid,"
|
|
Packit |
022b05 |
" AgentXVarBind.%s, \n"
|
|
Packit |
022b05 |
" get_%s());\n",
|
|
Packit |
022b05 |
translate1Upper(currNode->name),
|
|
Packit |
022b05 |
getAgentXType(smiGetNodeType(currNode)),
|
|
Packit |
022b05 |
currNode->name
|
|
Packit |
022b05 |
);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
" return new AgentXVarBind(oid,"
|
|
Packit |
022b05 |
" AgentXVarBind.NOSUCHOBJECT);\n }\n\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public int setScalar(AgentXSetPhase phase,"
|
|
Packit |
022b05 |
" AgentXOID pos,\n"
|
|
Packit |
022b05 |
" AgentXVarBind inVb)\n {\n"
|
|
Packit |
022b05 |
" if ((pos == null) || (pos.compareTo(inVb.getOID()) != 0))\n"
|
|
Packit |
022b05 |
" return AgentXResponsePDU.INCONSISTENT_NAME;\n"
|
|
Packit |
022b05 |
" else {\n"
|
|
Packit |
022b05 |
);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (currNode = smiNode;
|
|
Packit |
022b05 |
currNode && (currNode->nodekind == SMI_NODEKIND_SCALAR) ;
|
|
Packit |
022b05 |
currNode = smiGetNextNode(currNode,SMI_NODEKIND_ANY)) {
|
|
Packit |
022b05 |
vb_type = getJavaType(smiGetNodeType(currNode));
|
|
Packit |
022b05 |
vb_type = strcmp("byte[]", vb_type) ? vb_type : "bytes";
|
|
Packit |
022b05 |
if (currNode->access == SMI_ACCESS_READ_WRITE)
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" if (pos == %sOID)\n"
|
|
Packit |
022b05 |
" return "
|
|
Packit |
022b05 |
"set_%s(phase, inVb.%sValue());\n",
|
|
Packit |
022b05 |
translate1Upper(currNode->name),
|
|
Packit |
022b05 |
currNode->name,
|
|
Packit |
022b05 |
vb_type
|
|
Packit |
022b05 |
);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
" return AgentXResponsePDU.NOT_WRITABLE;\n"
|
|
Packit |
022b05 |
" }\n\n");
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public AgentXVarBind getNextScalar(AgentXOID pos,"
|
|
Packit |
022b05 |
" AgentXOID oid)\n {\n"
|
|
Packit |
022b05 |
" if ((pos == null) || (pos.compareTo(oid) <= 0))\n"
|
|
Packit |
022b05 |
" return new AgentXVarBind(oid,"
|
|
Packit |
022b05 |
" AgentXVarBind.ENDOFMIBVIEW);\n"
|
|
Packit |
022b05 |
" else {\n"
|
|
Packit |
022b05 |
);
|
|
Packit |
022b05 |
for (currNode = smiNode;
|
|
Packit |
022b05 |
currNode && (currNode->nodekind == SMI_NODEKIND_SCALAR) ;
|
|
Packit |
022b05 |
currNode = smiGetNextNode(currNode,SMI_NODEKIND_ANY)) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" if (pos == %sOID)\n"
|
|
Packit |
022b05 |
" return new AgentXVarBind(pos,"
|
|
Packit |
022b05 |
" AgentXVarBind.%s, \n"
|
|
Packit |
022b05 |
" get_%s());\n",
|
|
Packit |
022b05 |
translate1Upper(currNode->name),
|
|
Packit |
022b05 |
getAgentXType(smiGetNodeType(currNode)),
|
|
Packit |
022b05 |
currNode->name
|
|
Packit |
022b05 |
);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
" return new AgentXVarBind(pos,"
|
|
Packit |
022b05 |
" AgentXVarBind.ENDOFMIBVIEW);\n }\n\n");
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"}\n\n");
|
|
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 |
/* skip all already processed nodes */
|
|
Packit |
022b05 |
for(;
|
|
Packit |
022b05 |
smiNode && (smiNode->nodekind == SMI_NODEKIND_SCALAR);
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return smiNode;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void dumpNotifications(SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
FILE *f;
|
|
Packit |
022b05 |
int cnt;
|
|
Packit |
022b05 |
unsigned int i;
|
|
Packit |
022b05 |
SmiElement *element;
|
|
Packit |
022b05 |
SmiNode *elementNode;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiType *snt;
|
|
Packit |
022b05 |
snt = smiGetNodeType(smiNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
f = createFile(translate1Upper(smiNode->name), ".java");
|
|
Packit |
022b05 |
if (! f) {
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"/*\n"
|
|
Packit |
022b05 |
" * This Java file has been generated by smidump "
|
|
Packit |
022b05 |
SMI_VERSION_STRING "." " Do not edit!\n"
|
|
Packit |
022b05 |
" * It is intended to be used within a Java AgentX sub-agent"
|
|
Packit |
022b05 |
" environment.\n"
|
|
Packit |
022b05 |
" *\n"
|
|
Packit |
022b05 |
" * $I" "d$\n"
|
|
Packit |
022b05 |
" */\n\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (package) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"package %s;\n\n", package);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"import jax.AgentXOID;\n"
|
|
Packit |
022b05 |
"import jax.AgentXVarBind;\n"
|
|
Packit |
022b05 |
"import jax.AgentXNotification;\n"
|
|
Packit |
022b05 |
"import java.util.Vector;\n"
|
|
Packit |
022b05 |
"\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f, "public class %s extends AgentXNotification\n{\n\n",
|
|
Packit |
022b05 |
translate1Upper(smiNode->name));
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" private final static long[] %s_OID = {",
|
|
Packit |
022b05 |
smiNode->name);
|
|
Packit |
022b05 |
for (i = 0; i < smiNode->oidlen; i++) {
|
|
Packit |
022b05 |
fprintf(f, "%s%d", i ? ", " : "", smiNode->oid[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, "};\n");
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" private static AgentXVarBind snmpTrapOID_VarBind =\n"
|
|
Packit |
022b05 |
" new AgentXVarBind(snmpTrapOID_OID,\n"
|
|
Packit |
022b05 |
" AgentXVarBind.OBJECTIDENTIFIER,\n"
|
|
Packit |
022b05 |
" new AgentXOID(%s_OID));\n\n",
|
|
Packit |
022b05 |
smiNode->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (element = smiGetFirstElement(smiNode), cnt = 1;
|
|
Packit |
022b05 |
element;
|
|
Packit |
022b05 |
element = smiGetNextElement(element), cnt++) {
|
|
Packit |
022b05 |
elementNode = smiGetElementNode(element);
|
|
Packit |
022b05 |
fprintf(f, " private final static long[] OID%d = {", cnt);
|
|
Packit |
022b05 |
for (i = 0; i < elementNode->oidlen; i++) {
|
|
Packit |
022b05 |
fprintf(f, "%s%d", i ? ", " : "", elementNode->oid[i]);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"};\n"
|
|
Packit |
022b05 |
" private final AgentXOID %s_OID = "
|
|
Packit |
022b05 |
"new AgentXOID(OID%d",
|
|
Packit |
022b05 |
elementNode->name, cnt);
|
|
Packit |
022b05 |
fprintf(f,");\n");
|
|
Packit |
022b05 |
#if 0
|
|
Packit |
022b05 |
if (elementNode->nodekind != SMI_NODEKIND_COLUMN ||
|
|
Packit |
022b05 |
(smiGetNodeModule(elementNode) != smiGetNodeModule(smiNode))) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" private static AgentXVarBind varBind_%s = new AgentXVarBind(\n"
|
|
Packit |
022b05 |
" %sOID, AgentXVarBind.%s\n);\n",
|
|
Packit |
022b05 |
elementNode->name,
|
|
Packit |
022b05 |
elementNode->name,
|
|
Packit |
022b05 |
getAgentXType(smiGetNodeType(elementNode)));
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"\n\n public %s(",
|
|
Packit |
022b05 |
translate1Upper(smiNode->name));
|
|
Packit |
022b05 |
for (element = smiGetFirstElement(smiNode), cnt = 0;
|
|
Packit |
022b05 |
element;
|
|
Packit |
022b05 |
element = smiGetNextElement(element)) {
|
|
Packit |
022b05 |
elementNode = smiGetElementNode(element);
|
|
Packit |
022b05 |
if (smiGetNodeModule(elementNode) == smiGetNodeModule(smiNode)) {
|
|
Packit |
022b05 |
if (cnt) fprintf(f,", ");
|
|
Packit |
022b05 |
cnt++;
|
|
Packit |
022b05 |
fprintf(f, "%s %s_%d",
|
|
Packit |
022b05 |
translate1Upper(smiGetParentNode(elementNode)->name),
|
|
Packit |
022b05 |
smiGetParentNode(elementNode)->name, cnt);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f, ") {\n"
|
|
Packit |
022b05 |
" AgentXOID oid;\n"
|
|
Packit |
022b05 |
" AgentXVarBind varBind;\n"
|
|
Packit |
022b05 |
"\n"
|
|
Packit |
022b05 |
" // add the snmpTrapOID object\n"
|
|
Packit |
022b05 |
" varBindList.addElement(snmpTrapOID_VarBind);\n");
|
|
Packit |
022b05 |
for (element = smiGetFirstElement(smiNode), cnt = 1;
|
|
Packit |
022b05 |
element;
|
|
Packit |
022b05 |
element = smiGetNextElement(element), cnt++) {
|
|
Packit |
022b05 |
elementNode = smiGetElementNode(element);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiGetNodeModule(elementNode) == smiGetNodeModule(smiNode)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"\n // add the %s %s object of %s_%d\n",
|
|
Packit |
022b05 |
elementNode->name,
|
|
Packit |
022b05 |
elementNode->nodekind == SMI_NODEKIND_COLUMN ?
|
|
Packit |
022b05 |
"columnar" : "scalar",
|
|
Packit |
022b05 |
smiGetParentNode(elementNode)->name, cnt);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (elementNode->nodekind == SMI_NODEKIND_COLUMN) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" oid = %s_OID;\n"
|
|
Packit |
022b05 |
" oid.appendImplied(%s_%d.getInstance());\n",
|
|
Packit |
022b05 |
elementNode->name,
|
|
Packit |
022b05 |
smiGetParentNode(elementNode)->name, cnt);
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" varBind = new AgentXVarBind(oid,\n"
|
|
Packit |
022b05 |
" AgentXVarBind.%s,\n"
|
|
Packit |
022b05 |
" %s_%d.get_%s());\n",
|
|
Packit |
022b05 |
getAgentXType(smiGetNodeType(elementNode)),
|
|
Packit |
022b05 |
smiGetParentNode(elementNode)->name, cnt,
|
|
Packit |
022b05 |
elementNode->name);
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" varBindList.addElement(varBind);\n");
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" oid = %s_OID;\n",
|
|
Packit |
022b05 |
elementNode->name);
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" oid.append(0);\n");
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" varBind = new AgentXVarBind(oid,\n"
|
|
Packit |
022b05 |
" AgentXVarBind.%s,\n"
|
|
Packit |
022b05 |
" %s_%d.get_%s());\n",
|
|
Packit |
022b05 |
getAgentXType(smiGetNodeType(elementNode)),
|
|
Packit |
022b05 |
smiGetParentNode(elementNode)->name, cnt,
|
|
Packit |
022b05 |
elementNode->name);
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" varBindList.addElement(varBind);\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" // the notification's object %s "
|
|
Packit |
022b05 |
"is not contained in this module.\n",
|
|
Packit |
022b05 |
elementNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" }\n\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public Vector getVarBindList() {\n"
|
|
Packit |
022b05 |
" return varBindList;\n }\n\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"}\n\n");
|
|
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 |
static void dumpScalarImpl(SmiNode *smiNode)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
FILE *f;
|
|
Packit |
022b05 |
SmiNode *parentNode, *currNode;
|
|
Packit |
022b05 |
SmiType *smiType;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
parentNode = smiGetParentNode(smiNode);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
f = createFile(translate1Upper(parentNode->name), "Impl.java");
|
|
Packit |
022b05 |
if (! f) {
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"/*\n"
|
|
Packit |
022b05 |
" * This Java file has been generated by smidump "
|
|
Packit |
022b05 |
SMI_VERSION_STRING ". It\n"
|
|
Packit |
022b05 |
" * is intended to be edited by the application programmer and\n"
|
|
Packit |
022b05 |
" * to be used within a Java AgentX sub-agent environment.\n"
|
|
Packit |
022b05 |
" *\n"
|
|
Packit |
022b05 |
" * $I" "d$\n"
|
|
Packit |
022b05 |
" */\n\n");
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"/**\n"
|
|
Packit |
022b05 |
" This class extends the Java AgentX (JAX) implementation of\n"
|
|
Packit |
022b05 |
" the scalar group %s defined in %s.\n"
|
|
Packit |
022b05 |
" */\n\n", parentNode->name, smiGetNodeModule(smiNode)->name);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (package) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"package %s;\n\n", package);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"import java.util.Vector;\n"
|
|
Packit |
022b05 |
"import java.util.Enumeration;\n"
|
|
Packit |
022b05 |
"import jax.AgentXOID;\n"
|
|
Packit |
022b05 |
"import jax.AgentXSetPhase;\n"
|
|
Packit |
022b05 |
"import jax.AgentXResponsePDU;\n"
|
|
Packit |
022b05 |
"\n");
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
fprintf(f, "public class %sImpl extends %s\n{\n\n",
|
|
Packit |
022b05 |
translate1Upper(parentNode->name),
|
|
Packit |
022b05 |
translate1Upper(parentNode->name));
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (currNode = smiNode;
|
|
Packit |
022b05 |
currNode && (currNode->nodekind == SMI_NODEKIND_SCALAR) ;
|
|
Packit |
022b05 |
currNode = smiGetNextNode(currNode,SMI_NODEKIND_ANY)) {
|
|
Packit |
022b05 |
smiType = smiGetNodeType(currNode);
|
|
Packit |
022b05 |
if (currNode->access >= SMI_ACCESS_NOTIFY) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public %s get_%s()\n"
|
|
Packit |
022b05 |
" {\n"
|
|
Packit |
022b05 |
" return %s;\n"
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
"\n",
|
|
Packit |
022b05 |
getJavaType(smiType),
|
|
Packit |
022b05 |
currNode->name, currNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (currNode->access == SMI_ACCESS_READ_WRITE) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" public int set_%s(AgentXSetPhase phase, %s value)\n"
|
|
Packit |
022b05 |
" {\n",
|
|
Packit |
022b05 |
currNode->name,
|
|
Packit |
022b05 |
getJavaType(smiGetNodeType(currNode)));
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" switch (phase.getPhase()) {\n"
|
|
Packit |
022b05 |
" case AgentXSetPhase.TEST_SET:\n"
|
|
Packit |
022b05 |
" break;\n"
|
|
Packit |
022b05 |
" case AgentXSetPhase.COMMIT:\n"
|
|
Packit |
022b05 |
" undo_%s = %s;\n",
|
|
Packit |
022b05 |
currNode->name,
|
|
Packit |
022b05 |
currNode->name);
|
|
Packit |
022b05 |
if (!strcmp("byte[]", getJavaType(smiGetNodeType(currNode)))) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" %s = new byte[value.length];\n"
|
|
Packit |
022b05 |
" for(int i = 0; i < value.length; i++)\n"
|
|
Packit |
022b05 |
" %s[i] = value[i];\n",
|
|
Packit |
022b05 |
currNode->name,
|
|
Packit |
022b05 |
currNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" %s = value;\n",
|
|
Packit |
022b05 |
currNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" break;\n"
|
|
Packit |
022b05 |
" case AgentXSetPhase.UNDO:\n"
|
|
Packit |
022b05 |
" %s = undo_%s;\n"
|
|
Packit |
022b05 |
" break;\n",
|
|
Packit |
022b05 |
currNode->name,
|
|
Packit |
022b05 |
currNode->name);
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" case AgentXSetPhase.CLEANUP:\n");
|
|
Packit |
022b05 |
if (!strcmp("byte[]",getJavaType(smiGetNodeType(currNode)))) {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" undo_%s = null;\n",
|
|
Packit |
022b05 |
currNode->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" undo_%s = -1; // TODO: better check!\n",
|
|
Packit |
022b05 |
currNode->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
" break;\n"
|
|
Packit |
022b05 |
" default:\n"
|
|
Packit |
022b05 |
" return AgentXResponsePDU.PROCESSING_ERROR;\n"
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
" return AgentXResponsePDU.NO_ERROR;\n"
|
|
Packit |
022b05 |
" }\n"
|
|
Packit |
022b05 |
"\n");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fprintf(f,
|
|
Packit |
022b05 |
"}\n\n");
|
|
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 dumpJax(int modc, SmiModule **modv, int flags, char *output)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *smiNode;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (i = 0; i < modc; i++) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(smiNode = smiGetFirstNode(modv[i], SMI_NODEKIND_ROW);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ROW)) {
|
|
Packit |
022b05 |
if (isGroup(smiNode) && isAccessible(smiNode)) {
|
|
Packit |
022b05 |
dumpTable(smiNode);
|
|
Packit |
022b05 |
dumpEntry(smiNode);
|
|
Packit |
022b05 |
dumpEntryImpl(smiNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(smiNode = smiGetFirstNode(modv[i], SMI_NODEKIND_SCALAR);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_SCALAR)) {
|
|
Packit |
022b05 |
dumpScalarImpl(smiNode);
|
|
Packit |
022b05 |
smiNode = dumpScalars(smiNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(smiNode = smiGetFirstNode(modv[i], SMI_NODEKIND_NOTIFICATION);
|
|
Packit |
022b05 |
smiNode;
|
|
Packit |
022b05 |
smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
|
|
Packit |
022b05 |
dumpNotifications(smiNode);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void initJax()
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
static SmidumpDriverOption opt[] = {
|
|
Packit |
022b05 |
{ "package", OPT_STRING, &package, 0,
|
|
Packit |
022b05 |
"make classes part of a given package"},
|
|
Packit |
022b05 |
{ 0, OPT_END, 0, 0 }
|
|
Packit |
022b05 |
};
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static SmidumpDriver driver = {
|
|
Packit |
022b05 |
"jax",
|
|
Packit |
022b05 |
dumpJax,
|
|
Packit |
022b05 |
SMI_FLAG_NODESCR,
|
|
Packit |
022b05 |
SMIDUMP_DRIVER_CANT_UNITE | SMIDUMP_DRIVER_CANT_OUTPUT,
|
|
Packit |
022b05 |
"Java AgentX sub-agent classes in separate files",
|
|
Packit |
022b05 |
opt,
|
|
Packit |
022b05 |
NULL
|
|
Packit |
022b05 |
};
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smidumpRegisterDriver(&driver);
|
|
Packit |
022b05 |
}
|