|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T o
Length: 20181 (0x4ed5) Types: TextFile Names: »oid.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/dsap/common/oid.c«
/* oid.c - Object Identifier routines */ #ifndef lint static char *rcsid = "$Header: /f/osi/dsap/common/RCS/oid.c,v 6.0 89/03/18 23:27:41 mrose Rel $"; #endif /* * $Header: /f/osi/dsap/common/RCS/oid.c,v 6.0 89/03/18 23:27:41 mrose Rel $ * * * $Log: oid.c,v $ * Revision 6.0 89/03/18 23:27:41 mrose * Release 5.0 * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ /* LINTLIBRARY */ #include "quipu/util.h" #include "quipu/entry.h" #include "cmd_srch.h" #include "tailor.h" extern char chrcnv []; extern LLog * log_dsap; static CMD_TABLE cmd_syntax [] = { "CaseIgnoreString", AV_CASEIGNORESTRING, "objectclass", AV_OBJECTCLASS, "acl", AV_ACL, "PresentationAddress", AV_PRESENTATIONADDRESS, "DN", AV_DN, "schema", AV_SCHEMA, "EDBInfo", AV_UPDATE, "asn", AV_ASN, "CaseExactString", AV_CASEEXACTSTRING, "NumericString", AV_NUMERICSTRING, "boolean", AV_BOOLEAN, "integer", AV_INTEGER, "time", AV_TIME, "oid", AV_OID, "photo", AV_PHOTO, "undefined", AV_UNKNOWN, 0, -1, }; FILE * f_table; static char * get_entry (); static add_entry (); static char * get_oid (); static char * name2gen (); static get_oc_bits (); static add_entry_aux (); static table_seq table_seq_new (); oid_table OIDTable [TABLESIZE]; oid_table_attr attrOIDTable [TABLESIZE]; objectclass ocOIDTable [TABLESIZE]; struct mac_buf { /* for handling macros */ char name [BUFSIZE]; char value [LINESIZE]; } macro [BUFSIZE]; int NumEntries = 0; int attrNumEntries = 0; int ocNumEntries = 0; int NumMacro = 0; #define GEN 1 #define ATTR 2 #define OC 3 #define PBUCKETS 128 #define PHASH(nm) \ (((nm)[1]) ? (((chrcnv[((nm)[0])] - chrcnv[((nm)[1])]) & 0x1f) + ((chrcnv[(nm)[2]]) & 0x5f)) \ : (chrcnv[(nm)[0]]) & 0x7f) struct pair { char *p_name; caddr_t p_value; int p_type; struct pair *p_chain; }; struct aliases { char * a_full; char * a_alias; }; static struct aliases Palias[LOTS]; static int Palias_next = 0; static struct pair *Pbuckets[PBUCKETS]; load_oid_table (table) char * table; { register char * name; char filename [FILNSIZE]; register char * extension; char *isodetable; if (NumEntries != 0) return; /* already loaded */ isodetable = isodefile(table); (void) strcpy (filename,isodetable); extension = &filename[strlen(isodetable)]; (void) strcpy (extension,".gen"); if (( f_table = fopen (filename,"r")) == (FILE *) NULL) { LLOG (log_dsap,LLOG_FATAL,("file %s",filename)); fatal (-91,"Can't open oidtable.gen"); } while (1) { /* break out */ if ( (name = get_entry ()) == NULLCP) break; add_entry (name,GEN); } (void) fclose (f_table); (void) strcpy (extension,".at"); if (( f_table = fopen (filename,"r")) == (FILE *) NULL) { LLOG (log_dsap,LLOG_FATAL,("file %s",filename)); fatal (-92,"Can't open oidtable.at"); } while (1) { /* break out */ if ( (name = get_entry ()) == NULLCP) break; add_entry (name,ATTR); } (void) fclose (f_table); (void) strcpy (extension,".oc"); if (( f_table = fopen (filename,"r")) == (FILE *) NULL) { LLOG (log_dsap,LLOG_FATAL,("file %s",filename)); fatal (-93,"Can't open oidtable.oc"); } while (1) { /* break out */ if ( (name = get_entry ()) == NULLCP) break; add_entry (name,OC); } (void) fclose (f_table); } static add_entry_aux (a,b,c,d) char * a; caddr_t b; int c; char * d; { int i; register struct pair *p; if ((p = (struct pair *) calloc (1, sizeof *p)) == NULL) { SLOG (log_dsap, LLOG_EXCEPTIONS, NULLCP, ("calloc of alias structure failed")); return; } p -> p_name = a; p -> p_value = b; p -> p_type = c; p -> p_chain = Pbuckets[i = PHASH (p -> p_name)]; Pbuckets[i] = p; if (d != NULLCP) { if ((p = (struct pair *) calloc (1, sizeof *p)) == NULL) { SLOG (log_dsap, LLOG_EXCEPTIONS, NULLCP, ("calloc of alias (2) structure failed")); return; } Palias[Palias_next].a_full = a; Palias[Palias_next++].a_alias = d; p -> p_name = d; p -> p_value = b; p -> p_type = c; p -> p_chain = Pbuckets[i = PHASH (p -> p_name)]; Pbuckets[i] = p; } } static add_entry (newname,towho) char * newname; int towho; { register char *nptr, *ptr, *sep; OID oid; oid_table * Current; char * alias = NULLCP; if ((nptr = index (newname,SEPERATOR)) == 0) { LLOG (log_dsap,LLOG_FATAL,("oid missing in %s",newname)); return; } *nptr = 0; if ((sep = index (newname,COMMA)) != 0) { *sep++ = 0; alias = strdup(newname); newname = sep; } switch (towho) { case GEN: Current = &OIDTable[NumEntries]; (void) strcpy (Current->ot_name, newname); add_entry_aux (Current->ot_name,(caddr_t)&OIDTable[NumEntries],GEN,alias); break; case ATTR: Current = &attrOIDTable[attrNumEntries].oa_ot; (void) strcpy (Current->ot_name, newname); add_entry_aux (Current->ot_name,(caddr_t)&attrOIDTable[attrNumEntries],ATTR,alias); break; case OC: Current = &ocOIDTable[ocNumEntries].oc_ot; (void) strcpy (Current->ot_name, newname); add_entry_aux (Current->ot_name,(caddr_t)&ocOIDTable[ocNumEntries],OC,alias); break; } *nptr = SEPERATOR; nptr++; if ((sep = index (nptr,SEPERATOR)) != 0) *sep++ = 0; ptr = get_oid (nptr); if (ptr == NULLCP) { LLOG (log_dsap,LLOG_FATAL,("invalid oid '%s'",nptr)); return; } (void) strcpy (Current->ot_stroid,ptr); oid = str2oid (Current->ot_stroid); if (oid == NULLOID) Current->ot_oid = NULLOID; /* only reason for failure is generic oid of length 1 */ else Current->ot_oid = oid_cpy (oid); /* now do special work for at and oc types */ switch (towho) { case GEN: NumEntries++; /* nothing else to do */ break; case ATTR: if (sep == 0) LLOG (log_dsap,LLOG_FATAL,("syntax missing in %s",newname)); else { if (( ptr = index (sep,SEPERATOR)) != NULLCP) { *ptr++ = 0; if (lexequ (ptr,"FILE") != 0) LLOG (log_dsap,LLOG_FATAL,("FILE syntax expected, '%s' found",ptr)); else { if ((attrOIDTable[attrNumEntries].oa_syntax = cmd_srch (sep, cmd_syntax)) == -1) LLOG (log_dsap,LLOG_FATAL,("Unknown syntax %s",sep)); else { attrOIDTable[attrNumEntries].oa_syntax += AV_WRITE_FILE; attrNumEntries++; } } } else { if ((attrOIDTable[attrNumEntries].oa_syntax = cmd_srch (sep, cmd_syntax)) == -1) LLOG (log_dsap,LLOG_FATAL,("Unknown syntax %s",sep)); else attrNumEntries++; } } break; case OC: if (sep == 0) LLOG (log_dsap,LLOG_FATAL,("hierarchy missing %s",newname)); if (get_oc_bits (sep) == OK) ocNumEntries++; else LLOG (log_dsap,LLOG_FATAL,("(%s)",newname)); break; } return; } static get_oc_bits (str) register char * str; { register char * ptr; register char * ptr2; struct oid_seq * oidseq = NULLOIDSEQ, *oidseqptr = oidseq; objectclass * oc; if ((ptr = index (str,SEPERATOR)) == 0) { LLOG (log_dsap,LLOG_FATAL,("must missing")); return (NOTOK); } *ptr++ = 0; while (( ptr2 = index (str,COMMA)) != 0) { *ptr2++ = 0; oidseqptr = (struct oid_seq *) smalloc (sizeof (struct oid_seq)); if ((oc = name2oc(str)) == NULLOBJECTCLASS) { LLOG (log_dsap,LLOG_FATAL,("unknown objectclass in hierachy %s",str)); return (NOTOK); } oidseqptr->oid_oid = oc->oc_ot.ot_oid; oidseqptr->oid_next = NULLOIDSEQ; oidseq = oid_seq_merge (oidseq,oidseqptr); str = ptr2; } if (*str != 0) { oidseqptr = (struct oid_seq *) smalloc (sizeof (struct oid_seq)); /* no logging -> never freed */ if ((oc = name2oc(str)) == NULLOBJECTCLASS) { LLOG (log_dsap,LLOG_FATAL,("unknown objectclass in hierachy %s",str)); return (NOTOK); } oidseqptr->oid_oid = oc->oc_ot.ot_oid; oidseqptr->oid_next = NULLOIDSEQ; oidseq = oid_seq_merge (oidseq,oidseqptr); ocOIDTable[ocNumEntries].oc_hierachy = oidseq; } else ocOIDTable[ocNumEntries].oc_hierachy = NULLOIDSEQ; str = ptr; if ((ptr = index (str,SEPERATOR)) == 0) { LLOG (log_dsap,LLOG_FATAL,("may element missing")); return (NOTOK); } *ptr++ = 0; ocOIDTable[ocNumEntries].oc_may = table_seq_new (ptr); ocOIDTable[ocNumEntries].oc_must = table_seq_new (str); return (OK); } static table_seq undo_macro (top,ptr) table_seq top; register char * ptr; { register int i; table_seq tab; table_seq tab_top; table_seq trail = NULLTABLE_SEQ; if (*ptr == 0) return (top); for (i=0; i<NumMacro; i++) if (lexequ (macro[i].name,ptr) == 0) { tab_top= table_seq_new (macro[i].value); for (tab=tab_top; tab!=NULLTABLE_SEQ; tab=tab->ts_next) trail = tab; if (trail != NULLTABLE_SEQ) { trail->ts_next = top; return (tab_top); } else return (top); } LLOG (log_dsap,LLOG_FATAL,("can't interpret %s in must/may field",ptr)); return (top); } static table_seq table_seq_new (str) register char * str; { register char * ptr; table_seq tptr; table_seq top = NULLTABLE_SEQ; oid_table_attr * at; if (*str == 0) return (NULLTABLE_SEQ); while ((ptr = index (str,COMMA)) != 0) { *ptr = 0; if ((at = name2attr (str)) == NULLTABLE_ATTR) top = undo_macro (top,str); else { tptr = (table_seq) smalloc (sizeof (*tptr)); /* no logging -> never freed */ tptr->ts_oa = at; tptr->ts_next = top; top = tptr; } *ptr = COMMA; str = ptr + 1; } if (str != 0) { if ((at = name2attr (str)) == NULLTABLE_ATTR) return (undo_macro (top,str)); else { tptr = (table_seq) smalloc (sizeof (*tptr)); /* no logging -> never freed */ tptr->ts_oa = at; tptr->ts_next = top; return (tptr); } } else return (NULLTABLE_SEQ); } static char * get_oid (str) char * str; { static char buffer [BUFSIZE]; register char * ptr = buffer; register char * dotptr; register char * soid; char deref = FALSE; if ( ! isdigit(*str)) if ((dotptr = index (str,DOT)) == 0) return (name2gen(str)); while (*str != 0) { if ( (! isdigit (*str)) && (*str != DOT) ) { if ((dotptr = index (str,DOT)) == 0) { *--ptr = 0; return (buffer); } *dotptr = 0; *ptr = 0; if ((soid = name2gen(str)) == NULLCP) { *dotptr = DOT; return (NULLCP); } *dotptr = DOT; str = dotptr; if (deref) { if ((dotptr = rindex (soid,DOT)) == 0) return (NULLCP); /* invalid */ if ((strncmp (soid,buffer,strlen(buffer))) != 0) return (NULLCP); /* inconsistent */ } deref = TRUE; (void) strcpy (buffer,soid); ptr = buffer + strlen (soid); } else *ptr++ = *str++; } *ptr = 0; return (buffer); } static char * name2gen (nodename) char * nodename; { register int i; register oid_table * tblptr = &OIDTable[0]; for (i=0;i<NumEntries;i++,tblptr++) { if (lexequ (tblptr->ot_name, nodename) == 0) return (tblptr->ot_stroid); } return (NULLCP); } static char * soid2gen (soid) char * soid; { register int i; register oid_table * tblptr = &OIDTable[0]; for (i=0;i<NumEntries;i++,tblptr++) { if (strcmp (tblptr->ot_stroid, soid) == 0) return (tblptr->ot_name); } return (NULLCP); } static char * get_line () { static char buffer [LINESIZE]; register char * buf = buffer; register char * ptr = buffer; register int done; /* read line, ignore comments, join lines in '/' found */ do { done = TRUE; if (fgets (buf,LINESIZE,f_table) == NULLCP) return (NULLCP); StripSpace (buf); if (*buf != 0) { ptr += strlen(buf) - 1; if (*ptr == '\\') { buf = ptr; done = FALSE; } } else done = FALSE; } while (done == FALSE); return (buffer); } static char * get_entry () { register char * buf; register char * ptr; /* read next line - test for macro defs */ while (1) { /* return out */ if ((buf = get_line ()) == NULLCP) return (NULLCP); if ((ptr = index (buf,'=')) != 0) { *ptr++ = 0; (void) strcpy(macro[NumMacro].name,buf); (void) strcpy(macro[NumMacro++].value,ptr); } else return (buf); } } oid_table_attr *name2attr(nodename) char * nodename; { register int i; register char * ptr; char * str; register oid_table_attr * atrptr = &attrOIDTable[0]; if ((ptr = rindex (nodename,DOT)) == 0) { struct pair *p; for (p = Pbuckets[PHASH (nodename)]; p && lexequ (p -> p_name, nodename); p = p -> p_chain) ; /* NO-OP */ if ((p != NULL) && (p->p_type == ATTR)) return ( (oid_table_attr *) p->p_value); else return (NULLTABLE_ATTR); } else { str = get_oid (nodename); if (isdigit (*++ptr)) { for (i=0;i<attrNumEntries;i++,atrptr++) if (lexequ (atrptr->oa_ot.ot_stroid, str) == 0) return (atrptr); return (NULLTABLE_ATTR); } else { for (i=0;i<attrNumEntries;i++,atrptr++) if (lexequ (atrptr->oa_ot.ot_name, ptr) == 0) if (strncmp (str,atrptr->oa_ot.ot_stroid,strlen(str)) == 0) return (atrptr); else return (NULLTABLE_ATTR); } } return (NULLTABLE_ATTR); } oid_table_attr *oid2attr(oid) OID oid; { register int i; register oid_table_attr * ptr = &attrOIDTable[0]; DLOG (log_dsap,LLOG_DEBUG,("oid2attr: %s",sprintoid(oid))); for (i=0;i<attrNumEntries;i++,ptr++) { if (quipu_oid_cmp (ptr->oa_ot.ot_oid, oid) == 0) return (ptr); } return (NULLTABLE_ATTR); } objectclass *name2oc(nodename) register char * nodename; { register int i; register char * ptr; char * str; register objectclass * oc = & ocOIDTable[0]; if ((ptr = rindex (nodename,DOT)) == 0) { struct pair *p; for (p = Pbuckets[PHASH (nodename)]; p && lexequ (p -> p_name, nodename); p = p -> p_chain) ; /* NO-OP */ if ((p != NULL) && (p->p_type == OC)) return ( (objectclass *) p->p_value); else return (NULLOBJECTCLASS); } else { str = get_oid (nodename); if (isdigit (*++ptr)) { for (i=0;i<ocNumEntries;i++,oc++) if (lexequ (oc->oc_ot.ot_stroid, str) == 0) return (oc); return (NULLOBJECTCLASS); } else { for (i=0;i<ocNumEntries;i++,oc++) if (lexequ (oc->oc_ot.ot_name, ptr) == 0) if (strncmp (str,oc->oc_ot.ot_stroid,strlen(str)) == 0) return (oc); else return (NULLOBJECTCLASS); } } return (NULLOBJECTCLASS); } objectclass *oid2oc(oid) OID oid; { register int i; register objectclass * oc = &ocOIDTable[0]; for (i=0;i<ocNumEntries;i++,oc++) { if (quipu_oid_cmp (oc->oc_ot.ot_oid, oid) == 0) return (oc); } return (NULLOBJECTCLASS); } static char * full_gen (ot) oid_table * ot; { static char buffer [BUFSIZ]; register char * ptr = buffer; register char * soid; register char * str; buffer [0] = '\0'; str = sprintoid (ot->ot_oid); soid = str; while (*str != '\0') if ( *str == DOT) { *str = '\0'; ptr = soid2gen (soid); if (ptr == NULLCP) { *str++ = DOT; continue; } (void) strcat (buffer,"."); (void) strcat (buffer,ptr); *str++ = DOT; } else str++; (void) strcat (buffer,"."); return (&buffer[1]); } char *attr2name_aux (oa) register oid_table_attr *oa; { if ( oa != NULLTABLE_ATTR) return (oa->oa_ot.ot_name); else { LLOG (log_dsap,LLOG_EXCEPTIONS,("NULL table entry")); return (NULLCP); } } char *attr2name(oa,format) register oid_table_attr *oa; int format; { register char * buffer; int x; if ( oa != NULLTABLE_ATTR) switch (format) { case OIDFULL: buffer = full_gen (&oa->oa_ot); (void) strcat (buffer,oa->oa_ot.ot_name); return (buffer); case OIDNUM: return (oa->oa_ot.ot_stroid); default: /* look for long name */ for (x=0; x<Palias_next; x++) if (lexequ (Palias[x].a_full,oa->oa_ot.ot_name) == 0) return (Palias[x].a_alias); return (oa->oa_ot.ot_name); } else { LLOG (log_dsap,LLOG_EXCEPTIONS,("NULL table entry")); return (NULLCP); } } char *oc2name(oc,format) register objectclass *oc; int format; { register char * buffer; if ( oc != NULLOBJECTCLASS) switch (format) { case OIDFULL: buffer = full_gen (&oc->oc_ot); (void) strcat (buffer,oc->oc_ot.ot_name); return (buffer); case OIDNUM: return (oc->oc_ot.ot_stroid); default: return (oc->oc_ot.ot_name); } else return (NULLCP); } char *oid2name(oid,format) OID oid; int format; { register oid_table_attr * at; register objectclass * oc; /* try attribute first */ if (( at = oid2attr (oid)) != NULLTABLE_ATTR) return (attr2name(at,format)) ; /* try objectclass */ if (( oc = oid2oc (oid)) != NULLOBJECTCLASS) return (oc2name(oc,format)) ; return (oid2ode (oid)); } OID name2oid (str) register char * str; { register struct pair *p; OID ptr; for (p = Pbuckets[PHASH (str)]; p && lexequ (p -> p_name, str); p = p -> p_chain) ; /* NO-OP */ if (p != NULL) switch (p -> p_type) { case GEN: { oid_table * ot; ot = (oid_table *) p->p_value; return (ot->ot_oid); } case ATTR: { oid_table_attr * at; at = (oid_table_attr *) p->p_value; return (at->oa_ot.ot_oid) ; } case OC: { objectclass * oc; oc = (objectclass *) p->p_value; return (oc->oc_ot.ot_oid) ; } default: if ( (ptr=ode2oid (str)) == NULLOID) return (str2oid(str)); return (ptr); } else /* try isobjects */ if ( (ptr=ode2oid (str)) == NULLOID) return (str2oid(str)); return (ptr); } make_oc_hierarchy (avs) AV_Sequence *avs; { AV_Sequence newavs; AttributeValue x; struct oid_seq * oidseq; /* avs contains 1 oid, add the oid's of the hierarchy */ for (oidseq = (*avs)->avseq_av->av_un.av_objectclass->oc_hierachy; oidseq != NULLOIDSEQ; oidseq = oidseq->oid_next) { x = AttrV_alloc(); x->av_pe = NULLPE; x->av_syntax = AV_OBJECTCLASS; x->av_un.av_objectclass = oid2oc(oidseq->oid_oid); newavs = avs_comp_new (x); make_oc_hierarchy (&newavs); *avs = avs_merge (*avs,newavs); } } in_hierarchy (a,b) AV_Sequence a, b; { struct oid_seq * oidseq; if ((a == NULLAV) || (a->avseq_av == NULLAttrV) || (a->avseq_av->av_syntax == AV_UNKNOWN) || (a->avseq_av->av_un.av_objectclass == NULLOBJECTCLASS)) return (FALSE); if ((b == NULLAV) || (b->avseq_av == NULLAttrV) || (b->avseq_av->av_syntax == AV_UNKNOWN) || (b->avseq_av->av_un.av_objectclass == NULLOBJECTCLASS)) return (FALSE); for (oidseq = b->avseq_av->av_un.av_objectclass->oc_hierachy; oidseq != NULLOIDSEQ; oidseq = oidseq->oid_next) if (quipu_oid_cmp(a->avseq_av->av_un.av_objectclass->oc_ot.ot_oid,oidseq->oid_oid) == 0) return (TRUE); return (FALSE); } oc_print (ps,avs,format) PS ps; AV_Sequence avs; int format; { AV_Sequence newavs; char found; char printed = FALSE; if (avs == NULLAV) return; if (format != READOUT) DLOG (log_dsap,LLOG_EXCEPTIONS,("invalid call to oc_print")); for ( ; avs->avseq_next != NULLAV ; avs=avs->avseq_next) { found = FALSE; for (newavs = avs->avseq_next; newavs != NULLAV; newavs=newavs->avseq_next) if (in_hierarchy(avs,newavs) == TRUE) { found = TRUE; break; } if (found == FALSE) { if (printed == TRUE) ps_print (ps," & "); AttrV_print (ps,avs->avseq_av,format); printed = TRUE; } } if (printed == TRUE) ps_print (ps," & "); AttrV_print (ps,avs->avseq_av,format); } void dumpalloid () { register int i; register objectclass * oc = &ocOIDTable[0]; register oid_table_attr * at = &attrOIDTable[0]; register oid_table * oi = &OIDTable[0]; for (i=0;i<ocNumEntries;i++,oc++) (void) printf("\"%s\" %s\n", oc->oc_ot.ot_name, oc->oc_ot.ot_stroid); for (i=0;i<attrNumEntries;i++,at++) (void) printf("\"%s\" %s\n", at->oa_ot.ot_name, at->oa_ot.ot_stroid); for (i=0;i<NumEntries;i++,oi++) (void) printf("\"%s\" %s\n", oi->ot_name, oi->ot_stroid); } objclass_cmp (a,b) objectclass *a, *b; { if (a == NULLOBJECTCLASS) return ( b ? -1 : 0 ); if (b == NULLOBJECTCLASS) return (1); return (quipu_oid_cmp(a->oc_ot.ot_oid,b->oc_ot.ot_oid)); }