4 * Interface Definition of libsmi (version @VERSION_LIBTOOL@).
6 * Copyright (c) 1999,2000 Frank Strauss, Technical University of Braunschweig.
8 * See the file "COPYING" for information on usage and redistribution
9 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
11 * @(#) $Id: smi.h.in 8090 2008-04-18 12:56:29Z strauss $
33 #define SMI_LIBRARY_VERSION "@VERSION_LIBTOOL@"
34 extern const char *smi_library_version;
36 #define SMI_VERSION_MAJOR @LIBSMI_MAJOR@
37 #define SMI_VERSION_MINOR @LIBSMI_MINOR@
38 #define SMI_VERSION_PATCHLEVEL @LIBSMI_PATCHLEVEL@
39 #define SMI_VERSION_STRING "@VERSION_STRING@"
40 extern const char *smi_version_string;
44 #define SMI_FLAG_NODESCR 0x0800 /* do not load descriptions/references. */
45 #define SMI_FLAG_VIEWALL 0x1000 /* all modules are `known', need no views. */
46 #define SMI_FLAG_ERRORS 0x2000 /* print parser errors. */
47 #define SMI_FLAG_RECURSIVE 0x4000 /* recursively parse imported modules. */
48 #define SMI_FLAG_STATS 0x8000 /* print statistics after parsing module. */
49 #define SMI_FLAG_MASK (SMI_FLAG_NODESCR|SMI_FLAG_VIEWALL|SMI_FLAG_STATS|\
50 SMI_FLAG_RECURSIVE|SMI_FLAG_ERRORS)
54 /* misc mappings of SMI types to C types */
55 typedef char *SmiIdentifier;
56 typedef unsigned long SmiUnsigned32;
57 typedef long SmiInteger32;
58 #ifdef _MSC_VER /* if using MSVC and not configure */
59 typedef __int64 SmiInteger64;
60 typedef unsigned __int64 SmiUnsigned64;
62 typedef @UINT64_TYPE@ SmiUnsigned64;
63 typedef @INT64_TYPE@ SmiInteger64;
65 typedef unsigned int SmiSubid;
66 typedef float SmiFloat32;
67 typedef double SmiFloat64;
68 typedef long double SmiFloat128;
72 /* SmiLanguage -- language of an actual MIB module */
73 typedef enum SmiLanguage {
74 SMI_LANGUAGE_UNKNOWN = 0, /* should not occur */
75 SMI_LANGUAGE_SMIV1 = 1,
76 SMI_LANGUAGE_SMIV2 = 2,
77 SMI_LANGUAGE_SMING = 3,
81 /* SmiBasetype -- base types of all languages */
82 typedef enum SmiBasetype {
83 SMI_BASETYPE_UNKNOWN = 0, /* should not occur */
84 SMI_BASETYPE_INTEGER32 = 1, /* also SMIv1/v2 INTEGER */
85 SMI_BASETYPE_OCTETSTRING = 2,
86 SMI_BASETYPE_OBJECTIDENTIFIER = 3,
87 SMI_BASETYPE_UNSIGNED32 = 4,
88 SMI_BASETYPE_INTEGER64 = 5, /* SMIng and SPPI */
89 SMI_BASETYPE_UNSIGNED64 = 6, /* SMIv2, SMIng and SPPI */
90 SMI_BASETYPE_FLOAT32 = 7, /* only SMIng */
91 SMI_BASETYPE_FLOAT64 = 8, /* only SMIng */
92 SMI_BASETYPE_FLOAT128 = 9, /* only SMIng */
93 SMI_BASETYPE_ENUM = 10,
94 SMI_BASETYPE_BITS = 11, /* SMIv2, SMIng and SPPI */
95 SMI_BASETYPE_POINTER = 12 /* only SMIng */
99 #define SMI_BASETYPE_INTEGER32_MIN INT32_MIN
101 #define SMI_BASETYPE_INTEGER32_MIN INT_MIN
104 #define SMI_BASETYPE_INTEGER32_MAX INT32_MAX
106 #define SMI_BASETYPE_INTEGER32_MAX INT_MAX
108 #define SMI_BASETYPE_INTEGER64_MIN LIBSMI_INT64_MIN
109 #define SMI_BASETYPE_INTEGER64_MAX LIBSMI_INT64_MAX
110 #define SMI_BASETYPE_UNSIGNED32_MIN 0
112 #define SMI_BASETYPE_UNSIGNED32_MAX UINT32_MAX
114 #define SMI_BASETYPE_UNSIGNED32_MAX UINT_MAX
116 #define SMI_BASETYPE_UNSIGNED64_MIN 0
117 #define SMI_BASETYPE_UNSIGNED64_MAX LIBSMI_UINT64_MAX
119 /* SmiStatus -- values of status levels */
120 typedef enum SmiStatus {
121 SMI_STATUS_UNKNOWN = 0, /* should not occur */
122 SMI_STATUS_CURRENT = 1, /* only SMIv2, SMIng and SPPI */
123 SMI_STATUS_DEPRECATED = 2, /* SMIv1, SMIv2, SMIng and SPPI */
124 SMI_STATUS_MANDATORY = 3, /* only SMIv1 */
125 SMI_STATUS_OPTIONAL = 4, /* only SMIv1 */
126 SMI_STATUS_OBSOLETE = 5 /* SMIv1, SMIv2, SMIng and SPPI */
129 /* SmiAccess -- values of access levels */
130 typedef enum SmiAccess {
131 SMI_ACCESS_UNKNOWN = 0, /* should not occur */
132 SMI_ACCESS_NOT_IMPLEMENTED = 1, /* only for agent capability variations */
133 SMI_ACCESS_NOT_ACCESSIBLE = 2, /* the values 2 to 5 are allowed to be */
134 SMI_ACCESS_NOTIFY = 3, /* compared by relational operators. */
135 SMI_ACCESS_READ_ONLY = 4,
136 SMI_ACCESS_READ_WRITE = 5,
137 SMI_ACCESS_INSTALL = 6, /* these three entries are only valid */
138 SMI_ACCESS_INSTALL_NOTIFY = 7, /* for SPPI */
139 SMI_ACCESS_REPORT_ONLY = 8,
140 SMI_ACCESS_EVENT_ONLY = 9 /* this entry is valid only for SMIng */
143 /* SmiNodekind -- type or statement that leads to a definition */
144 typedef unsigned int SmiNodekind;
145 #define SMI_NODEKIND_UNKNOWN 0x0000 /* should not occur */
146 #define SMI_NODEKIND_NODE 0x0001
147 #define SMI_NODEKIND_SCALAR 0x0002
148 #define SMI_NODEKIND_TABLE 0x0004
149 #define SMI_NODEKIND_ROW 0x0008
150 #define SMI_NODEKIND_COLUMN 0x0010
151 #define SMI_NODEKIND_NOTIFICATION 0x0020
152 #define SMI_NODEKIND_GROUP 0x0040
153 #define SMI_NODEKIND_COMPLIANCE 0x0080
154 #define SMI_NODEKIND_CAPABILITIES 0x0100
155 #define SMI_NODEKIND_ANY 0xffff
157 /* SmiDecl -- type or statement that leads to a definition */
158 typedef enum SmiDecl {
159 SMI_DECL_UNKNOWN = 0, /* should not occur */
160 /* SMIv1/v2 ASN.1 statements and macros */
161 SMI_DECL_IMPLICIT_TYPE = 1,
162 SMI_DECL_TYPEASSIGNMENT = 2,
163 SMI_DECL_IMPL_SEQUENCEOF = 4, /* this will go away */
164 SMI_DECL_VALUEASSIGNMENT = 5,
165 SMI_DECL_OBJECTTYPE = 6, /* values >= 6 are assumed to be */
166 SMI_DECL_OBJECTIDENTITY = 7, /* registering an OID, see check.c */
167 SMI_DECL_MODULEIDENTITY = 8,
168 SMI_DECL_NOTIFICATIONTYPE = 9,
169 SMI_DECL_TRAPTYPE = 10,
170 SMI_DECL_OBJECTGROUP = 11,
171 SMI_DECL_NOTIFICATIONGROUP = 12,
172 SMI_DECL_MODULECOMPLIANCE = 13,
173 SMI_DECL_AGENTCAPABILITIES = 14,
174 SMI_DECL_TEXTUALCONVENTION = 15,
176 SMI_DECL_COMPL_GROUP = 17,
177 SMI_DECL_COMPL_OBJECT = 18,
178 SMI_DECL_IMPL_OBJECT = 19, /* object label in sth like "iso(1)" */
179 /* SMIng statements */
180 SMI_DECL_MODULE = 33,
181 SMI_DECL_EXTENSION = 34,
182 SMI_DECL_TYPEDEF = 35,
184 SMI_DECL_SCALAR = 37,
187 SMI_DECL_COLUMN = 40,
188 SMI_DECL_NOTIFICATION = 41,
190 SMI_DECL_COMPLIANCE = 43,
191 SMI_DECL_IDENTITY = 44,
193 SMI_DECL_ATTRIBUTE = 46,
197 /* SmiIndexkind -- actual kind of a table row's index method */
198 typedef enum SmiIndexkind {
199 SMI_INDEX_UNKNOWN = 0,
201 SMI_INDEX_AUGMENT = 2,
202 SMI_INDEX_REORDER = 3,
203 SMI_INDEX_SPARSE = 4,
207 /* SmiValue -- any single value; for use in default values and subtyping */
208 typedef struct SmiValue {
209 SmiBasetype basetype;
210 unsigned int len; /* OID, OctetString, Bits */
212 SmiUnsigned64 unsigned64;
213 SmiInteger64 integer64;
214 SmiUnsigned32 unsigned32;
215 SmiInteger32 integer32;
218 SmiFloat128 float128;
220 char *ptr; /* OctetString, Bits */
224 /* SmiNamedNumber -- a named number; for enumeration and bitset types */
225 typedef struct SmiNamedNumber {
230 /* SmiRange -- a min-max value range; for subtyping of sizes or numbers */
231 typedef struct SmiRange {
236 /* SmiModule -- the main structure of a module */
237 typedef struct SmiModule {
244 SmiLanguage language;
248 /* SmiRevision -- content of a single module's revision clause */
249 typedef struct SmiRevision {
254 /* SmiImport -- an imported descriptor */
255 typedef struct SmiImport {
256 SmiIdentifier module;
260 /* SmiMacro -- the main structure of a SMIv1/v2 macro or SMIng extension */
261 typedef struct SmiMacro {
267 char *abnf; /* only for SMIng */
270 /* SmiIdentity -- the main structure of a SMIng Identity. */
271 /* NOTE: Not to be confused with SMIv2 MODULE-IDENTITY */
272 typedef struct SmiIdentity {
280 /* SmiType -- the main structure of a type definition (also base types) */
281 /* also SMIng attributes */
282 typedef struct SmiType {
284 SmiBasetype basetype;
294 /* SmiNode -- the main structure of any clause that defines a node */
295 typedef struct SmiNode {
298 SmiSubid *oid; /* array of length oidlen */
307 SmiIndexkind indexkind; /* only valid for rows */
308 int implied; /* only valid for rows */
309 int create; /* only valid for rows */
310 SmiNodekind nodekind;
313 /* SmiElement -- an item in a list (row index column, notification object) */
314 typedef struct SmiElement {
316 char dummy; /* many compilers are unhappy with empty structures. */
318 /* no visible attributes */
321 /* SmiOption -- an optional group in a compliance statement */
322 typedef struct SmiOption {
326 /* SmiRefinement -- a refined object in a compliance statement */
327 typedef struct SmiRefinement {
332 /* SmiClass -- main structure for SMIng class statement */
333 typedef struct SmiClass {
341 /* SmiClass -- main structure for class attribute */
342 typedef struct SmiAttribute {
344 SmiBasetype basetype;
356 /* SmiEvent -- the main structure of a SMIng Event(part of class definition).*/
357 typedef struct SmiEvent {
367 extern int smiInit(const char *tag);
369 extern void smiExit(void);
371 extern void smiSetErrorLevel(int level);
373 extern int smiGetFlags(void);
375 extern void smiSetFlags(int userflags);
377 extern char *smiGetPath(void);
379 extern int smiSetPath(const char *path);
381 extern void smiSetSeverity(char *pattern, int severity);
383 extern int smiReadConfig(const char *filename, const char *tag);
385 extern char *smiLoadModule(const char *module);
387 extern int smiIsLoaded(const char *module);
390 typedef void (SmiErrorHandler) (char *path, int line, int severity, char *msg, char *tag);
392 extern void smiSetErrorHandler(SmiErrorHandler smiErrorHandler);
395 extern SmiModule *smiGetModule(const char *module);
397 extern SmiModule *smiGetFirstModule(void);
399 extern SmiModule *smiGetNextModule(SmiModule *smiModulePtr);
401 extern SmiNode *smiGetModuleIdentityNode(SmiModule *smiModulePtr);
403 extern SmiImport *smiGetFirstImport(SmiModule *smiModulePtr);
405 extern SmiImport *smiGetNextImport(SmiImport *smiImportPtr);
407 extern int smiIsImported(SmiModule *smiModulePtr,
408 SmiModule *importedModulePtr, char *importedName);
410 extern SmiRevision *smiGetFirstRevision(SmiModule *smiModulePtr);
412 extern SmiRevision *smiGetNextRevision(SmiRevision *smiRevisionPtr);
414 extern int smiGetRevisionLine(SmiRevision *smiRevisionPtr);
418 extern SmiIdentity *smiGetFirstIdentity(SmiModule *smiModulePtr);
420 extern SmiIdentity *smiGetNextIdentity(SmiIdentity *smiIdentityPtr);
422 extern SmiIdentity *smiGetParentIdentity(SmiIdentity *smiIdentityPtr);
424 extern int smiGetIdentityLine(SmiIdentity *smiIdentityPtr);
426 extern SmiModule *smiGetIdentityModule(SmiIdentity *smiIdentityPtr);
428 extern SmiIdentity *smiGetIdentity(SmiModule *smiModulePtr,char *identity);
432 extern SmiType *smiGetType(SmiModule *smiModulePtr, char *type);
434 extern SmiType *smiGetFirstType(SmiModule *smiModulePtr);
436 extern SmiType *smiGetNextType(SmiType *smiTypePtr);
438 extern SmiType *smiGetParentType(SmiType *smiTypePtr);
440 extern SmiModule *smiGetTypeModule(SmiType *smiTypePtr);
442 extern int smiGetTypeLine(SmiType *smiTypePtr);
444 extern SmiRange *smiGetFirstRange(SmiType *smiTypePtr);
446 extern SmiRange *smiGetNextRange(SmiRange *smiRangePtr);
448 extern int smiGetMinMaxRange(SmiType *smiType, SmiValue *min, SmiValue *max);
450 extern SmiNamedNumber *smiGetFirstNamedNumber(SmiType *smiTypePtr);
452 extern SmiNamedNumber *smiGetNextNamedNumber(SmiNamedNumber
456 extern SmiClass *smiGetFirstClass(SmiModule *smiModulePtr);
458 extern SmiClass *smiGetNextClass(SmiClass *smiClassPtr);
460 extern SmiClass *smiGetParentClass(SmiClass *smiClassPtr);
462 extern SmiModule *smiGetClassModule(SmiClass *smiClassPtr);
464 extern SmiClass *smiGetClass(SmiModule *smiModulePtr,char *class);
466 extern int smiGetClassLine(SmiClass *smiClassPtr);
470 extern SmiAttribute *smiGetAttribute(SmiClass *smiClassPtr, char *attribute);
472 extern SmiAttribute *smiGetFirstAttribute(SmiClass *smiClassPtr);
474 extern SmiAttribute *smiGetNextAttribute(SmiAttribute *smiAtrributePtr);
476 extern SmiType *smiGetAttributeParentType(SmiAttribute *smiAtrributePtr);
478 extern SmiClass *smiGetAttributeParentClass(SmiAttribute *smiAtrributePtr);
480 extern SmiAttribute *smiGetFirstUniqueAttribute(SmiClass *smiClassPtr);
482 extern SmiAttribute *smiGetNextUniqueAttribute(SmiAttribute *smiTypePtr);
484 extern int smiIsClassScalar(SmiClass *smiClassPtr);
486 extern SmiNamedNumber *smiGetAttributeFirstNamedNumber(SmiAttribute *smiAttributePtr);
488 extern SmiNamedNumber *smiGetAttributeNextNamedNumber(SmiNamedNumber
490 extern SmiRange *smiGetAttributeFirstRange(SmiAttribute *smiAttributePtr);
492 extern SmiRange *smiGetAttributeNextRange(SmiRange *smiRangePtr);
494 extern int smiGetAttributeLine(SmiAttribute *smiAttributePtr);
497 extern SmiEvent *smiGetEvent(SmiClass *smiClassPtr, char *attribute);
499 extern SmiEvent *smiGetFirstEvent(SmiClass *smiClassPtr);
501 extern SmiEvent *smiGetNextEvent(SmiEvent *smiEventPtr);
503 extern int smiGetEventLine(SmiEvent *smiEventPtr);
506 extern SmiMacro *smiGetMacro(SmiModule *smiModulePtr, char *macro);
508 extern SmiMacro *smiGetFirstMacro(SmiModule *smiModulePtr);
510 extern SmiMacro *smiGetNextMacro(SmiMacro *smiMacroPtr);
512 extern SmiModule *smiGetMacroModule(SmiMacro *smiMacroPtr);
514 extern int smiGetMacroLine(SmiMacro *smiMacroPtr);
517 extern SmiNode *smiGetNode(SmiModule *smiModulePtr, const char *name);
519 extern SmiNode *smiGetNodeByOID(unsigned int oidlen, SmiSubid oid[]);
521 extern SmiNode *smiGetFirstNode(SmiModule *smiModulePtr, SmiNodekind nodekind);
523 extern SmiNode *smiGetNextNode(SmiNode *smiNodePtr, SmiNodekind nodekind);
525 extern SmiNode *smiGetParentNode(SmiNode *smiNodePtr);
527 extern SmiNode *smiGetRelatedNode(SmiNode *smiNodePtr);
529 extern SmiNode *smiGetFirstChildNode(SmiNode *smiNodePtr);
531 extern SmiNode *smiGetNextChildNode(SmiNode *smiNodePtr);
533 extern SmiModule *smiGetNodeModule(SmiNode *smiNodePtr);
535 extern SmiType *smiGetNodeType(SmiNode *smiNodePtr);
537 extern int smiGetNodeLine(SmiNode *smiNodePtr);
542 extern SmiElement *smiGetFirstElement(SmiNode *smiNodePtr);
544 extern SmiElement *smiGetNextElement(SmiElement *smiElementPtr);
546 extern SmiNode *smiGetElementNode(SmiElement *smiElementPtr);
550 extern SmiOption *smiGetFirstOption(SmiNode *smiComplianceNodePtr);
552 extern SmiOption *smiGetNextOption(SmiOption *smiOptionPtr);
554 extern SmiNode *smiGetOptionNode(SmiOption *smiOptionPtr);
556 extern int smiGetOptionLine(SmiOption *smiOptionPtr);
559 extern SmiRefinement *smiGetFirstRefinement(SmiNode *smiComplianceNodePtr);
561 extern SmiRefinement *smiGetNextRefinement(SmiRefinement *smiRefinementPtr);
563 extern SmiNode *smiGetRefinementNode(SmiRefinement *smiRefinementPtr);
565 extern SmiType *smiGetRefinementType(SmiRefinement *smiRefinementPtr);
567 extern SmiType *smiGetRefinementWriteType(SmiRefinement *smiRefinementPtr);
569 extern int smiGetRefinementLine(SmiRefinement *smiRefinementPtr);
572 extern SmiElement *smiGetFirstUniquenessElement(SmiNode *smiNodePtr);
574 #define smiGetNextUniquenessElement(p) smiGetNextElement(p)
576 extern char *smiRenderOID(unsigned int oidlen, SmiSubid *oid, int flags);
578 extern char *smiRenderValue(SmiValue *smiValuePtr, SmiType *smiTypePtr,
581 extern char *smiRenderNode(SmiNode *smiNodePtr, int flags);
583 extern char *smiRenderType(SmiType *smiTypePtr, int flags);
585 #define SMI_RENDER_NUMERIC 0x01 /* render as numeric values */
586 #define SMI_RENDER_NAME 0x02 /* render as names */
587 #define SMI_RENDER_QUALIFIED 0x04 /* render names with module prefix */
588 #define SMI_RENDER_FORMAT 0x08 /* render by applying the type's format if
589 type is given and format is present */
590 #define SMI_RENDER_PRINTABLE 0x10 /* render string values as a printable
591 string if all octets are isprint() */
592 #define SMI_RENDER_UNKNOWN 0x20 /* render even unknown items as strings
593 ("<unknown>") so that we never get NULL */
594 #define SMI_RENDER_ALL 0xff /* render as `human friendly' as possible */
596 #define SMI_UNKNOWN_LABEL "<unknown>"
600 * The functions smiGetMaxSize() and smiGetMinSize() compute the
601 * max size constraint on a given BITS, OCTET STRING or OBJECT
602 * IDENTIFIER type. The functions recurse towards the top of the
603 * type derivation tree.
606 extern unsigned int smiGetMinSize(SmiType *smiType);
607 extern unsigned int smiGetMaxSize(SmiType *smiType);
610 * Two utility functions to pack and unpack instance identifiers.
611 * The smiUnpack() function allocates the array of SmiValues and
612 * the smiPack() function allocates the array of SmiSubids.
615 extern int smiUnpack(SmiNode *row, SmiSubid *oid, unsigned int oidlen,
616 SmiValue **vals, int *valslen);
618 extern int smiPack(SmiNode *row, SmiValue *vals, int valslen,
619 SmiSubid **oid, unsigned int *oidlen);
622 * Two printf functions that allocate memory dynamically. The call has
623 * to free the allocated memory.
626 extern int smiAsprintf(char **strp, const char *format, ...);
628 extern int smiVasprintf(char **strp, const char *format, va_list ap);
632 * The functions smiMalloc() and friends are used within the library
633 * for all memory allocations and deallocations. These functions are
634 * simple wrappers around the standard malloc() and friends functions,
635 * sometimes with some additional checking. We export these functions
636 * because on some systems (e.g. Windows) it is necessary to allocate
637 * / deallocate memory with the 'right' version of malloc() and
641 #ifdef HAVE_DMALLOC_H
643 extern void *_smiMalloc(char *, int, size_t);
644 extern void *_smiRealloc(char *, int, void *ptr, size_t size);
645 extern char *_smiStrdup(char *, int, const char *s1);
646 extern char *_smiStrndup(char *, int, const char *s1, size_t n);
647 extern void _smiFree(char *, int, void *ptr);
649 #define smiMalloc(s) _smiMalloc(__FILE__, __LINE__, s)
650 #define smiRealloc(p,s) _smiRealloc(__FILE__, __LINE__, p, s)
651 #define smiStrdup(s) _smiStrdup(__FILE__, __LINE__, s)
652 #define smiStrndup(s,n) _smiStrndup(__FILE__, __LINE__, s, n)
653 #define smiFree(p) _smiFree(__FILE__, __LINE__, p)
656 extern void *smiMalloc(size_t size);
657 extern void *smiRealloc(void *ptr, size_t size);
658 extern char *smiStrdup(const char *s1);
659 extern char *smiStrndup(const char *s1, size_t n);
660 extern void smiFree(void *ptr);