|
|
1.1 root 1: #include "quipu/util.h"
2: #include "quipu/entry.h"
3: #include "cmd_srch.h"
4: #include "tailor.h"
5:
6: extern char chrcnv [];
7:
8: extern LLog * log_dsap;
9: int load_obj_hier();
10: int add_oc_macro();
11:
12: extern oid_table OIDTable[];
13: extern objectclass ocOIDTable[];
14: extern oid_table_attr attrOIDTable[];
15: extern int NumEntries;
16: extern int attrNumEntries;
17: extern int ocNumEntries;
18: static table_seq table_seq_new ();
19:
20: struct mac_buf { /* for handling macros */
21: char name [BUFSIZE];
22: char value [LINESIZE];
23: } macro [BUFSIZE];
24:
25: int NumMacro = 0;
26:
27: want_oc_hierarchy ()
28: {
29: extern IFP oc_load;
30: extern IFP oc_macro_add;
31:
32: oc_load = load_obj_hier;
33: oc_macro_add = add_oc_macro;
34: }
35:
36: load_obj_hier (sep,newname)
37: char * sep;
38: char * newname;
39: {
40: if (sep == 0) {
41: LLOG (log_dsap,LLOG_FATAL,("hierarchy missing %s",newname));
42: return NOTOK;
43: }
44: if (get_oc_bits (sep) != OK) {
45: LLOG (log_dsap,LLOG_FATAL,("(%s)",newname));
46: return NOTOK;
47: }
48:
49: return OK;
50: }
51:
52: static get_oc_bits (str)
53: register char * str;
54: {
55: register char * ptr;
56: register char * ptr2;
57: struct oid_seq * oidseq = NULLOIDSEQ, *oidseqptr = oidseq;
58: objectclass * oc;
59:
60: if ((ptr = index (str,SEPERATOR)) == 0) {
61: LLOG (log_dsap,LLOG_FATAL,("must missing"));
62: return (NOTOK);
63: }
64: *ptr++ = 0;
65:
66: while (( ptr2 = index (str,COMMA)) != 0) {
67: *ptr2++ = 0;
68: oidseqptr = (struct oid_seq *) smalloc (sizeof (struct oid_seq));
69: if ((oc = name2oc(str)) == NULLOBJECTCLASS) {
70: LLOG (log_dsap,LLOG_FATAL,("unknown objectclass in hierachy %s",str));
71: return (NOTOK);
72: }
73: oidseqptr->oid_oid = oc->oc_ot.ot_oid;
74: oidseqptr->oid_next = NULLOIDSEQ;
75: oidseq = oid_seq_merge (oidseq,oidseqptr);
76: str = ptr2;
77: }
78: if (*str != 0) {
79: oidseqptr = (struct oid_seq *) smalloc (sizeof (struct oid_seq));
80: /* no logging -> never freed */
81: if ((oc = name2oc(str)) == NULLOBJECTCLASS) {
82: LLOG (log_dsap,LLOG_FATAL,("unknown objectclass in hierachy %s",str));
83: return (NOTOK);
84: }
85: oidseqptr->oid_oid = oc->oc_ot.ot_oid;
86: oidseqptr->oid_next = NULLOIDSEQ;
87: oidseq = oid_seq_merge (oidseq,oidseqptr);
88: ocOIDTable[ocNumEntries].oc_hierachy = oidseq;
89: } else
90: ocOIDTable[ocNumEntries].oc_hierachy = NULLOIDSEQ;
91:
92: str = ptr;
93: if ((ptr = index (str,SEPERATOR)) == 0) {
94: LLOG (log_dsap,LLOG_FATAL,("may element missing"));
95: return (NOTOK);
96: }
97: *ptr++ = 0;
98:
99: ocOIDTable[ocNumEntries].oc_may = table_seq_new (ptr);
100: ocOIDTable[ocNumEntries].oc_must = table_seq_new (str);
101:
102: return (OK);
103: }
104:
105: static table_seq undo_macro (top,ptr)
106: table_seq top;
107: register char * ptr;
108: {
109: register int i;
110: table_seq tab;
111: table_seq tab_top;
112: table_seq trail = NULLTABLE_SEQ;
113:
114: if (*ptr == 0)
115: return (top);
116:
117: for (i=0; i<NumMacro; i++)
118: if (lexequ (macro[i].name,ptr) == 0) {
119: tab_top= table_seq_new (macro[i].value);
120: for (tab=tab_top; tab!=NULLTABLE_SEQ; tab=tab->ts_next)
121: trail = tab;
122: if (trail != NULLTABLE_SEQ) {
123: trail->ts_next = top;
124: return (tab_top);
125: } else
126: return (top);
127: }
128:
129: LLOG (log_dsap,LLOG_FATAL,("can't interpret %s in must/may field",ptr));
130: return (top);
131: }
132:
133: static table_seq table_seq_new (str)
134: register char * str;
135: {
136: register char * ptr;
137: table_seq tptr;
138: table_seq top = NULLTABLE_SEQ;
139: oid_table_attr * at;
140:
141: if (*str == 0)
142: return (NULLTABLE_SEQ);
143:
144: while ((ptr = index (str,COMMA)) != 0) {
145: *ptr = 0;
146: if ((at = name2attr (str)) == NULLTABLE_ATTR)
147: top = undo_macro (top,str);
148: else {
149: tptr = (table_seq) smalloc (sizeof (*tptr));
150: /* no logging -> never freed */
151: tptr->ts_oa = at;
152: tptr->ts_next = top;
153: top = tptr;
154: }
155: *ptr = COMMA;
156: str = ptr + 1;
157: }
158:
159: if (str != 0) {
160: if ((at = name2attr (str)) == NULLTABLE_ATTR)
161: return (undo_macro (top,str));
162: else {
163: tptr = (table_seq) smalloc (sizeof (*tptr));
164: /* no logging -> never freed */
165: tptr->ts_oa = at;
166: tptr->ts_next = top;
167: return (tptr);
168: }
169: } else
170: return (NULLTABLE_SEQ);
171:
172: }
173:
174:
175:
176: void dumpalloid ()
177: {
178: register int i;
179: register objectclass * oc = &ocOIDTable[0];
180: register oid_table_attr * at = &attrOIDTable[0];
181: register oid_table * oi = &OIDTable[0];
182:
183: for (i=0;i<ocNumEntries;i++,oc++)
184: (void) printf("\"%s\"\t\t%s\n", oc->oc_ot.ot_name, oc->oc_ot.ot_stroid);
185:
186: for (i=0;i<attrNumEntries;i++,at++)
187: (void) printf("\"%s\"\t\t%s\n", at->oa_ot.ot_name, at->oa_ot.ot_stroid);
188:
189: for (i=0;i<NumEntries;i++,oi++)
190: (void) printf("\"%s\"\t\t%s\n", oi->ot_name, oi->ot_stroid);
191:
192: }
193:
194:
195: add_oc_macro (buf,ptr)
196: char * buf, *ptr;
197: {
198: (void) strcpy(macro[NumMacro].name,buf);
199: (void) strcpy(macro[NumMacro++].value,ptr);
200: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.