1 /*
2  * data.h --
3  *
4  *      Definitions for the main data structures.
5  *
6  * Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
7  *
8  * See the file "COPYING" for information on usage and redistribution
9  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
10  *
11  * @(#) $Id: data.h 7966 2008-03-27 21:25:52Z schoenw $
12  */
13 
14 #ifndef _DATA_H
15 #define _DATA_H
16 
17 
18 #include <stdio.h>
19 
20 #include "smi.h"
21 
22 
23 
24 typedef struct List {
25     SmiElement      export;
26     void	    *ptr;
27     struct List	    *nextPtr;
28 } List;
29 
30 typedef enum Kind {
31     KIND_UNKNOWN	 = 0 ,  /*					     */
32     KIND_MODULE		 = 1 ,  /*					     */
33     KIND_MACRO		 = 2 ,  /*					     */
34     KIND_TYPE		 = 3 ,  /*					     */
35     KIND_OBJECT		 = 4 ,  /*					     */
36     KIND_IMPORT		 = 5 ,  /* descriptors to be imported.               */
37     KIND_IMPORTED	 = 6 ,  /* imported descriptor. syntax `mod.descr'.  */
38     KIND_NOTFOUND	 = 7    /* to be imported, but not found             */
39 } Kind;
40 #define NUM_KINDS  7
41 
42 
43 
44 typedef unsigned short ParserFlags;
45 typedef unsigned short ModuleFlags;
46 typedef unsigned short ImportFlags;
47 typedef unsigned short ObjectFlags;
48 typedef unsigned short NodeFlags;
49 typedef unsigned short TypeFlags;
50 typedef unsigned short MacroFlags;
51 
52 #define NODE_FLAG_ROOT		0x0001 /* mark node tree's root */
53 
54 #define FLAG_SEQTYPE		0x0002 /* type is set from SMIv1/2 SEQUENCE. */
55 #define FLAG_REGISTERED		0x0004 /* On an Object: this is registered.  */
56 #define FLAG_INCOMPLETE		0x0008 /* Just defined by a forward          */
57 				       /* referenced type or object.         */
58 #define	FLAG_CREATABLE	        0x0040 /* On a Row: New rows can be created. */
59 #define FLAG_INGROUP		0x0080 /* Node is contained in a group.      */
60 #define	FLAG_INCOMPLIANCE	0x0100 /* Group is mentioned in a compliance
61                                            statement.
62 					   In case of ImportFlags: the import
63 				           is done through a compliance
64 				           MODULE phrase.                    */
65 #define	FLAG_INSYNTAX		0x0200 /* Type is mentioned in a syntax
66                                            statement.                        */
67 
68 
69 typedef struct View {
70     char	    *name;
71     struct View	    *nextPtr;
72     struct View	    *prevPtr;
73 } View;
74 
75 
76 
77 typedef struct Module {
78     SmiModule	    export;
79     time_t	    lastUpdated; /* only for SMIv2 modules */
80     struct Object   *objectPtr;
81     struct Object   *firstObjectPtr;
82     struct Object   *lastObjectPtr;
83     struct Type	    *firstTypePtr;
84     struct Type	    *lastTypePtr;
85     struct Class    *firstClassPtr;
86     struct Class    *lastClassPtr;
87     struct Macro    *firstMacroPtr;
88     struct Macro    *lastMacroPtr;
89     struct Identity *firstIdentityPtr;
90     struct Identity *lastIdentityPtr;
91     struct Import   *firstImportPtr;
92     struct Import   *lastImportPtr;
93     struct Revision *firstRevisionPtr;
94     struct Revision *lastRevisionPtr;
95     ModuleFlags	    flags;
96     int		    numImportedIdentifiers;
97     int		    numStatements;
98     int		    numModuleIdentities;
99     struct Module   *nextPtr;
100     struct Module   *prevPtr;
101     struct Node     *prefixNodePtr;
102 } Module;
103 
104 
105 
106 typedef struct Revision {
107     SmiRevision	    export;
108     Module          *modulePtr;
109     struct Revision *nextPtr;
110     struct Revision *prevPtr;
111     int		    line;
112 } Revision;
113 
114 
115 
116 typedef struct Import {
117     SmiImport      export;
118     Module         *modulePtr;
119     ImportFlags	   flags;
120     struct Import  *nextPtr;
121     struct Import  *prevPtr;
122     Kind	   kind;
123     int		   use;
124     int		   line;
125 } Import;
126 
127 
128 
129 typedef struct NamedNumber {
130     SmiNamedNumber export;
131     struct Type    *typePtr;
132 } NamedNumber;
133 
134 
135 
136 typedef struct Range {
137     SmiRange       export;
138     struct Type    *typePtr;
139 } Range;
140 
141 
142 
143 typedef struct Type {
144     SmiType        export;
145     Module         *modulePtr;
146     struct Type    *parentPtr;
147     struct List    *listPtr;
148     TypeFlags	   flags;
149     struct Type    *nextPtr;
150     struct Type    *prevPtr;
151     int		   line;
152 } Type;
153 
154 
155 
156 typedef struct Option {
157     SmiOption      export;
158     struct Object  *compliancePtr;
159     struct Object  *objectPtr;
160     int		   line;
161 } Option;
162 
163 
164 
165 typedef struct Refinement {
166     SmiRefinement  export;
167     struct Object  *compliancePtr; /* the compl. Object this Ref belongs to  */
168     struct Object  *objectPtr;     /* the Object refined by this Refinement  */
169     Type	   *typePtr;       /* the refined Type (or NULL)             */
170     Type	   *writetypePtr;  /* the refined WriteType (or NULL)        */
171     int		   line;
172 } Refinement;
173 
174 
175 
176 typedef struct Compl {
177     List  *mandatorylistPtr;
178     List  *optionlistPtr;
179     List  *refinementlistPtr;
180 } Compl;
181 
182 
183 
184 typedef struct Index {
185     int	           implied;
186     SmiIndexkind   indexkind;
187     struct List    *listPtr; /* list of index columns (Object *) */
188     struct Object  *rowPtr;  /* a referenced row (e.g. SMIv2 AUGMENTS) */
189 } Index;
190 
191 
192 typedef struct SubjectCategories {
193     struct List *categories;
194     int         allCategories;
195 } SubjectCategories;
196 
197 
198 typedef struct Object {
199     SmiNode        export;
200     Module         *modulePtr;
201     ObjectFlags	   flags;
202     Type	   *typePtr;
203     struct Object  *relatedPtr;         /* a related Object (augmented row) */
204     struct List    *listPtr;	        /* OG, NT, NG, MC */
205     struct List    *optionlistPtr;
206     struct List    *refinementlistPtr;
207     struct Node	   *nodePtr;
208     struct Object  *prevPtr;		/* chain of Objects in this Module */
209     struct Object  *nextPtr;
210     struct Object  *prevSameNodePtr;    /* chain of Objects for this Node  */
211     struct Object  *nextSameNodePtr;
212     struct List    *uniquenessPtr;      /* UNIQUENESS */
213     int		   line;
214 } Object;
215 
216 
217 
218 typedef struct Node {
219     SmiSubid	   subid;
220     NodeFlags	   flags;
221     int            oidlen;
222     SmiSubid       *oid;
223     struct Node	   *parentPtr;
224     struct Node	   *nextPtr;
225     struct Node	   *prevPtr;
226     struct Node	   *firstChildPtr;
227     struct Node	   *lastChildPtr;
228     Object	   *firstObjectPtr;
229     Object	   *lastObjectPtr;
230 } Node;
231 
232 
233 
234 typedef struct Macro {
235     SmiMacro	   export;
236     Module	   *modulePtr;
237     MacroFlags	   flags;
238     struct Macro   *nextPtr;
239     struct Macro   *prevPtr;
240     int		   line;
241 } Macro;
242 
243 typedef struct Identity {
244     SmiIdentity	   	export;
245     Module	   	*modulePtr;
246     struct Identity	*parentPtr;
247     struct Identity   	*nextPtr;
248     struct Identity  	*prevPtr;
249     int		  	line;
250 } Identity;
251 
252 typedef struct Class {
253     SmiClass	    	export;
254     Module         	*modulePtr;
255     struct Attribute	*firstAttributePtr;
256     struct Attribute   	*lastAttributePtr;
257     struct List		*uniqueList;
258     struct Event	*firstEventPtr;
259     struct Event   	*lastEventPtr;
260     struct Class	*parentPtr;
261     struct Class   	*nextPtr;
262     struct Class  	*prevPtr;
263     int		  	line;
264 } Class;
265 /*NOTE: if first element of uniqueList points
266 	to current class that is class->uniqueList-> = class;
267 	the class is scalar. If uniqueList = NULL; it is not
268 	meant to be instatiated directly. Otherwise it contains
269 	list of pointers to the class unique attributes.
270 */
271 
272 
273 typedef struct Attribute {
274     SmiAttribute 	export;
275     Class          	*classPtr;
276     struct Type    	*parentTypePtr;
277     struct List    	*listPtr;
278     struct Attribute    *nextPtr;
279     struct Attribute	*prevPtr;
280     int		   	line;
281     struct Class	*parentClassPtr;
282 } Attribute;
283 
284 typedef struct Event {
285     SmiEvent	   	export;
286     Class          	*classPtr;
287     struct Event   	*nextPtr;
288     struct Event  	*prevPtr;
289     int		  	line;
290 } Event;
291 
292 
293 
294 
295 typedef struct Parser {
296     char	   *path;
297     FILE	   *file;
298     int		   line;
299     int		   lcline;		/* for SMI comment warning */
300     Module	   *modulePtr;
301     ParserFlags	   flags;
302     List	   *firstIndexlabelPtr; /* only for the SMIng parser */
303     char	   *identityObjectName; /* only for the SMIng parser */
304     Module         *complianceModulePtr;
305     Module         *capabilitiesModulePtr;
306     Node	   *parentNodePtr;
307     int            currentDecl;
308     int            firstStatementLine;
309     int            firstNestedStatementLine;
310     int	           firstRevisionLine;
311     Node     	    *pendingNodePtr;
312 } Parser;
313 
314 
315 
316 typedef struct Handle {
317     char            *name;
318     struct Handle   *prevPtr;
319     struct Handle   *nextPtr;
320     View     	    *firstViewPtr;
321     View     	    *lastViewPtr;
322     Module   	    *firstModulePtr;
323     Module   	    *lastModulePtr;
324     Node     	    *rootNodePtr;
325     Type     	    *typeOctetStringPtr;
326     Type     	    *typeObjectIdentifierPtr;
327     Type     	    *typeInteger32Ptr;
328     Type     	    *typeUnsigned32Ptr;
329     Type     	    *typeInteger64Ptr;
330     Type     	    *typeUnsigned64Ptr;
331     Type     	    *typeFloat32Ptr;
332     Type     	    *typeFloat64Ptr;
333     Type     	    *typeFloat128Ptr;
334     Type     	    *typeEnumPtr;
335     Type     	    *typeBitsPtr;
336     Type			*typePointerPtr;
337     int	     	    flags;
338     char     	    *path;
339     char     	    *cache;
340     char     	    *cacheProg;
341     int      	    errorLevel;
342     SmiErrorHandler *errorHandler;
343     Parser          *parserPtr;
344 } Handle;
345 
346 
347 
348 extern int	 smiDepth;	/* SMI parser recursion depth */
349 
350 extern Handle    *smiHandle;    /* The current handle */
351 
352 
353 
354 extern Handle *addHandle(const char *name);
355 
356 extern void removeHandle(Handle *handlePtr);
357 
358 extern Handle *findHandleByName(const char *name);
359 
360 
361 
362 extern View *addView(const char *modulename);
363 
364 extern int isInView(const char *modulename);
365 
366 
367 
368 extern Module *addModule(char *modulename,
369 			 char *path,
370 			 ModuleFlags flags,
371 			 Parser *parserPtr);
372 
373 extern void setModuleIdentityObject(Module *modulePtr,
374 				    Object *objectPtr);
375 
376 extern void setModuleLastUpdated(Module *modulePtr,
377 				 time_t lastUpdated);
378 
379 extern void setModuleOrganization(Module *modulePtr,
380 				  char *organization);
381 
382 extern void setModuleContactInfo(Module *modulePtr,
383 				 char *contactinfo);
384 
385 extern void setModuleDescription(Module *modulePtr,
386 				 char *description,
387 				 Parser *parserPtr);
388 
389 extern void setModuleReference(Module *modulePtr,
390 			       char *reference,
391 			       Parser *parserPtr);
392 
393 extern Module *findModuleByName(const char *modulename);
394 
395 
396 
397 extern Revision *addRevision(time_t date,
398 			     char *description,
399 			     Parser *parserPtr);
400 
401 extern void setRevisionLine(Revision *revisionPtr,
402 			    int line,
403 			    Parser *parserPtr);
404 
405 
406 
407 extern Import *addImport(char *name,
408 			 Parser *parserPtr);
409 
410 extern void addImportFlags(Import *importPtr, ImportFlags flags);
411 
412 extern void setImportModulename(Import *importPtr,
413 				char *modulename);
414 
415 extern int checkImports(Module *modulePtr,
416 			Parser *parserPtr);
417 
418 extern Import *findImportByName(const char *name,
419 				Module *modulePtr);
420 
421 extern Import *findImportByModulenameAndName(const char *modulename,
422 					     const char *name,
423 					     Module *modulePtr);
424 
425 extern Object *addObject(char *objectname,
426 			 Node *parentNodePtr,
427 			 SmiSubid subid,
428 			 ObjectFlags flags,
429 			 Parser *parserPtr);
430 
431 extern Object *duplicateObject(Object *templatePtr,
432 			       ObjectFlags flags,
433 			       Parser *parserPtr);
434 
435 extern Node *addNode(Node *parentNodePtr,
436 		     SmiSubid subid,
437 		     NodeFlags flags,
438 		     Parser *parserPtr);
439 
440 extern Node *createNodes(unsigned int oidlen, SmiSubid *oid);
441 
442 extern Node *createNodesByOidString(const char *oid);
443 
444 extern Node *getParentNode(Node *nodePtr);
445 
446 /*
447  * setObjectName() might relink MIB tree object structures. If the
448  * current objectPtr is to be used after the call, it should look like
449  *   objectPtr = setObjectName(objectPtr, name);
450  */
451 extern Object *setObjectName(Object *objectPtr,
452 			     char *name, Parser *parserPtr);
453 
454 extern void setObjectType(Object *objectPtr,
455 			  Type *typePtr);
456 
457 extern void setObjectAccess(Object *objectPtr,
458 			    SmiAccess access);
459 
460 extern void setObjectStatus(Object *objectPtr,
461 			    SmiStatus status);
462 
463 extern void setObjectDescription(Object *objectPtr,
464 				 char *description,
465 				 Parser *parserPtr);
466 
467 extern void setObjectReference(Object *objectPtr,
468 			       char *reference,
469 			       Parser *parserPtr);
470 
471 extern void setObjectDecl(Object *objectPtr,
472 			   SmiDecl decl);
473 
474 extern void setObjectUniqueness(Object *objectPtr, List *listPtr);
475 
476 extern void setObjectInstallErrors(Object *objectPtr, List *listPtr);
477 
478 extern void setObjectLine(Object *objectPtr,
479 			  int line,
480 			  Parser *parserPtr);
481 
482 extern void setObjectNodekind(Object *objectPtr,
483 			      SmiNodekind nodekind);
484 
485 extern void addObjectFlags(Object *objectPtr,
486 			   ObjectFlags flags);
487 
488 extern void deleteObjectFlags(Object *objectPtr,
489 			      ObjectFlags flags);
490 
491 extern int checkObjectFlags(Object *objectPtr, ObjectFlags flags);
492 
493 extern void setObjectList(Object *objectPtr,
494 			  struct List *listPtr);
495 
496 extern void setObjectRelated(Object *objectPtr,
497 			     Object *relatedPtr);
498 
499 extern void setObjectImplied(Object *objectPtr,
500 			     int implied);
501 
502 extern void setObjectCreate(Object *objectPtr,
503 			    int create);
504 
505 extern void setObjectIndexkind(Object *objectPtr,
506 			       SmiIndexkind indexkind);
507 
508 extern void setObjectIndex(Object *objectPtr,
509 			   Index *indexPtr);
510 
511 extern void setObjectFormat(Object *objectPtr,
512 			    char *format);
513 
514 extern void setObjectUnits(Object *objectPtr,
515 			   char *units);
516 
517 extern void setObjectValue(Object *objectPtr,
518 			   SmiValue *valuePtr);
519 
520 extern Node *findNodeByParentAndSubid(Node *parentNodePtr,
521 				      SmiSubid subid);
522 
523 extern Node *findNodeByOid(unsigned int oidlen, SmiSubid *oid);
524 
525 extern Node *findNodeByOidString(char *oid);
526 
527 extern Object *findObjectByNode(Node *nodePtr);
528 
529 extern Object *findObjectByModuleAndNode(Module *modulePtr,
530 					 Node *nodePtr);
531 
532 extern Object *findObjectByModulenameAndNode(const char *modulename,
533 					     Node *nodePtr);
534 
535 extern Object *findObjectByName(const char *objectname);
536 
537 extern Object *findNextObjectByName(const char *objectname,
538 				    Object *prevObjectPtr);
539 
540 extern Object *findObjectByModuleAndName(Module *modulePtr,
541 					 const char *objectname);
542 
543 extern Object *findObjectByModulenameAndName(const char *modulename,
544 					     const char *objectname);
545 
546 
547 
548 extern Type *addType(char *type_name,
549 		     SmiBasetype basetype,
550 		     TypeFlags flags,
551 		     Parser *parserPtr);
552 
553 extern Type *duplicateType(Type *templatePtr,
554 			   TypeFlags flags,
555 			   Parser *parserPtr);
556 
557 extern Type *setTypeName(Type *typePtr,
558 			 char *name);
559 
560 extern void setTypeStatus(Type *typePtr,
561 			  SmiStatus status);
562 
563 extern void setTypeBasetype(Type *typePtr,
564 			  SmiBasetype basetype);
565 
566 extern void setTypeParent(Type *typePtr,
567 			  Type *parentPtr);
568 
569 extern void setTypeList(Type *typePtr,
570 			struct List *listPtr);
571 
572 extern void setTypeDescription(Type *typePtr,
573 			       char *description,
574 			       Parser *parserPtr);
575 
576 extern void setTypeReference(Type *typePtr,
577 			     char *reference,
578 			     Parser *parserPtr);
579 
580 extern void setTypeDecl(Type *typePtr,
581 			SmiDecl decl);
582 
583 extern void setTypeLine(Type *typePtr,
584 			int line,
585 			Parser *parserPtr);
586 
587 extern void addTypeFlags(Type *typePtr,
588 			 TypeFlags flags);
589 
590 extern void deleteTypeFlags(Type *typePtr,
591 			    TypeFlags flags);
592 
593 extern void setTypeFormat(Type *typePtr,
594 			  char *format);
595 
596 extern void setTypeUnits(Type *typePtr,
597 			 char *units);
598 
599 extern void setTypeValue(Type *typePtr,
600 			 SmiValue *valuePtr);
601 
602 
603 
604 extern Type *findTypeByName(const char *type_name);
605 
606 extern Type *findNextTypeByName(const char *type_name,
607 				Type *prevTypePtr);
608 
609 extern Type *findTypeByModuleAndName(Module *modulePtr,
610 				     const char *type_name);
611 
612 extern Type *findTypeByModulenameAndName(const char *modulename,
613 					 const char *type_name);
614 
615 extern NamedNumber *findTypeNamedNumber(Type *typePtr,
616 					SmiInteger32 number);
617 
618 
619 
620 extern Identity *addIdentity(char *identityname,
621 		             Parser *parserPtr);
622 
623 extern void setIdentityDecl(Identity *identityPtr,
624 			    SmiDecl decl);
625 
626 extern void setIdentityStatus(Identity *identityPtr,
627 			      SmiStatus status);
628 
629 extern void setIdentityDescription(Identity *identityPtr,
630 				   char *description,
631 				   Parser *parserPtr);
632 
633 extern void setIdentityReference(Identity *identityPtr,
634 				 char *reference,
635 				 Parser *parserPtr);
636 
637 extern void setIdentityParent(Identity *identityPtr,
638 			      Identity *parentPtr);
639 
640 extern Identity *findIdentityByName(const char *identityname);
641 
642 extern Identity *findIdentityByModuleAndName(Module *modulePtr,
643 					     const char *identityname);
644 
645 extern Identity *findIdentityByModulenameAndName(const char *modulename,
646 						 const char *identity_name);
647 
648 
649 
650 
651 extern Class *addClass(char *classname,
652 		       Parser *parserPtr);
653 
654 extern void setClassDecl(Class *classPtr,
655 			 SmiDecl decl);
656 
657 extern void setClassStatus(Class *classPtr,
658 			   SmiStatus status);
659 
660 extern void setClassDescription(Class *classPtr,
661 				char *description,
662 				Parser *parserPtr);
663 
664 extern void setClassReference(Class *classPtr,
665 			      char *reference,
666 			      Parser *parserPtr);
667 
668 extern Class *findClassByModuleAndName(Module *modulePtr, char *name);
669 
670 extern Class *findClassByModulenameAndName(const char *modulename,
671 					   const char *class_name);
672 
673 
674 
675 extern Attribute *duplicateTypeToAttribute(Type *templatePtr,
676 					   Class *classPtr, Parser *parserPtr);
677 
678 extern Attribute *addAttribute(char *attribute_name,
679 			       Class *classPtr, Parser *parserPtr);
680 
681 extern void setAttributeName(Attribute *attributePtr, char *name);
682 
683 extern void setAttributeDecl(Attribute *attributePtr,
684 			     SmiDecl decl);
685 
686 extern void setAttributeStatus(Attribute *attributePtr,
687 			       SmiStatus status);
688 
689 extern void setAttributeDescription(Attribute *attributePtr,
690 				    char *description);
691 
692 extern void setAttributeReference(Attribute *attributePtr,
693 				  char *reference);
694 
695 extern void setAttributeAccess(Attribute *attributePtr,SmiAccess access);
696 
697 extern void setAttributeParentType(Attribute *attributePtr,
698 				   Type *parentPtr);
699 
700 extern void setAttributeParentClass(Attribute *attributePtr,
701 				    Class *parentPtr);
702 
703 extern void setAttributeList(Attribute *attributePtr, List *listPtr);
704 
705 
706 extern Event *addEvent(char *eventname, Class *classPtr,
707 		       Parser *parserPtr);
708 
709 
710 extern Macro *addMacro(char *macroname,
711 		       MacroFlags flags,
712 		       Parser *parserPtr);
713 
714 extern void setMacroStatus(Macro *macroPtr,
715 			   SmiStatus status);
716 
717 extern void setMacroDescription(Macro *macroPtr,
718 				char *description,
719 				Parser *parserPtr);
720 
721 extern void setMacroReference(Macro *macroPtr,
722 			      char *reference,
723 			      Parser *parserPtr);
724 
725 extern void setMacroDecl(Macro *macroPtr,
726 			 SmiDecl decl);
727 
728 extern void setMacroAbnf(Macro *macroPtr,
729 			 char *abnf,
730 			 Parser *parserPtr);
731 
732 extern void setMacroLine(Macro *macroPtr,
733 			 int line,
734 			 Parser *parserPtr);
735 
736 extern Macro *findMacroByName(const char *macroname);
737 
738 extern Macro *findMacroByModuleAndName(Module *modulePtr,
739 				       const char *macroname);
740 
741 extern Macro *findMacroByModulenameAndName(const char *modulename,
742 					   const char *macroname);
743 
744 
745 extern NamedNumber *findNamedNumberByName(Type *typePtr,
746 					  const char *name);
747 
748 
749 
750 extern int smiInitData(void);
751 
752 extern void smiFreeData(void);
753 
754 extern Module *loadModule(const char *modulename, Parser *parserPtr);
755 
756 
757 #endif /* _DATA_H */
758