|
|
1.1 root 1: /* oid.c - Object Identifier routines */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/oid.c,v 7.3 90/07/09 14:34:50 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/dsap/common/RCS/oid.c,v 7.3 90/07/09 14:34:50 mrose Exp $
9: *
10: *
11: * $Log: oid.c,v $
12: * Revision 7.3 90/07/09 14:34:50 mrose
13: * sync
14: *
15: * Revision 7.2 90/04/18 08:50:05 mrose
16: * 6.2
17: *
18: * Revision 7.1 89/12/19 16:19:25 mrose
19: * sync
20: *
21: * Revision 7.0 89/11/23 21:42:32 mrose
22: * Release 6.0
23: *
24: */
25:
26: /*
27: * NOTICE
28: *
29: * Acquisition, use, and distribution of this module and related
30: * materials are subject to the restrictions of a license agreement.
31: * Consult the Preface in the User's Manual for the full terms of
32: * this agreement.
33: *
34: */
35:
36:
37: /* LINTLIBRARY */
38:
39: #include "quipu/util.h"
40: #include "quipu/entry.h"
41: #include "cmd_srch.h"
42: #include "tailor.h"
43:
44: extern char chrcnv [];
45:
46: extern LLog * log_dsap;
47:
48: FILE * f_table;
49:
50: static char * get_entry ();
51: static add_entry ();
52: char * get_oid();
53: static char * name2gen ();
54: add_entry_aux ();
55:
56: oid_table OIDTable [TABLESIZE];
57: oid_table_attr attrOIDTable [TABLESIZE];
58: objectclass ocOIDTable [TABLESIZE];
59:
60:
61: int NumEntries = 0;
62: int attrNumEntries = 0;
63: int ocNumEntries = 0;
64:
65: unsigned attr_index = 0;
66:
67: #define GEN 1
68: #define ATTR 2
69: #define OC 3
70:
71:
72: #define PBUCKETS 128
73: #define PHASH(nm) \
74: (((nm)[1]) ? (((chrcnv[((nm)[0])] - chrcnv[((nm)[1])]) & 0x1f) + ((chrcnv[(nm)[2]]) & 0x5f)) \
75: : (chrcnv[(nm)[0]]) & 0x7f)
76:
77: struct pair {
78: char *p_name;
79: caddr_t p_value;
80: int p_type;
81: struct pair *p_chain;
82: };
83:
84: struct aliases {
85: char * a_full;
86: char * a_alias;
87: };
88:
89: static struct aliases Palias[LOTS];
90: static int Palias_next = 0;
91: static struct pair *Pbuckets[PBUCKETS];
92:
93: IFP oc_load = NULLIFP;
94: IFP oc_macro_add = NULLIFP;
95:
96: load_oid_table (table)
97: char * table;
98: {
99: register char * name;
100: char filename [FILNSIZE];
101: register char * extension;
102: char *isodetable;
103:
104: if (NumEntries != 0)
105: return; /* already loaded */
106:
107: isodetable = isodefile(table, 0);
108:
109: (void) strcpy (filename,isodetable);
110: extension = &filename[strlen(isodetable)];
111:
112: (void) strcpy (extension,".gen");
113: if (( f_table = fopen (filename,"r")) == (FILE *) NULL) {
114: LLOG (log_dsap,LLOG_FATAL,("file %s",filename));
115: fatal (-91,"Can't open oidtable.gen");
116: }
117:
118: while (1) { /* break out */
119: if ( (name = get_entry ()) == NULLCP)
120: break;
121: add_entry (name,GEN);
122: }
123: (void) fclose (f_table);
124:
125: (void) strcpy (extension,".at");
126: if (( f_table = fopen (filename,"r")) == (FILE *) NULL) {
127: LLOG (log_dsap,LLOG_FATAL,("file %s",filename));
128: fatal (-92,"Can't open oidtable.at");
129: }
130:
131: while (1) { /* break out */
132: if ( (name = get_entry ()) == NULLCP)
133: break;
134: add_entry (name,ATTR);
135: }
136: (void) fclose (f_table);
137:
138: (void) strcpy (extension,".oc");
139: if (( f_table = fopen (filename,"r")) == (FILE *) NULL) {
140: LLOG (log_dsap,LLOG_FATAL,("file %s",filename));
141: fatal (-93,"Can't open oidtable.oc");
142: }
143:
144: while (1) { /* break out */
145: if ( (name = get_entry ()) == NULLCP)
146: break;
147: add_entry (name,OC);
148: }
149: (void) fclose (f_table);
150:
151: }
152:
153: add_entry_aux (a,b,c,d)
154: char * a;
155: caddr_t b;
156: int c;
157: char * d;
158: {
159: int i;
160: register struct pair *p;
161:
162: if ((p = (struct pair *) calloc (1, sizeof *p)) == NULL) {
163: SLOG (log_dsap, LLOG_EXCEPTIONS, NULLCP,
164: ("calloc of alias structure failed"));
165: return;
166: }
167:
168: p -> p_name = a;
169: p -> p_value = b;
170: p -> p_type = c;
171: p -> p_chain = Pbuckets[i = PHASH (p -> p_name)];
172: Pbuckets[i] = p;
173:
174: if (d != NULLCP) {
175: if ((p = (struct pair *) calloc (1, sizeof *p)) == NULL) {
176: SLOG (log_dsap, LLOG_EXCEPTIONS, NULLCP,
177: ("calloc of alias (2) structure failed"));
178: return;
179: }
180:
181: Palias[Palias_next].a_full = a;
182: Palias[Palias_next++].a_alias = d;
183:
184: p -> p_name = d;
185: p -> p_value = b;
186: p -> p_type = c;
187: p -> p_chain = Pbuckets[i = PHASH (p -> p_name)];
188: Pbuckets[i] = p;
189: }
190:
191: }
192:
193:
194: static add_entry (newname,towho)
195: char * newname;
196: int towho;
197: {
198: register char *nptr, *ptr, *sep;
199: OID oid;
200: oid_table * Current;
201: char * alias = NULLCP;
202:
203: if ((nptr = index (newname,SEPERATOR)) == 0) {
204: LLOG (log_dsap,LLOG_FATAL,("oid missing in %s",newname));
205: return;
206: }
207: *nptr = 0;
208: if ((sep = index (newname,COMMA)) != 0) {
209: *sep++ = 0;
210: alias = strdup(newname);
211: newname = sep;
212: }
213:
214: switch (towho) {
215: case GEN:
216: Current = &OIDTable[NumEntries];
217: (void) strcpy (Current->ot_name, newname);
218: add_entry_aux (Current->ot_name,(caddr_t)&OIDTable[NumEntries],GEN,alias);
219: break;
220: case ATTR:
221: Current = &attrOIDTable[attrNumEntries].oa_ot;
222: (void) strcpy (Current->ot_name, newname);
223: add_entry_aux (Current->ot_name,(caddr_t)&attrOIDTable[attrNumEntries],ATTR,alias);
224: break;
225: case OC:
226: Current = &ocOIDTable[ocNumEntries].oc_ot;
227: (void) strcpy (Current->ot_name, newname);
228: add_entry_aux (Current->ot_name,(caddr_t)&ocOIDTable[ocNumEntries],OC,alias);
229: break;
230: }
231: *nptr = SEPERATOR;
232: nptr++;
233:
234: if ((sep = index (nptr,SEPERATOR)) != 0)
235: *sep++ = 0;
236:
237: ptr = get_oid (nptr);
238: if (ptr == NULLCP) {
239: LLOG (log_dsap,LLOG_FATAL,("invalid oid '%s'",nptr));
240: return;
241: }
242: (void) strcpy (Current->ot_stroid,ptr);
243:
244: oid = str2oid (Current->ot_stroid);
245: if (oid == NULLOID)
246: Current->ot_oid = NULLOID;
247: /* only reason for failure is generic oid of length 1 */
248: else
249: Current->ot_oid = oid_cpy (oid);
250:
251: /* now do special work for at and oc types */
252: switch (towho) {
253: case GEN:
254: NumEntries++; /* nothing else to do */
255: break;
256: case ATTR:
257: if (sep == 0)
258: LLOG (log_dsap,LLOG_FATAL,("syntax missing in %s",newname));
259: else {
260: if (( ptr = index (sep,SEPERATOR)) != NULLCP) {
261: *ptr++ = 0;
262: if (lexequ (ptr,"FILE") != 0)
263: LLOG (log_dsap,LLOG_FATAL,("FILE syntax expected, '%s' found",ptr));
264: else {
265: attrOIDTable[attrNumEntries].oa_syntax = str2syntax(sep);
266: attrOIDTable[attrNumEntries].oa_syntax += AV_WRITE_FILE;
267: attrNumEntries++;
268: }
269: } else {
270: attrOIDTable[attrNumEntries].oa_syntax = str2syntax(sep);
271: attrNumEntries++;
272: }
273: }
274: break;
275: case OC:
276: if (oc_load != NULLIFP) {
277: if ((*oc_load)(sep,ptr) == OK)
278: ocNumEntries++;
279: }
280: else
281: ocNumEntries++;
282: }
283: return;
284: }
285:
286: char * get_oid (str)
287: char * str;
288: {
289: static char buffer [BUFSIZE];
290: register char * ptr = buffer;
291: register char * dotptr;
292: register char * soid;
293: char deref = FALSE;
294:
295: if ( ! isdigit(*str))
296: if ((dotptr = index (str,DOT)) == 0)
297: return (name2gen(str));
298:
299: while (*str != 0) {
300: if ( (! isdigit (*str)) && (*str != DOT) ) {
301: if ((dotptr = index (str,DOT)) == 0) {
302: *--ptr = 0;
303: return (buffer);
304: }
305: *dotptr = 0;
306: *ptr = 0;
307: if ((soid = name2gen(str)) == NULLCP) {
308: *dotptr = DOT;
309: return (NULLCP);
310: }
311: *dotptr = DOT;
312: str = dotptr;
313: if (deref) {
314: if ((dotptr = rindex (soid,DOT)) == 0)
315: return (NULLCP); /* invalid */
316: if ((strncmp (soid,buffer,strlen(buffer))) != 0)
317: return (NULLCP); /* inconsistent */
318: }
319: deref = TRUE;
320: (void) strcpy (buffer,soid);
321: ptr = buffer + strlen (soid);
322: }
323: else
324: *ptr++ = *str++;
325: }
326:
327: *ptr = 0;
328: return (buffer);
329: }
330:
331: static char * name2gen (nodename)
332: char * nodename;
333: {
334: register int i;
335: register oid_table * tblptr = &OIDTable[0];
336:
337: for (i=0;i<NumEntries;i++,tblptr++) {
338: if (lexequ (tblptr->ot_name, nodename) == 0)
339: return (tblptr->ot_stroid);
340: }
341:
342: return (NULLCP);
343: }
344:
345: static char * soid2gen (soid)
346: char * soid;
347: {
348: register int i;
349: register oid_table * tblptr = &OIDTable[0];
350: for (i=0;i<NumEntries;i++,tblptr++) {
351: if (strcmp (tblptr->ot_stroid, soid) == 0)
352: return (tblptr->ot_name);
353: }
354:
355: return (NULLCP);
356: }
357:
358: static char * get_line ()
359: {
360: static char buffer [LINESIZE];
361: register char * buf = buffer;
362: register char * ptr = buffer;
363: register int done;
364:
365: /* read line, ignore comments, join lines in '/' found */
366:
367: do {
368: done = TRUE;
369: if (fgets (buf,LINESIZE,f_table) == NULLCP)
370: return (NULLCP);
371:
372: StripSpace (buf);
373: if (*buf != 0) {
374: ptr += strlen(buf) - 1;
375: if (*ptr == '\\') {
376: buf = ptr;
377: done = FALSE;
378: }
379: } else
380: done = FALSE;
381: } while (done == FALSE);
382:
383: return (buffer);
384: }
385:
386: static char * get_entry ()
387: {
388: register char * buf;
389: register char * ptr;
390:
391: /* read next line - test for macro defs */
392: while (1) { /* return out */
393: if ((buf = get_line ()) == NULLCP)
394: return (NULLCP);
395:
396: if ((ptr = index (buf,'=')) != 0) {
397: *ptr++ = 0;
398: if (oc_macro_add != NULLIFP) {
399: (*oc_macro_add) (buf,ptr);
400: }
401: } else
402: return (buf);
403:
404: }
405:
406:
407: }
408:
409: oid_table_attr *name2attr(nodename)
410: char * nodename;
411: {
412: register int i;
413: register char * ptr;
414: char * str;
415: register oid_table_attr * atrptr = &attrOIDTable[0];
416:
417: attr_index = 0;
418:
419: if ((ptr = rindex (nodename,DOT)) == 0) {
420: struct pair *p;
421: for (p = Pbuckets[PHASH (nodename)];
422: p && lexequ (p -> p_name, nodename);
423: p = p -> p_chain)
424: ; /* NO-OP */
425:
426: if ((p != NULL) && (p->p_type == ATTR)) {
427: attr_index = ((oid_table_attr *) p->p_value) - atrptr;
428: return ( (oid_table_attr *) p->p_value);
429: } else
430: return (NULLTABLE_ATTR);
431:
432: } else {
433: if ((str = get_oid (nodename)) == NULLCP) {
434: LLOG (log_dsap,LLOG_FATAL,("invalid oid '%s'",nodename));
435: return (NULLTABLE_ATTR);
436: }
437: if (isdigit (*++ptr)) {
438: for (i=0;i<attrNumEntries;i++,atrptr++)
439: if (lexequ (atrptr->oa_ot.ot_stroid, str) == 0) {
440: attr_index = atrptr - &attrOIDTable[0];
441: return (atrptr);
442: }
443: return (NULLTABLE_ATTR);
444: } else {
445: for (i=0;i<attrNumEntries;i++,atrptr++)
446: if (lexequ (atrptr->oa_ot.ot_name, ptr) == 0)
447: if (strncmp (str,atrptr->oa_ot.ot_stroid,strlen(str)) == 0) {
448: attr_index = atrptr - &attrOIDTable[0];
449: return (atrptr);
450: } else
451: return (NULLTABLE_ATTR);
452: }
453: }
454: return (NULLTABLE_ATTR);
455:
456: }
457:
458: set_heap (x)
459: AttributeType x;
460: {
461: if (x == NULLTABLE_ATTR)
462: return 0;
463:
464: return (attr_index = x - &attrOIDTable[0]);
465:
466: }
467:
468: oid_table_attr *oid2attr(oid)
469: OID oid;
470: {
471: register int i;
472: register oid_table_attr * ptr = &attrOIDTable[0];
473:
474: for (i=0;i<attrNumEntries;i++,ptr++) {
475: if (oid_cmp (ptr->oa_ot.ot_oid, oid) == 0)
476: return (ptr);
477: }
478:
479: return (NULLTABLE_ATTR);
480: }
481:
482: objectclass *name2oc(nodename)
483: register char * nodename;
484: {
485: register int i;
486: register char * ptr;
487: char * str;
488: register objectclass * oc = & ocOIDTable[0];
489:
490: if ((ptr = rindex (nodename,DOT)) == 0) {
491: struct pair *p;
492: for (p = Pbuckets[PHASH (nodename)];
493: p && lexequ (p -> p_name, nodename);
494: p = p -> p_chain)
495: ; /* NO-OP */
496:
497: if ((p != NULL) && (p->p_type == OC))
498: return ( (objectclass *) p->p_value);
499: else
500: return (NULLOBJECTCLASS);
501: } else {
502: str = get_oid (nodename);
503: if (isdigit (*++ptr)) {
504: for (i=0;i<ocNumEntries;i++,oc++)
505: if (lexequ (oc->oc_ot.ot_stroid, str) == 0)
506: return (oc);
507: return (NULLOBJECTCLASS);
508: } else {
509: for (i=0;i<ocNumEntries;i++,oc++)
510: if (lexequ (oc->oc_ot.ot_name, ptr) == 0)
511: if (strncmp (str,oc->oc_ot.ot_stroid,strlen(str)) == 0)
512: return (oc);
513: else
514: return (NULLOBJECTCLASS);
515:
516: }
517: }
518:
519: return (NULLOBJECTCLASS);
520: }
521:
522:
523: objectclass *oid2oc(oid)
524: OID oid;
525: {
526: register int i;
527: register objectclass * oc = &ocOIDTable[0];
528:
529: for (i=0;i<ocNumEntries;i++,oc++) {
530: if (oid_cmp (oc->oc_ot.ot_oid, oid) == 0)
531: return (oc);
532: }
533:
534: return (NULLOBJECTCLASS);
535: }
536:
537:
538: static char * full_gen (ot)
539: oid_table * ot;
540: {
541: static char buffer [BUFSIZ];
542: register char * ptr = buffer;
543: register char * soid;
544: register char * str;
545:
546: buffer [0] = '\0';
547: str = sprintoid (ot->ot_oid);
548:
549: soid = str;
550:
551: while (*str != '\0')
552: if ( *str == DOT) {
553: *str = '\0';
554: ptr = soid2gen (soid);
555: if (ptr == NULLCP) {
556: *str++ = DOT;
557: continue;
558: }
559: (void) strcat (buffer,".");
560: (void) strcat (buffer,ptr);
561: *str++ = DOT;
562: } else
563: str++;
564:
565: (void) strcat (buffer,".");
566: (void) strcat (buffer,ot->ot_name);
567: return (&buffer[1]);
568: }
569:
570: static char * part_gen (ot)
571: oid_table * ot;
572: {
573: static char buffer [BUFSIZ];
574: register char * ptr = buffer;
575: register char * soid;
576: register char * str;
577: char * last;
578:
579: if (index (ot->ot_name,DOT) == NULLCP)
580: return (ot->ot_name);
581:
582: str = sprintoid (ot->ot_oid);
583:
584: soid = str;
585: last = str;
586:
587: while (*str != '\0')
588: if ( *str == DOT) {
589: *str = '\0';
590: ptr = soid2gen (soid);
591: if (ptr == NULLCP) {
592: *str++ = DOT;
593: break;
594: } else
595: (void) strcpy (buffer,ptr);
596: last = str;
597: *str++ = DOT;
598:
599: } else
600: str++;
601:
602: (void) strcat (buffer,last);
603: return (buffer);
604: }
605:
606: char *attr2name_aux (oa)
607: register oid_table_attr *oa;
608: {
609: if ( oa != NULLTABLE_ATTR)
610: return (oa->oa_ot.ot_name);
611: else {
612: LLOG (log_dsap,LLOG_EXCEPTIONS,("NULL table entry"));
613: return (NULLCP);
614: }
615: }
616:
617: char *attr2name(oa,format)
618: register oid_table_attr *oa;
619: int format;
620: {
621: int x;
622:
623: if ( oa != NULLTABLE_ATTR)
624: switch (format) {
625: case OIDFULL:
626: return (full_gen (&oa->oa_ot));
627: case OIDNUM:
628: return (oa->oa_ot.ot_stroid);
629: default:
630: /* look for long name */
631: for (x=0; x<Palias_next; x++)
632: if (lexequ (Palias[x].a_full,oa->oa_ot.ot_name) == 0)
633: return (Palias[x].a_alias);
634: return (part_gen (&oa->oa_ot));
635: }
636: else {
637: LLOG (log_dsap,LLOG_EXCEPTIONS,("NULL table entry"));
638: return (NULLCP);
639: }
640: }
641:
642:
643: char *oc2name(oc,format)
644: register objectclass *oc;
645: int format;
646: {
647: if ( oc != NULLOBJECTCLASS)
648: switch (format) {
649: case OIDFULL:
650: return (full_gen (&oc->oc_ot));
651: case OIDNUM:
652: return (oc->oc_ot.ot_stroid);
653: default:
654: return (part_gen (&oc->oc_ot));
655: }
656: else
657: return (NULLCP);
658: }
659:
660: char *oid2name(oid,format)
661: OID oid;
662: int format;
663: {
664: oid_table_attr * at;
665: objectclass * oc;
666: register int i;
667: register oid_table* ptr = &OIDTable[0];
668: char * sptr;
669:
670: /* try attribute first */
671: if (( at = oid2attr (oid)) != NULLTABLE_ATTR)
672: return (attr2name(at,format)) ;
673:
674: /* try objectclass */
675: if (( oc = oid2oc (oid)) != NULLOBJECTCLASS)
676: return (oc2name(oc,format)) ;
677:
678: /* try gen tables */
679: for (i=0; i<NumEntries;i++,ptr++) {
680: if (oid_cmp (ptr->ot_oid, oid) == 0) {
681: switch (format) {
682: case OIDFULL:
683: return (full_gen (ptr));
684: case OIDNUM:
685: return (ptr->ot_stroid);
686: default:
687: return (part_gen (ptr));
688: }
689: }
690: }
691:
692: if ((sptr = oid2ode_aux (oid,0)) == NULLCP)
693: parse_error ("Bad OID '%s'",sprintoid (oid));
694:
695: return (sptr);
696:
697: }
698:
699: OID name2oid (str)
700: register char * str;
701: {
702: register struct pair *p;
703: OID ptr;
704:
705: for (p = Pbuckets[PHASH (str)];
706: p && lexequ (p -> p_name, str);
707: p = p -> p_chain)
708: ; /* NO-OP */
709:
710: if (p != NULL)
711: switch (p -> p_type) {
712: case GEN: {
713: oid_table * ot;
714: ot = (oid_table *) p->p_value;
715: return (oid_cpy(ot->ot_oid));
716: }
717: case ATTR: {
718: oid_table_attr * at;
719: at = (oid_table_attr *) p->p_value;
720: return (oid_cpy(at->oa_ot.ot_oid)) ;
721: }
722: case OC: {
723: objectclass * oc;
724: oc = (objectclass *) p->p_value;
725: return (oid_cpy(oc->oc_ot.ot_oid)) ;
726: }
727: default:
728: if ( (ptr=ode2oid (str)) == NULLOID)
729: return (oid_cpy(str2oid(str)));
730: return (oid_cpy(ptr));
731: }
732: else {
733: /* try general oid lookup */
734: char * x;
735: if ((x=get_oid(str)) != NULLCP)
736: return (oid_cpy(str2oid(x)));
737:
738: /* try isobjects */
739: if ( (ptr=ode2oid (str)) == NULLOID) {
740: if ((ptr=str2oid(str)) == NULLOID) {
741: parse_error ("unknown OID '%s'",str);
742: return NULLOID;
743: }
744: return (oid_cpy(ptr));
745: }
746: return (oid_cpy(ptr));
747: }
748:
749: }
750:
751: PE oid2pe (o)
752: OID o;
753: {
754: /* needed cos of a macro */
755: return (oid2prim (o));
756: }
757:
758: oidprint (ps,o,format)
759: PS ps;
760: OID o;
761: int format;
762: {
763: extern int oidformat;
764:
765: if (format == READOUT)
766: ps_printf (ps,"%s",oid2name(o,oidformat));
767: else
768: ps_printf (ps,"%s",oid2name(o,OIDPART));
769: }
770:
771: OID dup_prim2oid (pe)
772: PE pe;
773: {
774: OID oid;
775:
776: if (! test_prim_pe (pe,PE_CLASS_UNIV,PE_PRIM_OID))
777: return (NULLOID);
778:
779: if (( oid = prim2oid(pe)) == NULLOID)
780: return (NULLOID);
781:
782: return (oid_cpy(oid));
783: }
784:
785: oid_syntax ()
786: {
787: (void) add_attribute_syntax ("oid",
788: (IFP) oid2pe, (IFP) dup_prim2oid,
789: (IFP) name2oid, oidprint,
790: (IFP) oid_cpy, oid_cmp,
791: oid_free, NULLCP,
792: NULLIFP, FALSE );
793: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.