|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* smi.c --
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Interface Implementation of libsmi.
|
|
Packit |
022b05 |
*
|
|
Packit |
022b05 |
* Copyright (c) 1999 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: smi.c 8071 2008-04-17 11:14:46Z 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 |
#include <sys/types.h>
|
|
Packit |
022b05 |
#ifdef HAVE_UNISTD_H
|
|
Packit |
022b05 |
#include <unistd.h>
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
#ifdef HAVE_PWD_H
|
|
Packit |
022b05 |
#include <pwd.h>
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#include "smi.h"
|
|
Packit |
022b05 |
#include "data.h"
|
|
Packit |
022b05 |
#include "error.h"
|
|
Packit |
022b05 |
#include "util.h"
|
|
Packit |
022b05 |
#include "snprintf.h"
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#ifdef BACKEND_SMI
|
|
Packit |
022b05 |
#include "scanner-smi.h"
|
|
Packit |
022b05 |
#include "parser-smi.h"
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#ifdef BACKEND_SMING
|
|
Packit |
022b05 |
#include "scanner-sming.h"
|
|
Packit |
022b05 |
#include "parser-sming.h"
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#ifdef HAVE_DMALLOC_H
|
|
Packit |
022b05 |
#include <dmalloc.h>
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
#ifndef MIN
|
|
Packit |
022b05 |
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
|
Packit |
022b05 |
#define MAX(a, b) ((a) < (b) ? (b) : (a))
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
const char *smi_library_version = SMI_LIBRARY_VERSION;
|
|
Packit |
022b05 |
const char *smi_version_string = SMI_VERSION_STRING;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
Handle *smiHandle = NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Internal functions.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static void getModulenameAndName(const char *arg1, const char *arg2,
|
|
Packit |
022b05 |
char **module, char **name)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *p;
|
|
Packit |
022b05 |
int l;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!arg1) && (!arg2)) {
|
|
Packit |
022b05 |
*module = NULL;
|
|
Packit |
022b05 |
*name = NULL;
|
|
Packit |
022b05 |
} else if (!arg2) {
|
|
Packit |
022b05 |
if (isupper((int)arg1[0])) {
|
|
Packit |
022b05 |
if ((p = strstr(arg1, "::"))) {
|
|
Packit |
022b05 |
/* SMIng style module/label separator */
|
|
Packit |
022b05 |
*name = smiStrdup(&p[2]);
|
|
Packit |
022b05 |
l = strcspn(arg1, "::");
|
|
Packit |
022b05 |
*module = smiStrndup(arg1, l);
|
|
Packit |
022b05 |
} else if ((p = strchr(arg1, '!'))) {
|
|
Packit |
022b05 |
/* old scotty style module/label separator */
|
|
Packit |
022b05 |
*name = smiStrdup(&p[1]);
|
|
Packit |
022b05 |
l = strcspn(arg1, "!");
|
|
Packit |
022b05 |
*module = smiStrndup(arg1, l);
|
|
Packit |
022b05 |
} else if ((p = strchr(arg1, '.'))) {
|
|
Packit |
022b05 |
/* SMIv1/v2 style module/label separator */
|
|
Packit |
022b05 |
*name = smiStrdup(&p[1]);
|
|
Packit |
022b05 |
l = strcspn(arg1, ".");
|
|
Packit |
022b05 |
*module = smiStrndup(arg1, l);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
*name = smiStrdup(arg1);
|
|
Packit |
022b05 |
*module = smiStrdup("");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
*name = smiStrdup(arg1);
|
|
Packit |
022b05 |
*module = smiStrdup("");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (!arg1) {
|
|
Packit |
022b05 |
if (isupper((int)arg2[0])) {
|
|
Packit |
022b05 |
if ((p = strstr(arg2, "::"))) {
|
|
Packit |
022b05 |
/* SMIng style module/label separator */
|
|
Packit |
022b05 |
*name = smiStrdup(&p[2]);
|
|
Packit |
022b05 |
l = strcspn(arg2, "::");
|
|
Packit |
022b05 |
*module = smiStrndup(arg2, l);
|
|
Packit |
022b05 |
} else if ((p = strchr(arg2, '!'))) {
|
|
Packit |
022b05 |
/* old scotty style module/label separator */
|
|
Packit |
022b05 |
*name = smiStrdup(&p[1]);
|
|
Packit |
022b05 |
l = strcspn(arg2, "!");
|
|
Packit |
022b05 |
*module = smiStrndup(arg2, l);
|
|
Packit |
022b05 |
} else if ((p = strchr(arg2, '.'))) {
|
|
Packit |
022b05 |
/* SMIv1/v2 style module/label separator */
|
|
Packit |
022b05 |
*name = smiStrdup(&p[1]);
|
|
Packit |
022b05 |
l = strcspn(arg2, ".");
|
|
Packit |
022b05 |
*module = smiStrndup(arg2, l);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
*name = smiStrdup(arg2);
|
|
Packit |
022b05 |
*module = smiStrdup("");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
*name = smiStrdup(arg2);
|
|
Packit |
022b05 |
*module = smiStrdup("");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
*module = smiStrdup(arg1);
|
|
Packit |
022b05 |
*name = smiStrdup(arg2);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static Node *getNode(unsigned int oidlen, SmiSubid oid[])
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Node *nodePtr, *parentPtr;
|
|
Packit |
022b05 |
unsigned int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(nodePtr = smiHandle->rootNodePtr, i=0; i < oidlen; i++) {
|
|
Packit |
022b05 |
parentPtr = nodePtr;
|
|
Packit |
022b05 |
nodePtr = findNodeByParentAndSubid(parentPtr, oid[i]);
|
|
Packit |
022b05 |
if (!nodePtr) {
|
|
Packit |
022b05 |
return parentPtr;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return nodePtr;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
static Object *getNextChildObject(Node *startNodePtr, Module *modulePtr,
|
|
Packit |
022b05 |
SmiNodekind nodekind)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Node *nodePtr;
|
|
Packit |
022b05 |
Object *objectPtr = NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!startNodePtr || !modulePtr)
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (nodePtr = startNodePtr; nodePtr; nodePtr = nodePtr->nextPtr) {
|
|
Packit |
022b05 |
for (objectPtr = nodePtr->firstObjectPtr; objectPtr;
|
|
Packit |
022b05 |
objectPtr = objectPtr->nextSameNodePtr) {
|
|
Packit |
022b05 |
if (((!modulePtr) || (objectPtr->modulePtr == modulePtr)) &&
|
|
Packit |
022b05 |
((nodekind == SMI_NODEKIND_ANY) ||
|
|
Packit |
022b05 |
(nodekind & objectPtr->export.nodekind))) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (objectPtr) break;
|
|
Packit |
022b05 |
objectPtr = getNextChildObject(nodePtr->firstChildPtr,
|
|
Packit |
022b05 |
modulePtr, nodekind);
|
|
Packit |
022b05 |
if (objectPtr) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return objectPtr;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Interface Functions.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiInit(const char *tag)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *p, *pp, *tag2;
|
|
Packit |
022b05 |
#ifdef HAVE_PWD_H
|
|
Packit |
022b05 |
struct passwd *pw;
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiHandle = findHandleByName(tag);
|
|
Packit |
022b05 |
if (smiHandle) {
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiHandle = addHandle(tag);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiDepth = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiHandle->errorLevel = DEFAULT_ERRORLEVEL;
|
|
Packit |
022b05 |
smiHandle->errorHandler = smiErrorHandler;
|
|
Packit |
022b05 |
#if !defined(_MSC_VER)
|
|
Packit |
022b05 |
smiHandle->cache = NULL;
|
|
Packit |
022b05 |
smiHandle->cacheProg = NULL;
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiInitData()) {
|
|
Packit |
022b05 |
return -1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Setup the SMI MIB module search path:
|
|
Packit |
022b05 |
* 1. set to builtin DEFAULT_SMIPATH
|
|
Packit |
022b05 |
* 2. read global config file if present (append/prepend/replace)
|
|
Packit |
022b05 |
* 3. read user config file if present (append/prepend/replace)
|
|
Packit |
022b05 |
* 4. evaluate SMIPATH env-var if set (append/prepend/replace)
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* 1. set to builtin DEFAULT_SMIPATH */
|
|
Packit |
022b05 |
smiHandle->path = smiStrdup(DEFAULT_SMIPATH);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
tag2 = smiStrdup(tag);
|
|
Packit |
022b05 |
if (tag2) tag2 = strtok(tag2, ":");
|
|
Packit |
022b05 |
if (tag2) {
|
|
Packit |
022b05 |
/* 2. read global config file if present (append/prepend/replace) */
|
|
Packit |
022b05 |
smiReadConfig(DEFAULT_GLOBALCONFIG, tag2);
|
|
Packit |
022b05 |
#ifdef HAVE_PWD_H
|
|
Packit |
022b05 |
pw = getpwuid(getuid());
|
|
Packit |
022b05 |
if (pw && pw->pw_dir) {
|
|
Packit |
022b05 |
/* 3. read user config file if present (append/prepend/replace) */
|
|
Packit |
022b05 |
smiAsprintf(&p, "%s%c%s",
|
|
Packit |
022b05 |
pw->pw_dir, DIR_SEPARATOR, DEFAULT_USERCONFIG);
|
|
Packit |
022b05 |
smiReadConfig(p, tag2);
|
|
Packit |
022b05 |
smiFree(p);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiFree(tag2);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/* 4. evaluate SMIPATH env-var if set (append/prepend/replace) */
|
|
Packit |
022b05 |
p = getenv("SMIPATH");
|
|
Packit |
022b05 |
if (p) {
|
|
Packit |
022b05 |
if (p[0] == PATH_SEPARATOR) {
|
|
Packit |
022b05 |
smiAsprintf(&pp, "%s%s", smiHandle->path, p);
|
|
Packit |
022b05 |
smiFree(smiHandle->path);
|
|
Packit |
022b05 |
smiHandle->path = pp;
|
|
Packit |
022b05 |
} else if (p[strlen(p)-1] == PATH_SEPARATOR) {
|
|
Packit |
022b05 |
smiAsprintf(&pp, "%s%s", p, smiHandle->path);
|
|
Packit |
022b05 |
smiFree(smiHandle->path);
|
|
Packit |
022b05 |
smiHandle->path = pp;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiHandle->path = smiStrdup(p);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiHandle->path) {
|
|
Packit |
022b05 |
return -1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void smiExit()
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiHandle)
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiFreeData();
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiFree(smiHandle->path);
|
|
Packit |
022b05 |
#if !defined(_MSC_VER)
|
|
Packit |
022b05 |
smiFree(smiHandle->cache);
|
|
Packit |
022b05 |
smiFree(smiHandle->cacheProg);
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
removeHandle(smiHandle);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiHandle = NULL;
|
|
Packit |
022b05 |
return;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
char *smiGetPath()
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (smiHandle->path) {
|
|
Packit |
022b05 |
return smiStrdup(smiHandle->path);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiSetPath(const char *s)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *s2;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiHandle) smiInit(NULL);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!s) {
|
|
Packit |
022b05 |
smiFree(smiHandle->path);
|
|
Packit |
022b05 |
smiHandle->path = NULL;
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
s2 = smiStrdup(s);
|
|
Packit |
022b05 |
if (s2) {
|
|
Packit |
022b05 |
smiFree(smiHandle->path);
|
|
Packit |
022b05 |
smiHandle->path = s2;
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
return -1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void smiSetSeverity(char *pattern, int severity)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
smiSetErrorSeverity(pattern, severity);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiReadConfig(const char *filename, const char *tag)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
FILE *file;
|
|
Packit |
022b05 |
char buf[201];
|
|
Packit |
022b05 |
char *cmd, *arg, *s;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
file = fopen(filename, "r");
|
|
Packit |
022b05 |
if (file) {
|
|
Packit |
022b05 |
while (!feof(file)) {
|
|
Packit |
022b05 |
if (!fgets(buf, 200, file)) continue;
|
|
Packit |
022b05 |
if ((!strlen(buf)) || (buf[0] == '#')) continue;
|
|
Packit |
022b05 |
cmd = strtok(buf, " \t\n\r");
|
|
Packit |
022b05 |
if (!cmd) continue;
|
|
Packit |
022b05 |
if (cmd[0] == '#') continue;
|
|
Packit |
022b05 |
if (cmd[strlen(cmd)-1] == ':') {
|
|
Packit |
022b05 |
if (!tag) continue;
|
|
Packit |
022b05 |
cmd[strlen(cmd)-1] = 0;
|
|
Packit |
022b05 |
if (strcmp(cmd, tag)) continue;
|
|
Packit |
022b05 |
cmd = strtok(NULL, " \t\n\r");
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
arg = strtok(NULL, " \t\n\r");
|
|
Packit |
022b05 |
if (!strcmp(cmd, "load")) {
|
|
Packit |
022b05 |
smiLoadModule(arg);
|
|
Packit |
022b05 |
} else if (!strcmp(cmd, "path")) {
|
|
Packit |
022b05 |
if (arg) {
|
|
Packit |
022b05 |
if (arg[0] == PATH_SEPARATOR) {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s%s", smiHandle->path, arg);
|
|
Packit |
022b05 |
smiFree(smiHandle->path);
|
|
Packit |
022b05 |
smiHandle->path = s;
|
|
Packit |
022b05 |
} else if (arg[strlen(arg)-1] == PATH_SEPARATOR) {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s%s", arg, smiHandle->path);
|
|
Packit |
022b05 |
smiFree(smiHandle->path);
|
|
Packit |
022b05 |
smiHandle->path = s;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiHandle->path = smiStrdup(arg);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (!strcmp(cmd, "cache")) {
|
|
Packit |
022b05 |
#if !defined(_MSC_VER)
|
|
Packit |
022b05 |
smiFree(smiHandle->cache);
|
|
Packit |
022b05 |
smiFree(smiHandle->cacheProg);
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
if (arg && strcmp(arg, "off")) {
|
|
Packit |
022b05 |
#if !defined(_MSC_VER)
|
|
Packit |
022b05 |
smiHandle->cache = smiStrdup(arg);
|
|
Packit |
022b05 |
arg = strtok(NULL, "\n\r");
|
|
Packit |
022b05 |
smiHandle->cacheProg = smiStrdup(arg);
|
|
Packit |
022b05 |
#else
|
|
Packit |
022b05 |
smiPrintError(NULL, ERR_CACHE_CONFIG_NOT_SUPPORTED,
|
|
Packit |
022b05 |
filename);
|
|
Packit |
022b05 |
#endif
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (!strcmp(cmd, "level")) {
|
|
Packit |
022b05 |
smiSetErrorLevel(atoi(arg));
|
|
Packit |
022b05 |
} else if (!strcmp(cmd, "hide")) {
|
|
Packit |
022b05 |
smiSetSeverity(arg, 9);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiPrintError(NULL, ERR_UNKNOWN_CONFIG_CMD, cmd, filename);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fclose(file);
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return -1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiIsLoaded(const char *module)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!module)
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return isInView(module);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
char *smiLoadModule(const char *module)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Module *modulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiHandle) smiInit(NULL);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (smiIsPath(module)) {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
modulePtr = loadModule(module, NULL);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (modulePtr) {
|
|
Packit |
022b05 |
if (!isInView(modulePtr->export.name)) {
|
|
Packit |
022b05 |
addView(modulePtr->export.name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return modulePtr->export.name;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((modulePtr = findModuleByName(module))) {
|
|
Packit |
022b05 |
/* already loaded. */
|
|
Packit |
022b05 |
if (!isInView(module)) {
|
|
Packit |
022b05 |
addView(module);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return modulePtr->export.name;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
if ((modulePtr = loadModule(module, NULL))) {
|
|
Packit |
022b05 |
if (!isInView(module)) {
|
|
Packit |
022b05 |
addView(module);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return modulePtr->export.name;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void smiSetErrorLevel(int level)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiHandle) smiInit(NULL);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiHandle->errorLevel = level;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
void smiSetFlags(int userflags)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiHandle) smiInit(NULL);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiHandle->flags = (smiHandle->flags & ~SMI_FLAG_MASK) | userflags;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiGetFlags()
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiHandle) smiInit(NULL);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return smiHandle->flags & SMI_FLAG_MASK;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiModule *smiGetModule(const char *module)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Module *modulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!module) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
modulePtr = findModuleByName(module);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!modulePtr) {
|
|
Packit |
022b05 |
modulePtr = loadModule(module, NULL);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &modulePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiModule *smiGetFirstModule()
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Module *modulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (modulePtr = smiHandle->firstModulePtr;
|
|
Packit |
022b05 |
modulePtr && modulePtr->export.name &&
|
|
Packit |
022b05 |
(strlen(modulePtr->export.name) == 0);
|
|
Packit |
022b05 |
modulePtr = modulePtr->nextPtr);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &modulePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiModule *smiGetNextModule(SmiModule *smiModulePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Module *modulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiModulePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (modulePtr = ((Module *)smiModulePtr)->nextPtr;
|
|
Packit |
022b05 |
modulePtr && modulePtr->export.name &&
|
|
Packit |
022b05 |
(strlen(modulePtr->export.name) == 0);
|
|
Packit |
022b05 |
modulePtr = modulePtr->nextPtr);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &modulePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiImport *smiGetFirstImport(SmiModule *smiModulePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiModulePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((Module *)smiModulePtr)->firstImportPtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiImport *smiGetNextImport(SmiImport *smiImportPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiImportPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((Import *)smiImportPtr)->nextPtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiIsImported(SmiModule *smiModulePtr,
|
|
Packit |
022b05 |
SmiModule *importedModulePtr,
|
|
Packit |
022b05 |
char *importedName)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Import *importPtr;
|
|
Packit |
022b05 |
Module *modulePtr;
|
|
Packit |
022b05 |
char *importedModule;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!smiModulePtr) || (!importedName)) {
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
modulePtr = (Module *)smiModulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (importedModulePtr) {
|
|
Packit |
022b05 |
importedModule = importedModulePtr->name;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
importedModule = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (importPtr = modulePtr->firstImportPtr; importPtr;
|
|
Packit |
022b05 |
importPtr = importPtr->nextPtr) {
|
|
Packit |
022b05 |
if ((!strcmp(importedName, importPtr->export.name)) &&
|
|
Packit |
022b05 |
((!importedModule) ||
|
|
Packit |
022b05 |
(!strcmp(importedModule, importPtr->export.module)))) {
|
|
Packit |
022b05 |
return 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiRevision *smiGetFirstRevision(SmiModule *smiModulePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiModulePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((Module *)smiModulePtr)->firstRevisionPtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiRevision *smiGetNextRevision(SmiRevision *smiRevisionPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiRevisionPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((Revision *)smiRevisionPtr)->nextPtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiGetRevisionLine(SmiRevision *smiRevisionPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return ((Revision *)smiRevisionPtr)->line;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiType *smiGetType(SmiModule *smiModulePtr, char *type)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *typePtr = NULL;
|
|
Packit |
022b05 |
Module *modulePtr = NULL;
|
|
Packit |
022b05 |
char *module2, *type2;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!type) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
modulePtr = (Module *)smiModulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
getModulenameAndName(smiModulePtr ? smiModulePtr->name : NULL, type,
|
|
Packit |
022b05 |
&module2, &type2);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!modulePtr && module2 && strlen(module2)) {
|
|
Packit |
022b05 |
if (!(modulePtr = findModuleByName(module2))) {
|
|
Packit |
022b05 |
modulePtr = loadModule(module2, NULL);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (modulePtr) {
|
|
Packit |
022b05 |
typePtr = findTypeByModuleAndName(modulePtr, type2);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
typePtr = findTypeByName(type2);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiFree(module2);
|
|
Packit |
022b05 |
smiFree(type2);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!typePtr ||
|
|
Packit |
022b05 |
typePtr->export.basetype == SMI_BASETYPE_UNKNOWN) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &typePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiType *smiGetFirstType(SmiModule *smiModulePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiModulePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (typePtr = ((Module *)smiModulePtr)->firstTypePtr; typePtr;
|
|
Packit |
022b05 |
typePtr = typePtr->nextPtr) {
|
|
Packit |
022b05 |
/* loop until we found a `real' type */
|
|
Packit |
022b05 |
if (typePtr->export.name &&
|
|
Packit |
022b05 |
typePtr->export.basetype != SMI_BASETYPE_UNKNOWN) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &typePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiType *smiGetNextType(SmiType *smiTypePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiTypePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (typePtr = ((Type *)smiTypePtr)->nextPtr; typePtr;
|
|
Packit |
022b05 |
typePtr = typePtr->nextPtr) {
|
|
Packit |
022b05 |
/* loop until we found a `real' type */
|
|
Packit |
022b05 |
if (typePtr->export.name &&
|
|
Packit |
022b05 |
typePtr->export.basetype != SMI_BASETYPE_UNKNOWN) {
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &typePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiType *smiGetParentType(SmiType *smiTypePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiTypePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typePtr = ((Type *)smiTypePtr)->parentPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!typePtr ||
|
|
Packit |
022b05 |
typePtr->export.basetype == SMI_BASETYPE_UNKNOWN) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &typePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiModule *smiGetTypeModule(SmiType *smiTypePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return &((Type *)smiTypePtr)->modulePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiGetTypeLine(SmiType *smiTypePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return ((Type *)smiTypePtr)->line;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNamedNumber *smiGetFirstNamedNumber(SmiType *smiTypePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typePtr = (Type *)smiTypePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!typePtr) || (!typePtr->listPtr) ||
|
|
Packit |
022b05 |
((typePtr->export.basetype != SMI_BASETYPE_ENUM) &&
|
|
Packit |
022b05 |
(typePtr->export.basetype != SMI_BASETYPE_BITS) &&
|
|
Packit |
022b05 |
(typePtr->export.basetype != SMI_BASETYPE_POINTER))) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((NamedNumber *)typePtr->listPtr->ptr)->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNamedNumber *smiGetNextNamedNumber(SmiNamedNumber *smiNamedNumberPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *typePtr;
|
|
Packit |
022b05 |
List *listPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiNamedNumberPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typePtr = ((NamedNumber *)smiNamedNumberPtr)->typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!typePtr) || (!typePtr->listPtr) ||
|
|
Packit |
022b05 |
((typePtr->export.basetype != SMI_BASETYPE_ENUM) &&
|
|
Packit |
022b05 |
(typePtr->export.basetype != SMI_BASETYPE_BITS))) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (listPtr = typePtr->listPtr; listPtr; listPtr = listPtr->nextPtr) {
|
|
Packit |
022b05 |
if (((NamedNumber *)(listPtr->ptr))->export.name ==
|
|
Packit |
022b05 |
smiNamedNumberPtr->name)
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!listPtr) || (!listPtr->nextPtr)) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((NamedNumber *)listPtr->nextPtr->ptr)->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNamedNumber *smiGetAttributeFirstNamedNumber(SmiAttribute *smiAttributePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Attribute *attributePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
attributePtr = (Attribute *)smiAttributePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!attributePtr) || (!attributePtr->listPtr) ||
|
|
Packit |
022b05 |
((attributePtr->export.basetype != SMI_BASETYPE_ENUM) &&
|
|
Packit |
022b05 |
(attributePtr->export.basetype != SMI_BASETYPE_BITS) &&
|
|
Packit |
022b05 |
(attributePtr->export.basetype != SMI_BASETYPE_POINTER))) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((NamedNumber *)attributePtr->listPtr->ptr)->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNamedNumber *smiGetAttributeNextNamedNumber(SmiNamedNumber *smiNamedNumberPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Attribute *attributePtr;
|
|
Packit |
022b05 |
List *listPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiNamedNumberPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
attributePtr = (Attribute*)(((NamedNumber *)smiNamedNumberPtr)->typePtr);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!attributePtr) || (!attributePtr->listPtr) ||
|
|
Packit |
022b05 |
((attributePtr->export.basetype != SMI_BASETYPE_ENUM) &&
|
|
Packit |
022b05 |
(attributePtr->export.basetype != SMI_BASETYPE_BITS))) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (listPtr = attributePtr->listPtr; listPtr; listPtr = listPtr->nextPtr) {
|
|
Packit |
022b05 |
if (((NamedNumber *)(listPtr->ptr))->export.name ==
|
|
Packit |
022b05 |
smiNamedNumberPtr->name)
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!listPtr) || (!listPtr->nextPtr)) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((NamedNumber *)listPtr->nextPtr->ptr)->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiRange *smiGetFirstRange(SmiType *smiTypePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typePtr = (Type *)smiTypePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!typePtr) || (!typePtr->listPtr) ||
|
|
Packit |
022b05 |
(typePtr->export.basetype == SMI_BASETYPE_ENUM) ||
|
|
Packit |
022b05 |
(typePtr->export.basetype == SMI_BASETYPE_BITS)) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((Range *)typePtr->listPtr->ptr)->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiRange *smiGetNextRange(SmiRange *smiRangePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *typePtr;
|
|
Packit |
022b05 |
List *listPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiRangePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typePtr = ((Range *)smiRangePtr)->typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!typePtr) || (!typePtr->listPtr) ||
|
|
Packit |
022b05 |
(typePtr->export.basetype == SMI_BASETYPE_ENUM) ||
|
|
Packit |
022b05 |
(typePtr->export.basetype == SMI_BASETYPE_BITS)) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (listPtr = typePtr->listPtr; listPtr; listPtr = listPtr->nextPtr) {
|
|
Packit |
022b05 |
if (!memcmp(&((Range *)listPtr->ptr)->export.minValue,
|
|
Packit |
022b05 |
&smiRangePtr->minValue, sizeof(struct SmiValue)))
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!listPtr) || (!listPtr->nextPtr)) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((Range *)listPtr->nextPtr->ptr)->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiRange *smiGetAttributeFirstRange(SmiAttribute *smiAttributePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Attribute *attributePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
attributePtr = (Attribute *)smiAttributePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!attributePtr) || (!attributePtr->listPtr) ||
|
|
Packit |
022b05 |
(attributePtr->export.basetype == SMI_BASETYPE_ENUM) ||
|
|
Packit |
022b05 |
(attributePtr->export.basetype == SMI_BASETYPE_BITS)) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((Range *)attributePtr->listPtr->ptr)->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiRange *smiGetAttributeNextRange(SmiRange *smiRangePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Attribute *attributePtr;
|
|
Packit |
022b05 |
List *listPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiRangePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
attributePtr = (Attribute*)((Range *)smiRangePtr)->typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!attributePtr) || (!attributePtr->listPtr) ||
|
|
Packit |
022b05 |
(attributePtr->export.basetype == SMI_BASETYPE_ENUM) ||
|
|
Packit |
022b05 |
(attributePtr->export.basetype == SMI_BASETYPE_BITS)) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (listPtr = attributePtr->listPtr; listPtr; listPtr = listPtr->nextPtr) {
|
|
Packit |
022b05 |
if (!memcmp(&((Range *)listPtr->ptr)->export.minValue,
|
|
Packit |
022b05 |
&smiRangePtr->minValue, sizeof(struct SmiValue)))
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!listPtr) || (!listPtr->nextPtr)) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((Range *)listPtr->nextPtr->ptr)->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiIdentity *smiGetFirstIdentity(SmiModule *smiModulePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiModulePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return ((Module *)smiModulePtr)->firstIdentityPtr ?
|
|
Packit |
022b05 |
&((Module *)smiModulePtr)->firstIdentityPtr->export : NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiIdentity *smiGetNextIdentity(SmiIdentity *smiIdentityPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiIdentityPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return ((Identity *)smiIdentityPtr)->nextPtr ?
|
|
Packit |
022b05 |
&((Identity *)smiIdentityPtr)->nextPtr->export : NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiModule *smiGetIdentityModule(SmiIdentity *smiIdentityPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return &((Identity *)smiIdentityPtr)->modulePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiIdentity *smiGetParentIdentity(SmiIdentity *smiIdentityPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return (SmiIdentity*)(((Identity *)smiIdentityPtr)->parentPtr);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiIdentity *smiGetIdentity(SmiModule *smiModulePtr, char *identity)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiModulePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiIdentity *ide;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(ide = smiGetFirstIdentity(smiModulePtr);
|
|
Packit |
022b05 |
ide;
|
|
Packit |
022b05 |
ide = smiGetNextIdentity(ide))
|
|
Packit |
022b05 |
if(!strncmp(ide->name,identity,64))return ide;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiGetIdentityLine(SmiIdentity *smiIdentityPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return ((Identity *)smiIdentityPtr)->line;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiClass *smiGetFirstClass(SmiModule *smiModulePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiModulePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return ((Module *)smiModulePtr)->firstClassPtr ?
|
|
Packit |
022b05 |
&((Module *)smiModulePtr)->firstClassPtr->export : NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiClass *smiGetNextClass(SmiClass *smiClassPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiClassPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return ((Class *)smiClassPtr)->nextPtr ?
|
|
Packit |
022b05 |
&((Class *)smiClassPtr)->nextPtr->export : NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiModule *smiGetClassModule(SmiClass *smiClassPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return &((Class *)smiClassPtr)->modulePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiClass *smiGetParentClass(SmiClass *smiClassPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return (SmiClass*)(((Class *)smiClassPtr)->parentPtr);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiClass *smiGetClass(SmiModule *smiModulePtr, char *class)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiModulePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
else
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiClass *cl;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for(cl = smiGetFirstClass(smiModulePtr);
|
|
Packit |
022b05 |
cl;
|
|
Packit |
022b05 |
cl = smiGetNextClass(cl))
|
|
Packit |
022b05 |
if(!strncmp(cl->name,class,64))return cl;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiGetClassLine(SmiClass *smiClassPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return ((Class *)smiClassPtr)->line;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiAttribute *smiGetFirstAttribute(SmiClass *smiClassPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Attribute *attributePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiClassPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
attributePtr = ((Class *)smiClassPtr)->firstAttributePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &attributePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiAttribute *smiGetNextAttribute( SmiAttribute *smiTypePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Attribute *attributePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiTypePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
attributePtr = ((Attribute *)smiTypePtr)->nextPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &attributePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiAttribute *smiGetAttribute(SmiClass *smiClassPtr, char *attribute)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Attribute *attributePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! smiClassPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
attributePtr = ((Class *)smiClassPtr)->firstAttributePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (attributePtr = ((Class *)smiClassPtr)->firstAttributePtr;
|
|
Packit |
022b05 |
attributePtr; attributePtr = attributePtr->nextPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!strncmp(attributePtr->export.name, attribute,64)) {
|
|
Packit |
022b05 |
return &attributePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* attribute might belong to the parent so check parent if
|
|
Packit |
022b05 |
* attribute not found
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiClassPtr = smiGetParentClass(smiClassPtr);
|
|
Packit |
022b05 |
attributePtr = (Attribute*)smiGetAttribute(smiClassPtr , attribute);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &attributePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiType *smiGetAttributeParentType(SmiAttribute *smiAttributePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *parentTypePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! smiAttributePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
parentTypePtr = ((Attribute*)smiAttributePtr)->parentTypePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return (parentTypePtr) ? &parentTypePtr->export : NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiClass *smiGetAttributeParentClass( SmiAttribute *smiAttributePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Class *parentClassPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! smiAttributePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
parentClassPtr = ((Attribute*)smiAttributePtr)->parentClassPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return parentClassPtr ? &parentClassPtr->export : NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiAttribute *smiGetFirstUniqueAttribute(SmiClass *smiClassPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Class *classPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! smiClassPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
classPtr = (Class*)smiClassPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! classPtr->uniqueList) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (classPtr->uniqueList->ptr == classPtr) {
|
|
Packit |
022b05 |
return NULL; /* scalar class */
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return (SmiAttribute*)(classPtr->uniqueList->ptr);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiAttribute *smiGetNextUniqueAttribute( SmiAttribute *smiTypePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Class *classPtr;
|
|
Packit |
022b05 |
List *listPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! smiTypePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
classPtr = ((Attribute*)smiTypePtr)->classPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (classPtr && classPtr->uniqueList) {
|
|
Packit |
022b05 |
for (listPtr=classPtr->uniqueList;listPtr; listPtr=listPtr->nextPtr) {
|
|
Packit |
022b05 |
if (&((Attribute*)(listPtr->ptr))->export == smiTypePtr) {
|
|
Packit |
022b05 |
if (listPtr->nextPtr) {
|
|
Packit |
022b05 |
return &((Attribute*)(listPtr->nextPtr->ptr))->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiGetAttributeLine(SmiAttribute *smiAttributePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return ((Attribute *)smiAttributePtr)->line;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiIsClassScalar(SmiClass *smiClassPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Class *classPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! smiClassPtr) {
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
classPtr = (Class*)smiClassPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! classPtr->uniqueList) {
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return (classPtr->uniqueList->ptr == classPtr);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiEvent *smiGetFirstEvent(SmiClass *smiClassPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Event *eventPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! smiClassPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
eventPtr = ((Class *)smiClassPtr)->firstEventPtr;
|
|
Packit |
022b05 |
return &(eventPtr->export);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiEvent *smiGetNextEvent(SmiEvent *smiEventPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Event *eventPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! smiEventPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
eventPtr = ((Event *)smiEventPtr)->nextPtr;
|
|
Packit |
022b05 |
return &eventPtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiGetEventLine(SmiEvent *smiEventPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return ((Event *)smiEventPtr)->line;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiMacro *smiGetMacro(SmiModule *smiModulePtr, char *macro)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Macro *macroPtr = NULL;
|
|
Packit |
022b05 |
Module *modulePtr = NULL;
|
|
Packit |
022b05 |
char *module2, *macro2;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!macro) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
modulePtr = (Module *)smiModulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
getModulenameAndName(smiModulePtr ? smiModulePtr->name : NULL, macro,
|
|
Packit |
022b05 |
&module2, ¯o2);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!modulePtr && module2 && strlen(module2)) {
|
|
Packit |
022b05 |
if (!(modulePtr = findModuleByName(module2))) {
|
|
Packit |
022b05 |
modulePtr = loadModule(module2, NULL);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (modulePtr) {
|
|
Packit |
022b05 |
macroPtr = findMacroByModuleAndName(modulePtr, macro2);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
macroPtr = findMacroByName(macro2);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiFree(module2);
|
|
Packit |
022b05 |
smiFree(macro2);
|
|
Packit |
022b05 |
return macroPtr ? ¯oPtr->export : NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiMacro *smiGetFirstMacro(SmiModule *smiModulePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiModulePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return ((Module *)smiModulePtr)->firstMacroPtr ?
|
|
Packit |
022b05 |
&((Module *)smiModulePtr)->firstMacroPtr->export : NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiMacro *smiGetNextMacro(SmiMacro *smiMacroPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiMacroPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return ((Macro *)smiMacroPtr)->nextPtr ?
|
|
Packit |
022b05 |
&((Macro *)smiMacroPtr)->nextPtr->export : NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiModule *smiGetMacroModule(SmiMacro *smiMacroPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return &((Macro *)smiMacroPtr)->modulePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiGetMacroLine(SmiMacro *smiMacroPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return ((Macro *)smiMacroPtr)->line;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNode *smiGetNode(SmiModule *smiModulePtr, const char *node)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Object *objectPtr = NULL;
|
|
Packit |
022b05 |
Module *modulePtr = NULL;
|
|
Packit |
022b05 |
Node *nodePtr;
|
|
Packit |
022b05 |
char *module2, *node2, *p;
|
|
Packit |
022b05 |
unsigned int oidlen;
|
|
Packit |
022b05 |
SmiSubid oid[128];
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!node) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
modulePtr = (Module *)smiModulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
getModulenameAndName(smiModulePtr ? smiModulePtr->name : NULL, node,
|
|
Packit |
022b05 |
&module2, &node2);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!modulePtr && module2 && strlen(module2)) {
|
|
Packit |
022b05 |
if (!(modulePtr = findModuleByName(module2))) {
|
|
Packit |
022b05 |
modulePtr = loadModule(module2, NULL);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (isdigit((int)node2[0])) {
|
|
Packit Service |
419abb |
for (oidlen = 0, p = strtok(node2, ". "); p;
|
|
Packit |
022b05 |
oidlen++, p = strtok(NULL, ". ")) {
|
|
Packit |
022b05 |
oid[oidlen] = strtoul(p, NULL, 0);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
nodePtr = getNode(oidlen, oid);
|
|
Packit |
022b05 |
if (nodePtr) {
|
|
Packit |
022b05 |
if (modulePtr) {
|
|
Packit |
022b05 |
objectPtr = findObjectByModuleAndNode(modulePtr, nodePtr);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
objectPtr = findObjectByNode(nodePtr);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
p = strtok(node2, ". ");
|
|
Packit |
022b05 |
if (modulePtr) {
|
|
Packit |
022b05 |
objectPtr = findObjectByModuleAndName(modulePtr, p);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
objectPtr = findObjectByName(p);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
smiFree(module2);
|
|
Packit |
022b05 |
smiFree(node2);
|
|
Packit |
022b05 |
return objectPtr ? &objectPtr->export : NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNode *smiGetNodeByOID(unsigned int oidlen, SmiSubid oid[])
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Node *nodePtr;
|
|
Packit |
022b05 |
Object *objectPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!oidlen) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
nodePtr = getNode(oidlen, oid);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!nodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
objectPtr = findObjectByNode(nodePtr);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return objectPtr ? &objectPtr->export : NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNode *smiGetFirstNode(SmiModule *smiModulePtr, SmiNodekind nodekind)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Module *modulePtr;
|
|
Packit |
022b05 |
Node *nodePtr = NULL;
|
|
Packit |
022b05 |
Object *objectPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiModulePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
modulePtr = (Module *)smiModulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (modulePtr && modulePtr->prefixNodePtr) {
|
|
Packit |
022b05 |
/* start at the common oid prefix of this module */
|
|
Packit |
022b05 |
nodePtr = modulePtr->prefixNodePtr;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
nodePtr = smiHandle->rootNodePtr->firstChildPtr;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
do {
|
|
Packit |
022b05 |
objectPtr = getNextChildObject(nodePtr, modulePtr, nodekind);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (objectPtr)
|
|
Packit |
022b05 |
return &objectPtr->export;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (nodePtr->firstChildPtr) {
|
|
Packit |
022b05 |
nodePtr = nodePtr->firstChildPtr;
|
|
Packit |
022b05 |
} else if (nodePtr->nextPtr) {
|
|
Packit |
022b05 |
nodePtr = nodePtr->nextPtr;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
for (nodePtr = nodePtr->parentPtr;
|
|
Packit |
022b05 |
nodePtr && (nodePtr->parentPtr) && (!nodePtr->nextPtr);
|
|
Packit |
022b05 |
nodePtr = nodePtr->parentPtr);
|
|
Packit |
022b05 |
if (nodePtr) nodePtr = nodePtr->nextPtr;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} while (nodePtr);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNode *smiGetNextNode(SmiNode *smiNodePtr, SmiNodekind nodekind)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Module *modulePtr;
|
|
Packit |
022b05 |
Object *objectPtr;
|
|
Packit |
022b05 |
Node *nodePtr;
|
|
Packit |
022b05 |
int i;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiNodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
objectPtr = (Object *)smiNodePtr;
|
|
Packit |
022b05 |
nodePtr = objectPtr->nodePtr;
|
|
Packit |
022b05 |
modulePtr = objectPtr->modulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!modulePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!nodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
do {
|
|
Packit |
022b05 |
if (nodePtr->firstChildPtr) {
|
|
Packit |
022b05 |
nodePtr = nodePtr->firstChildPtr;
|
|
Packit |
022b05 |
} else if (nodePtr->nextPtr) {
|
|
Packit |
022b05 |
nodePtr = nodePtr->nextPtr;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
for (nodePtr = nodePtr->parentPtr;
|
|
Packit |
022b05 |
(nodePtr->parentPtr) && (!nodePtr->nextPtr);
|
|
Packit |
022b05 |
nodePtr = nodePtr->parentPtr);
|
|
Packit |
022b05 |
nodePtr = nodePtr->nextPtr;
|
|
Packit |
022b05 |
/* did we move outside the common oid prefix of this module? */
|
|
Packit |
022b05 |
for (i = 0; i < modulePtr->prefixNodePtr->oidlen; i++)
|
|
Packit |
022b05 |
if ((!nodePtr) || (!nodePtr->oid) ||
|
|
Packit |
022b05 |
(nodePtr->oid[i] != modulePtr->prefixNodePtr->oid[i]))
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
objectPtr = getNextChildObject(nodePtr, modulePtr, nodekind);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (objectPtr)
|
|
Packit |
022b05 |
return &objectPtr->export;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
} while (nodePtr);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNode *smiGetParentNode(SmiNode *smiNodePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Module *modulePtr;
|
|
Packit |
022b05 |
Object *objectPtr;
|
|
Packit |
022b05 |
Import *importPtr;
|
|
Packit |
022b05 |
Node *nodePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiNodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
objectPtr = (Object *)smiNodePtr;
|
|
Packit |
022b05 |
nodePtr = objectPtr->nodePtr;
|
|
Packit |
022b05 |
modulePtr = objectPtr->modulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!nodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (nodePtr == smiHandle->rootNodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
nodePtr = nodePtr->parentPtr;
|
|
Packit |
022b05 |
if (! nodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* First, try to find a definition in the same module.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
objectPtr = NULL;
|
|
Packit |
022b05 |
if (modulePtr) {
|
|
Packit |
022b05 |
objectPtr = findObjectByModuleAndNode(modulePtr, nodePtr);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* If found, check if it's imported. In case, get the original definition.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
if (objectPtr) {
|
|
Packit |
022b05 |
importPtr = findImportByName(objectPtr->export.name,
|
|
Packit |
022b05 |
objectPtr->modulePtr);
|
|
Packit |
022b05 |
if (importPtr) {
|
|
Packit |
022b05 |
objectPtr = findObjectByModulenameAndNode(importPtr->export.module,
|
|
Packit |
022b05 |
nodePtr);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
objectPtr = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* If not yet found, try to find any definition.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
if (!objectPtr) {
|
|
Packit |
022b05 |
objectPtr = findObjectByNode(nodePtr);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!objectPtr) && (nodePtr->parentPtr)) {
|
|
Packit |
022b05 |
/* an implicitly created node, e.g. gaga.0 in an object
|
|
Packit |
022b05 |
* definition with oid == gaga.0.1.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
objectPtr = addObject(SMI_UNKNOWN_LABEL,
|
|
Packit |
022b05 |
nodePtr->parentPtr, nodePtr->subid,
|
|
Packit |
022b05 |
0, NULL);
|
|
Packit |
022b05 |
objectPtr->nodePtr = nodePtr;
|
|
Packit |
022b05 |
objectPtr->modulePtr = modulePtr;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return objectPtr ? &objectPtr->export : NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNode *smiGetRelatedNode(SmiNode *smiNodePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiNodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((Object *)smiNodePtr)->relatedPtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNode *smiGetFirstChildNode(SmiNode *smiNodePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Module *modulePtr;
|
|
Packit |
022b05 |
Object *objectPtr;
|
|
Packit |
022b05 |
Node *nodePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiNodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
objectPtr = (Object *)smiNodePtr;
|
|
Packit |
022b05 |
nodePtr = objectPtr->nodePtr;
|
|
Packit |
022b05 |
modulePtr = objectPtr->modulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!nodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
nodePtr = nodePtr->firstChildPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!nodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
objectPtr = findObjectByModuleAndNode(modulePtr, nodePtr);
|
|
Packit |
022b05 |
if (!objectPtr) objectPtr = findObjectByNode(nodePtr);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return objectPtr ? &objectPtr->export : NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNode *smiGetNextChildNode(SmiNode *smiNodePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Module *modulePtr;
|
|
Packit |
022b05 |
Object *objectPtr;
|
|
Packit |
022b05 |
Node *nodePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiNodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
objectPtr = (Object *)smiNodePtr;
|
|
Packit |
022b05 |
nodePtr = objectPtr->nodePtr;
|
|
Packit |
022b05 |
modulePtr = objectPtr->modulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!nodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
nodePtr = nodePtr->nextPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!nodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
objectPtr = findObjectByModuleAndNode(modulePtr, nodePtr);
|
|
Packit |
022b05 |
if (!objectPtr) objectPtr = findObjectByNode(nodePtr);
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return objectPtr ? &objectPtr->export : NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNode *smiGetModuleIdentityNode(SmiModule *smiModulePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if (!smiModulePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((Module *)smiModulePtr)->objectPtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiModule *smiGetNodeModule(SmiNode *smiNodePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return &((Object *)smiNodePtr)->modulePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiType *smiGetNodeType(SmiNode *smiNodePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typePtr = ((Object *)smiNodePtr)->typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!typePtr ||
|
|
Packit |
022b05 |
typePtr->export.basetype == SMI_BASETYPE_UNKNOWN) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &typePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiGetNodeLine(SmiNode *smiNodePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return ((Object *)smiNodePtr)->line;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiElement *smiGetFirstElement(SmiNode *smiNodePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
List *listPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiNodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
listPtr = ((Object *)smiNodePtr)->listPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return (SmiElement *)listPtr;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiElement *smiGetNextElement(SmiElement *smiElementPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
List *listPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiElementPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
listPtr = ((List *)smiElementPtr)->nextPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return (SmiElement *)listPtr;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNode *smiGetElementNode(SmiElement *smiElementPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
if ((Object *)((List *)smiElementPtr)->ptr)
|
|
Packit |
022b05 |
return &((Object *)((List *)smiElementPtr)->ptr)->export;
|
|
Packit |
022b05 |
else
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiOption *smiGetFirstOption(SmiNode *smiComplianceNodePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Object *objectPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiComplianceNodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
objectPtr = (Object *)smiComplianceNodePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!objectPtr->optionlistPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (objectPtr->export.nodekind != SMI_NODEKIND_COMPLIANCE) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((Option *)objectPtr->optionlistPtr->ptr)->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiOption *smiGetNextOption(SmiOption *smiOptionPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
List *listPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiOptionPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (listPtr =
|
|
Packit |
022b05 |
((Option *)smiOptionPtr)->compliancePtr->optionlistPtr;
|
|
Packit |
022b05 |
listPtr;
|
|
Packit |
022b05 |
listPtr = listPtr->nextPtr) {
|
|
Packit |
022b05 |
if ((Option *)(listPtr->ptr) == (Option *)smiOptionPtr) {
|
|
Packit |
022b05 |
if (listPtr->nextPtr) {
|
|
Packit |
022b05 |
return &((Option *)listPtr->nextPtr->ptr)->export;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNode *smiGetOptionNode(SmiOption *smiOptionPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return &((Option *)smiOptionPtr)->objectPtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiGetOptionLine(SmiOption *smiOptionPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return ((Option *)smiOptionPtr)->line;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiRefinement *smiGetFirstRefinement(SmiNode *smiComplianceNodePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Object *objectPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiComplianceNodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
objectPtr = (Object *)smiComplianceNodePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!objectPtr->refinementlistPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (objectPtr->export.nodekind != SMI_NODEKIND_COMPLIANCE) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &((Refinement *)objectPtr->refinementlistPtr->ptr)->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiRefinement *smiGetNextRefinement(SmiRefinement *smiRefinementPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
List *listPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiRefinementPtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (listPtr =
|
|
Packit |
022b05 |
((Refinement *)smiRefinementPtr)->compliancePtr->refinementlistPtr;
|
|
Packit |
022b05 |
listPtr;
|
|
Packit |
022b05 |
listPtr = listPtr->nextPtr) {
|
|
Packit |
022b05 |
if ((Refinement *)(listPtr->ptr) == (Refinement *)smiRefinementPtr) {
|
|
Packit |
022b05 |
if (listPtr->nextPtr) {
|
|
Packit |
022b05 |
return &((Refinement *)listPtr->nextPtr->ptr)->export;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiNode *smiGetRefinementNode(SmiRefinement *smiRefinementPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return &((Refinement *)smiRefinementPtr)->objectPtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiType *smiGetRefinementType(SmiRefinement *smiRefinementPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typePtr = ((Refinement *)smiRefinementPtr)->typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!typePtr ||
|
|
Packit |
022b05 |
typePtr->export.basetype == SMI_BASETYPE_UNKNOWN) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &typePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiType *smiGetRefinementWriteType(SmiRefinement *smiRefinementPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
Type *typePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
typePtr = ((Refinement *)smiRefinementPtr)->writetypePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!typePtr ||
|
|
Packit |
022b05 |
typePtr->export.basetype == SMI_BASETYPE_UNKNOWN) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return &typePtr->export;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiGetRefinementLine(SmiRefinement *smiRefinementPtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
return ((Refinement *)smiRefinementPtr)->line;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
SmiElement *smiGetFirstUniquenessElement(SmiNode *smiNodePtr)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
List *listPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiNodePtr) {
|
|
Packit |
022b05 |
return NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
listPtr = ((Object *)smiNodePtr)->uniquenessPtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return (SmiElement *)listPtr;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
char *smiRenderOID(unsigned int oidlen, SmiSubid *oid, int flags)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *nodePtr = NULL;
|
|
Packit |
022b05 |
SmiModule *modulePtr = NULL;
|
|
Packit |
022b05 |
unsigned int i = 0;
|
|
Packit |
022b05 |
char *ss, *s = NULL;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!oid) {
|
|
Packit |
022b05 |
if (flags & SMI_RENDER_UNKNOWN) {
|
|
Packit |
022b05 |
smiAsprintf(&s, SMI_UNKNOWN_LABEL);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
s = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (flags & (SMI_RENDER_NAME | SMI_RENDER_QUALIFIED)) {
|
|
Packit |
022b05 |
int len;
|
|
Packit |
022b05 |
for (len = oidlen; len; len--) {
|
|
Packit |
022b05 |
nodePtr = smiGetNodeByOID(len, oid);
|
|
Packit |
022b05 |
if (! nodePtr || nodePtr->name) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (nodePtr && nodePtr->name) {
|
|
Packit |
022b05 |
i = nodePtr->oidlen;
|
|
Packit |
022b05 |
if (flags & SMI_RENDER_QUALIFIED) {
|
|
Packit |
022b05 |
modulePtr = smiGetNodeModule(nodePtr);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (modulePtr) {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s::%s",
|
|
Packit |
022b05 |
modulePtr->name, nodePtr->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s", nodePtr->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (; i < oidlen; i++) {
|
|
Packit |
022b05 |
ss = s;
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s%s%u", ss ? ss : "", i ? "." : "", oid[i]);
|
|
Packit |
022b05 |
smiFree(ss);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!s) && (flags & SMI_RENDER_UNKNOWN)) {
|
|
Packit |
022b05 |
smiAsprintf(&s, SMI_UNKNOWN_LABEL);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
char *smiRenderValue(SmiValue *smiValuePtr, SmiType *smiTypePtr, int flags)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
unsigned int i, pfx;
|
|
Packit |
022b05 |
int j, k, n, have_pfx;
|
|
Packit |
022b05 |
char *last_fmt, *fmt;
|
|
Packit |
022b05 |
SmiUnsigned64 vv;
|
|
Packit |
022b05 |
int xlen;
|
|
Packit |
022b05 |
SmiNamedNumber *nn;
|
|
Packit |
022b05 |
char *s, *ss;
|
|
Packit |
022b05 |
char f[8];
|
|
Packit |
022b05 |
SmiUnsigned32 v32;
|
|
Packit |
022b05 |
SmiUnsigned64 v64;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!smiValuePtr) {
|
|
Packit |
022b05 |
if (flags & SMI_RENDER_UNKNOWN) {
|
|
Packit |
022b05 |
smiAsprintf(&s, SMI_UNKNOWN_LABEL);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
s = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (smiValuePtr->basetype) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED32:
|
|
Packit |
022b05 |
if (!(flags & SMI_RENDER_FORMAT) ||
|
|
Packit |
022b05 |
!smiTypePtr || !smiTypePtr->format ||
|
|
Packit |
022b05 |
!strlen(smiTypePtr->format) || smiTypePtr->format[0] == 'd') {
|
|
Packit |
022b05 |
if (smiTypePtr->format && (strlen(smiTypePtr->format) >= 3) &&
|
|
Packit |
022b05 |
(smiTypePtr->format[1] == '-')) {
|
|
Packit |
022b05 |
i = atoi(&smiTypePtr->format[2]);
|
|
Packit |
022b05 |
if (i < 0) i = 0;
|
|
Packit |
022b05 |
if (i > 20) i = 20;
|
|
Packit |
022b05 |
smiAsprintf(&s, "%0*lu.",
|
|
Packit |
022b05 |
1 + i,
|
|
Packit |
022b05 |
smiValuePtr->value.unsigned32);
|
|
Packit |
022b05 |
if (s) {
|
|
Packit |
022b05 |
for (j = strlen(s) - 1; i > 0; i--, j--) {
|
|
Packit |
022b05 |
s[j] = s[j-1];
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
s[j] = '.';
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%lu", smiValuePtr->value.unsigned32);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (smiTypePtr->format[0] == 'x') {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%lx", smiValuePtr->value.unsigned32);
|
|
Packit |
022b05 |
} else if (smiTypePtr->format[0] == 'o') {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%lo", smiValuePtr->value.unsigned32);
|
|
Packit |
022b05 |
} else if (smiTypePtr->format[0] == 'b') {
|
|
Packit |
022b05 |
for (i = 32 - 1;
|
|
Packit |
022b05 |
i > 0 && !(smiValuePtr->value.unsigned32 & (1 << i)); i--);
|
|
Packit |
022b05 |
s = smiMalloc(i + 1 + 1);
|
|
Packit |
022b05 |
if (s) {
|
|
Packit |
022b05 |
for (j = 0; i >= 0; i--, j++) {
|
|
Packit |
022b05 |
s[j] = smiValuePtr->value.unsigned32 & (1<
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
s[j] = 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED64:
|
|
Packit |
022b05 |
if (!(flags & SMI_RENDER_FORMAT) ||
|
|
Packit |
022b05 |
!smiTypePtr || !smiTypePtr->format ||
|
|
Packit |
022b05 |
!strlen(smiTypePtr->format) || smiTypePtr->format[0] == 'd') {
|
|
Packit |
022b05 |
if (smiTypePtr->format && (strlen(smiTypePtr->format) >= 3) &&
|
|
Packit |
022b05 |
(smiTypePtr->format[1] == '-')) {
|
|
Packit |
022b05 |
i = atoi(&smiTypePtr->format[2]);
|
|
Packit |
022b05 |
if (i < 0) i = 0;
|
|
Packit |
022b05 |
if (i > 20) i = 20;
|
|
Packit |
022b05 |
sprintf(f, "%%0%s.", UINT64_FORMAT);
|
|
Packit |
022b05 |
f[2] = '*';
|
|
Packit |
022b05 |
smiAsprintf(&s, f,
|
|
Packit |
022b05 |
1 + i,
|
|
Packit |
022b05 |
smiValuePtr->value.unsigned64);
|
|
Packit |
022b05 |
if (s) {
|
|
Packit |
022b05 |
for (j = strlen(s) - 1; i > 0; i--, j--) {
|
|
Packit |
022b05 |
s[j] = s[j-1];
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
s[j] = '.';
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, UINT64_FORMAT, smiValuePtr->value.unsigned64);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (smiTypePtr->format[0] == 'x') {
|
|
Packit |
022b05 |
strcpy(f, UINT64_FORMAT);
|
|
Packit |
022b05 |
f[strlen(f)-1] = 'x';
|
|
Packit |
022b05 |
smiAsprintf(&s, f, smiValuePtr->value.unsigned64);
|
|
Packit |
022b05 |
} else if (smiTypePtr->format[0] == 'o') {
|
|
Packit |
022b05 |
strcpy(f, UINT64_FORMAT);
|
|
Packit |
022b05 |
f[strlen(f)-1] = 'o';
|
|
Packit |
022b05 |
smiAsprintf(&s, f, smiValuePtr->value.unsigned64);
|
|
Packit |
022b05 |
} else if (smiTypePtr->format[0] == 'b') {
|
|
Packit |
022b05 |
for (i = 64 - 1;
|
|
Packit |
022b05 |
i > 0 && !(smiValuePtr->value.unsigned64 & (1 << i)); i--);
|
|
Packit |
022b05 |
s = smiMalloc(i + 1 + 1);
|
|
Packit |
022b05 |
if (s) {
|
|
Packit |
022b05 |
for (j = 0; i >= 0; i--, j++) {
|
|
Packit |
022b05 |
s[j] = smiValuePtr->value.unsigned64 & (1<
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
s[j] = 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER32:
|
|
Packit |
022b05 |
if (!(flags & SMI_RENDER_FORMAT) ||
|
|
Packit |
022b05 |
!smiTypePtr || !smiTypePtr->format ||
|
|
Packit |
022b05 |
!strlen(smiTypePtr->format) || smiTypePtr->format[0] == 'd') {
|
|
Packit |
022b05 |
if (smiTypePtr->format && (strlen(smiTypePtr->format) >= 3) &&
|
|
Packit |
022b05 |
(smiTypePtr->format[1] == '-')) {
|
|
Packit |
022b05 |
i = atoi(&smiTypePtr->format[2]);
|
|
Packit |
022b05 |
if (i < 0) i = 0;
|
|
Packit |
022b05 |
if (i > 20) i = 20;
|
|
Packit |
022b05 |
smiAsprintf(&s, "%0*ld.",
|
|
Packit |
022b05 |
1 + i + (smiValuePtr->value.integer32 < 0 ? 1 : 0),
|
|
Packit |
022b05 |
smiValuePtr->value.integer32);
|
|
Packit |
022b05 |
if (s) {
|
|
Packit |
022b05 |
for (j = strlen(s) - 1; i > 0; i--, j--) {
|
|
Packit |
022b05 |
s[j] = s[j-1];
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
s[j] = '.';
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%ld", smiValuePtr->value.integer32);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (smiTypePtr->format[0] == 'x') {
|
|
Packit |
022b05 |
if (smiValuePtr->value.integer32 >= 0) {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%lx", smiValuePtr->value.integer32);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, "-%lx", - smiValuePtr->value.integer32);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (smiTypePtr->format[0] == 'o') {
|
|
Packit |
022b05 |
if (smiValuePtr->value.integer32 >= 0) {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%lo", smiValuePtr->value.integer32);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, "-%lo", - smiValuePtr->value.integer32);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (smiTypePtr->format[0] == 'b') {
|
|
Packit |
022b05 |
if (smiValuePtr->value.integer32 >= 0) {
|
|
Packit |
022b05 |
v32 = smiValuePtr->value.integer32;
|
|
Packit |
022b05 |
j = 0;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
v32 = - smiValuePtr->value.integer32;
|
|
Packit |
022b05 |
j = 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
for (i = 32 - 1;
|
|
Packit |
022b05 |
i > 0 && !(v32 & (1 << i)); i--);
|
|
Packit |
022b05 |
s = smiMalloc(i + j + 1 + 1);
|
|
Packit |
022b05 |
if (s) {
|
|
Packit |
022b05 |
s[0] = '-';
|
|
Packit |
022b05 |
for (; i >= 0; i--, j++) {
|
|
Packit |
022b05 |
s[j] = v32 & (1<
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
s[j] = 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER64:
|
|
Packit |
022b05 |
if (!(flags & SMI_RENDER_FORMAT) ||
|
|
Packit |
022b05 |
!smiTypePtr || !smiTypePtr->format ||
|
|
Packit |
022b05 |
!strlen(smiTypePtr->format) || smiTypePtr->format[0] == 'd') {
|
|
Packit |
022b05 |
if (smiTypePtr->format && (strlen(smiTypePtr->format) >= 3) &&
|
|
Packit |
022b05 |
(smiTypePtr->format[1] == '-')) {
|
|
Packit |
022b05 |
i = atoi(&smiTypePtr->format[2]);
|
|
Packit |
022b05 |
if (i < 0) i = 0;
|
|
Packit |
022b05 |
if (i > 20) i = 20;
|
|
Packit |
022b05 |
sprintf(f, "%%0%s.", INT64_FORMAT);
|
|
Packit |
022b05 |
f[2] = '*';
|
|
Packit |
022b05 |
smiAsprintf(&s, f,
|
|
Packit |
022b05 |
1 + i + (smiValuePtr->value.integer64 < 0 ? 1 : 0),
|
|
Packit |
022b05 |
smiValuePtr->value.integer64);
|
|
Packit |
022b05 |
if (s) {
|
|
Packit |
022b05 |
for (j = strlen(s) - 1; i > 0; i--, j--) {
|
|
Packit |
022b05 |
s[j] = s[j-1];
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
s[j] = '.';
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, INT64_FORMAT, smiValuePtr->value.integer64);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (smiTypePtr->format[0] == 'x') {
|
|
Packit |
022b05 |
if (smiValuePtr->value.integer64 >= 0) {
|
|
Packit |
022b05 |
strcpy(f, UINT64_FORMAT);
|
|
Packit |
022b05 |
f[strlen(f)-1] = 'x';
|
|
Packit |
022b05 |
smiAsprintf(&s, f, smiValuePtr->value.integer64);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
sprintf(f, "-%s", UINT64_FORMAT);
|
|
Packit |
022b05 |
f[strlen(f)-1] = 'x';
|
|
Packit |
022b05 |
smiAsprintf(&s, f, - smiValuePtr->value.integer64);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (smiTypePtr->format[0] == 'o') {
|
|
Packit |
022b05 |
if (smiValuePtr->value.integer64 >= 0) {
|
|
Packit |
022b05 |
strcpy(f, UINT64_FORMAT);
|
|
Packit |
022b05 |
sprintf(f, "-%s", UINT64_FORMAT);
|
|
Packit |
022b05 |
f[strlen(f)-1] = 'o';
|
|
Packit |
022b05 |
smiAsprintf(&s, f, smiValuePtr->value.integer64);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, f, - smiValuePtr->value.integer64);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else if (smiTypePtr->format[0] == 'b') {
|
|
Packit |
022b05 |
if (smiValuePtr->value.integer64 >= 0) {
|
|
Packit |
022b05 |
v64 = smiValuePtr->value.integer64;
|
|
Packit |
022b05 |
j = 0;
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
v64 = - smiValuePtr->value.integer64;
|
|
Packit |
022b05 |
j = 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
for (i = 64 - 1;
|
|
Packit |
022b05 |
i > 0 && !(v64 & (1 << i)); i--);
|
|
Packit |
022b05 |
s = smiMalloc(i + j + 1 + 1);
|
|
Packit |
022b05 |
if (s) {
|
|
Packit |
022b05 |
s[0] = '-';
|
|
Packit |
022b05 |
for (; i >= 0; i--, j++) {
|
|
Packit |
022b05 |
s[j] = v64 & (1<
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
s[j] = 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OBJECTIDENTIFIER:
|
|
Packit |
022b05 |
s = smiRenderOID(smiValuePtr->len, smiValuePtr->value.oid, flags);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OCTETSTRING:
|
|
Packit |
022b05 |
if (!(flags & SMI_RENDER_FORMAT) ||
|
|
Packit |
022b05 |
(!smiTypePtr->format &&
|
|
Packit |
022b05 |
(smiTypePtr->name && strcmp( smiTypePtr->name, "IpAddress")) ) ) {
|
|
Packit |
022b05 |
for (i = 0; i < smiValuePtr->len; i++) {
|
|
Packit |
022b05 |
if (!isprint((int)smiValuePtr->value.ptr[i])) break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if ((i < smiValuePtr->len) ||
|
|
Packit |
022b05 |
!(flags & SMI_RENDER_PRINTABLE)) {
|
|
Packit |
022b05 |
smiAsprintf(&s, "");
|
|
Packit |
022b05 |
for (i=0; i < smiValuePtr->len; i++) {
|
|
Packit |
022b05 |
ss = s;
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s%02x", ss, smiValuePtr->value.ptr[i]);
|
|
Packit |
022b05 |
smiFree(ss);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s", smiValuePtr->value.ptr);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
i = 0;
|
|
Packit |
022b05 |
smiAsprintf(&s, "");
|
|
Packit |
022b05 |
/* SNMPv2-SMI:IpAddress does not have a display hint.
|
|
Packit |
022b05 |
==> let's use this one: "1d." if we have an IpAddress here */
|
|
Packit |
022b05 |
fmt = (smiTypePtr->name &&
|
|
Packit |
022b05 |
strcmp( smiTypePtr->name, "IpAddress" ) ) ?
|
|
Packit |
022b05 |
smiTypePtr->format : "1d.";
|
|
Packit |
022b05 |
while (*fmt && i < smiValuePtr->len) {
|
|
Packit |
022b05 |
last_fmt = fmt;
|
|
Packit |
022b05 |
have_pfx = pfx = 0; /* scan prefix: */
|
|
Packit |
022b05 |
while (*fmt && isdigit((int)*fmt)) {
|
|
Packit |
022b05 |
pfx = pfx * 10 + *fmt - '0', have_pfx = 1, fmt++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (! have_pfx) {
|
|
Packit |
022b05 |
pfx = 1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
switch (*fmt) {
|
|
Packit |
022b05 |
case 't':
|
|
Packit |
022b05 |
/* XXX UTF-8 not implemented, fall through to ASCII (a) */
|
|
Packit |
022b05 |
case 'a':
|
|
Packit |
022b05 |
n = (pfx < (smiValuePtr->len - i)) ?
|
|
Packit |
022b05 |
pfx : smiValuePtr->len - i;
|
|
Packit |
022b05 |
for (k = 0; k < n; k++) {
|
|
Packit |
022b05 |
if (! isascii((int) smiValuePtr->value.ptr[i+k])) {
|
|
Packit |
022b05 |
smiFree(s);
|
|
Packit |
022b05 |
if (flags & SMI_RENDER_UNKNOWN) {
|
|
Packit |
022b05 |
smiAsprintf(&s, SMI_UNKNOWN_LABEL);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
s = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
ss = s;
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s%c", ss, smiValuePtr->value.ptr[i+k]);
|
|
Packit |
022b05 |
smiFree(ss);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
i += n;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case 'b':
|
|
Packit |
022b05 |
case 'd':
|
|
Packit |
022b05 |
case 'o':
|
|
Packit |
022b05 |
case 'x':
|
|
Packit |
022b05 |
/* XXX: limited to no more than
|
|
Packit |
022b05 |
sizeof(SmiUnsigned64) octets */
|
|
Packit |
022b05 |
vv = 0;
|
|
Packit |
022b05 |
xlen = pfx * 2;
|
|
Packit |
022b05 |
while (pfx > 0 && i < smiValuePtr->len) {
|
|
Packit |
022b05 |
vv = vv * 256 +
|
|
Packit |
022b05 |
((unsigned char)smiValuePtr->value.ptr[i]);
|
|
Packit |
022b05 |
i++;
|
|
Packit |
022b05 |
pfx--;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
switch (*fmt) {
|
|
Packit |
022b05 |
case 'd':
|
|
Packit |
022b05 |
ss = s;
|
|
Packit |
022b05 |
sprintf(f, "%%s%s", UINT64_FORMAT);
|
|
Packit |
022b05 |
smiAsprintf(&s, f, ss, vv);
|
|
Packit |
022b05 |
smiFree(ss);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case 'o':
|
|
Packit |
022b05 |
ss = s;
|
|
Packit |
022b05 |
sprintf(f, "%%s%s", UINT64_FORMAT);
|
|
Packit |
022b05 |
f[strlen(f)-1] = 'o';
|
|
Packit |
022b05 |
smiAsprintf(&s, f, ss, vv);
|
|
Packit |
022b05 |
smiFree(ss);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case 'x':
|
|
Packit |
022b05 |
ss = s;
|
|
Packit |
022b05 |
sprintf(f, "%%s%%0%s", UINT64_FORMAT);
|
|
Packit |
022b05 |
f[4] = '*';
|
|
Packit |
022b05 |
f[strlen(f)-1] = 'x';
|
|
Packit |
022b05 |
smiAsprintf(&s, f, ss, xlen, vv);
|
|
Packit |
022b05 |
smiFree(ss);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case 'b':
|
|
Packit |
022b05 |
k = pfx * 8 - 1;
|
|
Packit |
022b05 |
if (k > sizeof(SmiUnsigned64) * 8 - 1)
|
|
Packit |
022b05 |
k = sizeof(SmiUnsigned64) * 8 - 1;
|
|
Packit |
022b05 |
for (j = 0; k >= 0; k--, j++) {
|
|
Packit |
022b05 |
ss = s;
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s%c",
|
|
Packit |
022b05 |
ss, vv & (1 << k) ? '1' : '0');
|
|
Packit |
022b05 |
smiFree(ss);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
smiFree(s);
|
|
Packit |
022b05 |
if (flags & SMI_RENDER_UNKNOWN) {
|
|
Packit |
022b05 |
smiAsprintf(&s, SMI_UNKNOWN_LABEL);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
s = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fmt++;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
/*
|
|
Packit |
022b05 |
* Check for a separator and repeat with last format if
|
|
Packit |
022b05 |
* data is still available.
|
|
Packit |
022b05 |
*/
|
|
Packit |
022b05 |
if (*fmt && ! isdigit((int) *fmt) && *fmt != '*') {
|
|
Packit |
022b05 |
if (i < smiValuePtr->len) {
|
|
Packit |
022b05 |
ss = s;
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s%c", ss, fmt[0]);
|
|
Packit |
022b05 |
smiFree(ss);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
fmt++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (! *fmt && (i < smiValuePtr->len)) {
|
|
Packit |
022b05 |
fmt = last_fmt;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_ENUM:
|
|
Packit |
022b05 |
if ((flags & SMI_RENDER_NAME) && (smiTypePtr)) {
|
|
Packit |
022b05 |
for (nn = smiGetFirstNamedNumber(smiTypePtr); nn;
|
|
Packit |
022b05 |
nn = smiGetNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
if (nn->value.value.integer32 == smiValuePtr->value.integer32)
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (nn) {
|
|
Packit |
022b05 |
if (flags & SMI_RENDER_NUMERIC) {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s(%ld)",
|
|
Packit |
022b05 |
nn->name, nn->value.value.integer32);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s", nn->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%ld", smiValuePtr->value.integer32);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%ld", smiValuePtr->value.integer32);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_BITS:
|
|
Packit |
022b05 |
smiAsprintf(&s, "");
|
|
Packit |
022b05 |
for (i = 0, nn = NULL; i < smiValuePtr->len * 8; i++) {
|
|
Packit |
022b05 |
if (smiValuePtr->value.ptr[i/8] & (1 << (7-(i%8)))) {
|
|
Packit |
022b05 |
if ((flags & SMI_RENDER_NAME) && (smiTypePtr)) {
|
|
Packit |
022b05 |
for (nn = smiGetFirstNamedNumber(smiTypePtr); nn;
|
|
Packit |
022b05 |
nn = smiGetNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
if (nn->value.value.unsigned32 == i)
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
ss = s;
|
|
Packit |
022b05 |
if ((flags & SMI_RENDER_NAME) &&
|
|
Packit |
022b05 |
(flags & SMI_RENDER_NUMERIC) && nn) {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s%s%s(%d)",
|
|
Packit |
022b05 |
ss, strlen(ss) ? " " : "", nn->name, i);
|
|
Packit |
022b05 |
} else if (nn) {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s%s%s",
|
|
Packit |
022b05 |
ss, strlen(ss) ? " " : "", nn->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s%s%d",
|
|
Packit |
022b05 |
ss, strlen(ss) ? " " : "", i);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
smiFree(ss);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT32:
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT64:
|
|
Packit |
022b05 |
case SMI_BASETYPE_FLOAT128:
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNKNOWN:
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
if (flags & SMI_RENDER_UNKNOWN) {
|
|
Packit |
022b05 |
smiAsprintf(&s, SMI_UNKNOWN_LABEL);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
s = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
char *smiRenderNode(SmiNode *smiNodePtr, int flags)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *s;
|
|
Packit |
022b05 |
SmiModule *modulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!smiNodePtr) || (smiNodePtr->name == NULL)) {
|
|
Packit |
022b05 |
if (flags & SMI_RENDER_UNKNOWN) {
|
|
Packit |
022b05 |
smiAsprintf(&s, SMI_UNKNOWN_LABEL);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
s = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
modulePtr = smiGetNodeModule(smiNodePtr);
|
|
Packit |
022b05 |
if ((!(flags & SMI_RENDER_QUALIFIED)) ||
|
|
Packit |
022b05 |
(!modulePtr) ||
|
|
Packit |
022b05 |
(!strlen(modulePtr->name))) {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s", smiNodePtr->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s::%s", modulePtr->name, smiNodePtr->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
char *smiRenderType(SmiType *smiTypePtr, int flags)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
char *s;
|
|
Packit |
022b05 |
SmiModule *modulePtr;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if ((!smiTypePtr) || (smiTypePtr->name == NULL)) {
|
|
Packit |
022b05 |
if (flags & SMI_RENDER_UNKNOWN) {
|
|
Packit |
022b05 |
smiAsprintf(&s, SMI_UNKNOWN_LABEL);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
s = NULL;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
modulePtr = smiGetTypeModule(smiTypePtr);
|
|
Packit |
022b05 |
if ((!(flags & SMI_RENDER_QUALIFIED)) ||
|
|
Packit |
022b05 |
(!modulePtr) ||
|
|
Packit |
022b05 |
(!strlen(modulePtr->name))) {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s", smiTypePtr->name);
|
|
Packit |
022b05 |
} else {
|
|
Packit |
022b05 |
smiAsprintf(&s, "%s::%s", modulePtr->name, smiTypePtr->name);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return s;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
unsigned int smiGetMinSize(SmiType *smiType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiRange *smiRange;
|
|
Packit |
022b05 |
SmiType *parentType;
|
|
Packit |
022b05 |
unsigned int min = 65535, size;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (smiType->basetype) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_BITS:
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OCTETSTRING:
|
|
Packit |
022b05 |
case SMI_BASETYPE_OBJECTIDENTIFIER:
|
|
Packit |
022b05 |
size = 0;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiRange = smiGetFirstRange(smiType);
|
|
Packit |
022b05 |
smiRange ; smiRange = smiGetNextRange(smiRange)) {
|
|
Packit |
022b05 |
if (smiRange->minValue.value.unsigned32 < min) {
|
|
Packit |
022b05 |
min = smiRange->minValue.value.unsigned32;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (min < 65535 && min > size) {
|
|
Packit |
022b05 |
size = min;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
parentType = smiGetParentType(smiType);
|
|
Packit |
022b05 |
if (parentType) {
|
|
Packit |
022b05 |
unsigned int psize = smiGetMinSize(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 |
unsigned int smiGetMaxSize(SmiType *smiType)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiRange *smiRange;
|
|
Packit |
022b05 |
SmiType *parentType;
|
|
Packit |
022b05 |
SmiNamedNumber *nn;
|
|
Packit |
022b05 |
unsigned int max = 0, size;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (smiType->basetype) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_BITS:
|
|
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 |
if (smiType->basetype == SMI_BASETYPE_BITS) {
|
|
Packit |
022b05 |
for (nn = smiGetFirstNamedNumber(smiType);
|
|
Packit |
022b05 |
nn;
|
|
Packit |
022b05 |
nn = smiGetNextNamedNumber(nn)) {
|
|
Packit |
022b05 |
if (nn->value.value.unsigned32 > max) {
|
|
Packit |
022b05 |
max = nn->value.value.unsigned32;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
size = (max / 8) + 1;
|
|
Packit |
022b05 |
return size;
|
|
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 = smiGetMaxSize(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 |
int smiUnpack(SmiNode *row, SmiSubid *oid, unsigned int oidlen,
|
|
Packit |
022b05 |
SmiValue **vals, int *valslen)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiNode *indexNode = NULL;
|
|
Packit |
022b05 |
SmiElement *smiElement;
|
|
Packit |
022b05 |
SmiNode *iNode;
|
|
Packit |
022b05 |
SmiType *iType;
|
|
Packit |
022b05 |
int i, j, last = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
if (!vals || !valslen || !row || !oid) {
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (row->indexkind) {
|
|
Packit |
022b05 |
case SMI_INDEX_INDEX:
|
|
Packit |
022b05 |
case SMI_INDEX_REORDER:
|
|
Packit |
022b05 |
indexNode = row;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_INDEX_EXPAND: /* TODO: we have to do more work here! */
|
|
Packit |
022b05 |
indexNode = NULL;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_INDEX_AUGMENT:
|
|
Packit |
022b05 |
case SMI_INDEX_SPARSE:
|
|
Packit |
022b05 |
indexNode = smiGetRelatedNode(row);
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_INDEX_UNKNOWN:
|
|
Packit |
022b05 |
indexNode = NULL;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
*valslen = 0;
|
|
Packit |
022b05 |
for (smiElement = smiGetFirstElement(indexNode);
|
|
Packit |
022b05 |
smiElement; smiElement = smiGetNextElement(smiElement)) {
|
|
Packit |
022b05 |
iNode = smiGetElementNode(smiElement);
|
|
Packit |
022b05 |
if (iNode) {
|
|
Packit |
022b05 |
iType = smiGetNodeType(iNode);
|
|
Packit |
022b05 |
if (! iType) break;
|
|
Packit |
022b05 |
(*valslen)++;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (smiElement) {
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
*vals = smiMalloc(*valslen * sizeof(SmiValue));
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (smiElement = smiGetFirstElement(indexNode), i = 0, j = 0;
|
|
Packit |
022b05 |
smiElement; smiElement = smiGetNextElement(smiElement), i++) {
|
|
Packit |
022b05 |
iNode = smiGetElementNode(smiElement);
|
|
Packit |
022b05 |
last = (smiGetNextElement(smiElement) == NULL);
|
|
Packit |
022b05 |
iType = smiGetNodeType(iNode);
|
|
Packit |
022b05 |
fprintf(stderr, "** %s (%s)\n", iNode->name, iType->name);
|
|
Packit |
022b05 |
(*vals)[i].basetype = iType->basetype;
|
|
Packit |
022b05 |
switch (iType->basetype) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_ENUM:
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER32:
|
|
Packit |
022b05 |
(*vals)[i].value.integer32 = oid[j]; j++;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED32:
|
|
Packit |
022b05 |
(*vals)[i].value.unsigned32 = oid[j]; j++;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OCTETSTRING:
|
|
Packit |
022b05 |
/* need to know whether implied/fixed length or not */
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_OBJECTIDENTIFIER:
|
|
Packit |
022b05 |
/* need to know whether implied/fixed length or not */
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return *valslen;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiAsprintf(char **strp, const char *format, ...)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int rc;
|
|
Packit |
022b05 |
va_list ap;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
va_start(ap, format);
|
|
Packit |
022b05 |
rc = vasprintf(strp, format, ap);
|
|
Packit |
022b05 |
va_end(ap);
|
|
Packit |
022b05 |
if (! strp) {
|
|
Packit |
022b05 |
smiPrintError(NULL, ERR_OUT_OF_MEMORY);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return rc;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiVasprintf(char **strp, const char *format, va_list ap)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
int rc;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
rc = vasprintf(strp, format, ap);
|
|
Packit |
022b05 |
if (! strp) {
|
|
Packit |
022b05 |
smiPrintError(NULL, ERR_OUT_OF_MEMORY);
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
return rc;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
int smiGetMinMaxRange(SmiType *smiType, SmiValue *min, SmiValue *max)
|
|
Packit |
022b05 |
{
|
|
Packit |
022b05 |
SmiBasetype basetype = SMI_BASETYPE_UNKNOWN;
|
|
Packit |
022b05 |
SmiRange *range;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
min->basetype = max->basetype = SMI_BASETYPE_UNKNOWN;
|
|
Packit |
022b05 |
min->len = max->len = 0;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
range = smiGetFirstRange(smiType);
|
|
Packit |
022b05 |
if (!range) {
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
basetype = range->minValue.basetype;
|
|
Packit |
022b05 |
min->basetype = max->basetype = basetype;
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
switch (basetype) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER32:
|
|
Packit |
022b05 |
min->value.integer32 = SMI_BASETYPE_INTEGER32_MAX;
|
|
Packit |
022b05 |
max->value.integer32 = SMI_BASETYPE_INTEGER32_MIN;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER64:
|
|
Packit |
022b05 |
min->value.integer64 = SMI_BASETYPE_INTEGER64_MAX;
|
|
Packit |
022b05 |
max->value.integer64 = SMI_BASETYPE_INTEGER64_MIN;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED32:
|
|
Packit |
022b05 |
min->value.unsigned32 = SMI_BASETYPE_UNSIGNED32_MAX;
|
|
Packit |
022b05 |
max->value.unsigned32 = SMI_BASETYPE_UNSIGNED32_MIN;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED64:
|
|
Packit |
022b05 |
min->value.unsigned64 = SMI_BASETYPE_UNSIGNED64_MAX;
|
|
Packit |
022b05 |
max->value.unsigned64 = SMI_BASETYPE_UNSIGNED32_MIN;
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
fprintf(stderr, "smidump: unexpected basetype %d\n", basetype);
|
|
Packit |
022b05 |
return -1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
for (range = smiGetFirstRange(smiType);
|
|
Packit |
022b05 |
range;
|
|
Packit |
022b05 |
range = smiGetNextRange(range)) {
|
|
Packit |
022b05 |
switch (basetype) {
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER32:
|
|
Packit |
022b05 |
if (range->minValue.value.integer32 < min->value.integer32) {
|
|
Packit |
022b05 |
min->value.integer32 = range->minValue.value.integer32;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (range->maxValue.value.integer32 > max->value.integer32) {
|
|
Packit |
022b05 |
max->value.integer32 = range->maxValue.value.integer32;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_INTEGER64:
|
|
Packit |
022b05 |
if (range->minValue.value.integer64 < min->value.integer64) {
|
|
Packit |
022b05 |
min->value.integer64 = range->minValue.value.integer64;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (range->maxValue.value.integer64 > max->value.integer64) {
|
|
Packit |
022b05 |
max->value.integer64 = range->maxValue.value.integer64;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED32:
|
|
Packit |
022b05 |
if (range->minValue.value.unsigned32 < min->value.unsigned32) {
|
|
Packit |
022b05 |
min->value.unsigned32 = range->minValue.value.unsigned32;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (range->maxValue.value.unsigned32 > max->value.unsigned32) {
|
|
Packit |
022b05 |
max->value.unsigned32 = range->maxValue.value.unsigned32;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
case SMI_BASETYPE_UNSIGNED64:
|
|
Packit |
022b05 |
if (range->minValue.value.unsigned64 < min->value.unsigned64) {
|
|
Packit |
022b05 |
min->value.unsigned64 = range->minValue.value.unsigned64;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
if (range->maxValue.value.unsigned64 > max->value.unsigned64) {
|
|
Packit |
022b05 |
max->value.unsigned64 = range->maxValue.value.unsigned64;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
break;
|
|
Packit |
022b05 |
default:
|
|
Packit |
022b05 |
fprintf(stderr, "smidump: unexpected basetype %d\n", basetype);
|
|
Packit |
022b05 |
return -1;
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
}
|
|
Packit |
022b05 |
|
|
Packit |
022b05 |
return 0;
|
|
Packit |
022b05 |
}
|