|
|
1.1 root 1: /* search.c - */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/quipu/dish/RCS/search.c,v 7.6 90/07/09 14:47:23 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/quipu/dish/RCS/search.c,v 7.6 90/07/09 14:47:23 mrose Exp $
9: *
10: *
11: * $Log: search.c,v $
12: * Revision 7.6 90/07/09 14:47:23 mrose
13: * sync
14: *
15: * Revision 7.5 90/03/15 11:18:31 mrose
16: * quipu-sync
17: *
18: * Revision 7.4 90/01/11 18:37:44 mrose
19: * real-sync
20: *
21: * Revision 7.3 89/11/26 14:43:00 mrose
22: * sync
23: *
24: * Revision 7.2 89/11/26 14:27:15 mrose
25: * sync
26: *
27: * Revision 7.1 89/11/26 14:25:45 mrose
28: * sync
29: *
30: * Revision 7.0 89/11/23 22:20:20 mrose
31: * Release 6.0
32: *
33: */
34:
35: /*
36: * NOTICE
37: *
38: * Acquisition, use, and distribution of this module and related
39: * materials are subject to the restrictions of a license agreement.
40: * Consult the Preface in the User's Manual for the full terms of
41: * this agreement.
42: *
43: */
44:
45:
46: #include "quipu/util.h"
47: #include "quipu/ds_search.h"
48: #include "quipu/list.h"
49: #include "quipu/entry.h"
50: #include "quipu/sequence.h"
51:
52: extern DN dn,
53: current_dn;
54:
55: #define OPT (!frompipe || rps -> ps_byteno == 0 ? opt : rps)
56: #define RPS (!frompipe || opt -> ps_byteno == 0 ? rps : opt)
57: extern char frompipe;
58: extern PS opt, rps;
59:
60: extern Entry current_entry;
61: extern char flag_show;
62: DN rel_dn = NULLDN;
63:
64: extern char fred_flag;
65: extern char fred_expand;
66: extern char fred_long;
67: extern char fred_phone;
68: extern char fred_sequence;
69: extern char fred_subdisplay;
70:
71: Filter get_filter ();
72: char *TidyString ();
73: char allow_move = TRUE;
74:
75: int csr_compar ();
76:
77: call_search (argc, argv)
78: int argc;
79: char **argv;
80: {
81: PS aps;
82: struct ds_search_arg search_arg;
83: struct DSError error;
84: struct ds_search_result result;
85: DN save_dn;
86: extern int sizelimit;
87: int x;
88: Entry save_entry;
89: char rel_flag = TRUE;
90: char part_flag = TRUE;
91: char *save_arg = NULLCP;
92: extern char value_flag ;
93: extern char all_flag;
94: extern char key_flag;
95: extern char name_flag;
96: extern char doneget;
97: extern char * result_sequence;
98: static char *nvec[2] = {"search"};
99: extern Attr_Sequence as_flag;
100: int seqno;
101: Attr_Sequence eptr;
102: char hit_one = FALSE;
103: extern char search_result;
104:
105: search_result = OK;
106:
107: value_flag = TRUE;
108: all_flag = FALSE;
109: name_flag = TRUE;
110: if (as_flag != NULLATTR) {
111: as_free (as_flag);
112: as_flag = NULLATTR;
113: }
114: flag_show = FALSE;
115: key_flag = TRUE;
116:
117: search_arg.sra_filter = NULLFILTER;
118: search_arg.sra_subset = SRA_ONELEVEL;
119: search_arg.sra_common.ca_servicecontrol.svc_sizelimit = sizelimit;
120: search_arg.sra_searchaliases = FALSE;
121:
122: if ((argc = service_control (OPT, argc, argv, &search_arg.sra_common)) == -1)
123: return;
124:
125: allow_move = FALSE;
126: if ( (argc = set_read_flags (argc,argv)) == -1) {
127: allow_move = TRUE;
128: return;
129: }
130: allow_move = TRUE;
131: fred_flag = FALSE;
132: fred_expand = FALSE;
133: fred_long = 2;
134: fred_phone = FALSE;
135: fred_sequence = TRUE;
136: fred_subdisplay = FALSE;
137:
138: for (x = 1; x < argc; x++) {
139: if (test_arg (argv[x], "-baseobject",1))
140: search_arg.sra_subset = SRA_BASEOBJECT;
141: else if (test_arg (argv[x], "-singlelevel",2))
142: search_arg.sra_subset = SRA_ONELEVEL;
143: else if (test_arg (argv[x], "-subtree",2))
144: search_arg.sra_subset = SRA_WHOLESUBTREE;
145: else if (test_arg (argv[x], "-relative",3))
146: rel_flag = TRUE;
147: else if (test_arg (argv[x], "-norelative",5))
148: rel_flag = FALSE;
149: else if (test_arg (argv[x], "-partial",2))
150: part_flag = TRUE;
151: else if (test_arg (argv[x], "-nopartial",4))
152: part_flag = FALSE;
153: else if (test_arg (argv[x], "-hitone",3))
154: hit_one = TRUE;
155: else if (test_arg (argv[x], "-searchaliases",3))
156: search_arg.sra_searchaliases = TRUE;
157: else if (test_arg (argv[x], "-nosearchaliases",5))
158: search_arg.sra_searchaliases = FALSE;
159: else if (test_arg (argv[x], "-filter",1)) {
160: if (x+1 == argc) {
161: ps_printf (OPT,"Filter missing\n");
162: Usage (argv[0]);
163: return;
164: }
165: if ((search_arg.sra_filter = get_filter (argv[++x])) == NULLFILTER) {
166: ps_printf (OPT,"Invalid filter %s\n",argv[x]);
167: Usage (argv[0]);
168: return;
169: }
170: shuffle_up (argc--,argv,x--);
171: } else if (test_arg (argv[x], "-object",1)) {
172: if (move (argv[++x]) != OK) {
173: ps_printf (OPT,"Invalid move object %s\n",argv[x]);
174: Usage (argv[0]);
175: return;
176: }
177: shuffle_up (argc--,argv,x--);
178: } else if (*argv[x] != '-') {
179: if (save_arg != NULLCP) {
180: ps_printf (OPT,"Need flags to parse argument '%s'!\n",argv[x]);
181: Usage (argv[0]);
182: return;
183: } else
184: save_arg = argv[x];
185: }
186: else if (test_arg (argv[x], "-fred",4))
187: fred_flag = TRUE;
188: else if (test_arg (argv[x], "-expand",4))
189: fred_expand = TRUE;
190: else if (test_arg (argv[x], "-full",4))
191: fred_long = TRUE;
192: else if (test_arg (argv[x], "-summary",7))
193: fred_long = FALSE;
194: else if (test_arg (argv[x], "-phone",5))
195: fred_phone = TRUE;
196: else if (test_arg (argv[x], "-nofredseq",9))
197: fred_sequence = FALSE;
198: else if (test_arg (argv[x], "-subdisplay",10))
199: fred_subdisplay = TRUE;
200: else
201: continue; /* a read type flag !!! */
202:
203: shuffle_up (argc--,argv,x--);
204: }
205:
206: if (fred_flag && fred_long != TRUE && fred_expand != TRUE) {
207: AttributeType at;
208:
209: if (at = AttrT_new ("rfc822Mailbox"))
210: as_flag = as_merge (as_flag,
211: as_comp_new (AttrT_cpy (at), NULLAV,
212: NULLACL_INFO));
213: if (at = AttrT_new ("telephoneNumber"))
214: as_flag = as_merge (as_flag,
215: as_comp_new (AttrT_cpy (at), NULLAV,
216: NULLACL_INFO));
217: }
218:
219: if (flag_show && (as_flag == NULLATTR))
220: all_flag = TRUE;
221:
222: if (save_arg != NULLCP) {
223: /* There is an unflagged argument */
224: if (search_arg.sra_filter == NULLFILTER) {
225: if ((search_arg.sra_filter = get_filter (save_arg)) == NULLFILTER) {
226: ps_printf (OPT,"Invalid filter %s\n",save_arg);
227: Usage (argv[0]);
228: return;
229: }
230: } else if (move (save_arg) != OK) {
231: ps_printf (OPT,"Invalid move object %s\n",save_arg);
232: Usage (argv[0]);
233: return;
234: }
235: }
236:
237: if (search_arg.sra_filter == NULLFILTER) {
238: /* set default */
239: search_arg.sra_filter = filter_alloc ();
240: search_arg.sra_filter->flt_next = NULLFILTER;
241: search_arg.sra_filter->flt_type = FILTER_AND;
242: search_arg.sra_filter->FUFILT = NULLFILTER;
243: }
244:
245: if (argc != 1) {
246: Usage (argv[0]);
247: return;
248: }
249:
250: if (fred_flag
251: && (save_entry = local_find_entry (dn, FALSE))
252: && save_entry -> e_alias)
253: dn = dn_cpy (save_entry -> e_alias);
254: search_arg.sra_eis.eis_infotypes = value_flag;
255: search_arg.sra_eis.eis_allattributes = all_flag;
256: search_arg.sra_eis.eis_select = as_flag;
257: search_arg.sra_baseobject = dn;
258:
259: if (rebind () != OK)
260: return;
261:
262: /* Strong authentication */
263: if (search_arg.sra_common.ca_security != (struct security_parms *) 0)
264: {
265: struct signature *sign_operation();
266: int encode_DAS_SearchArgumentData();
267:
268: search_arg.sra_common.ca_sig =
269: sign_operation((caddr_t)&search_arg, encode_DAS_SearchArgumentData);
270: }
271:
272: while (ds_search (&search_arg, &error, &result) != DS_OK) {
273: if (dish_error (OPT, &error) == 0)
274: return;
275: search_arg.sra_baseobject = error.ERR_REFERRAL.DSE_ref_candidates->cr_name;
276: }
277:
278: correlate_search_results (&result);
279:
280: if (result_sequence)
281: set_sequence (result_sequence);
282:
283: if (result.CSR_entries == NULLENTRYINFO)
284: ps_printf (aps = OPT, "Search failed to find anything.\n");
285: else {
286: EntryInfo *ptr;
287:
288: ptr = result.CSR_entries;
289: if (hit_one && result.CSR_entries->ent_next != NULLENTRYINFO) {
290: ps_printf (OPT,"Multiple hits...\n");
291: if (frompipe)
292: search_result = NOTOK;
293: }
294:
295: aps = RPS;
296: save_dn = dn_cpy(current_dn);
297: save_entry = current_entry;
298: doneget = TRUE;
299: if (rel_flag)
300: rel_dn = dn_cpy(dn);
301:
302: if (fred_flag) {
303: int i,
304: didecode = 0,
305: nchild = 0;
306:
307: i = 0;
308: for (ptr = result.CSR_entries;
309: ptr;
310: ptr = ptr -> ent_next)
311: i++;
312: if (fred_long == 2)
313: if ((fred_subdisplay && fred_expand)
314: || (!fred_subdisplay && !fred_expand))
315: fred_long = i == 1;
316: else
317: fred_long = fred_expand;
318:
319: if (i > 1) {
320: EntryInfo **base,
321: **bp,
322: **ep;
323:
324: ps_printf (RPS, "%d matches found.\n", i);
325: (void) ps_flush (RPS);
326:
327: if (base = (EntryInfo **) malloc ((unsigned)
328: (i * sizeof *base))){
329: ep = base;
330:
331: qsort ((char *) base, i, sizeof *base, csr_compar);
332:
333: bp = base;
334: ptr = result.CSR_entries = *bp++;
335: while (bp < ep) {
336: ptr -> ent_next = *bp;
337: ptr = *bp++;
338: }
339: ptr -> ent_next = NULL;
340:
341: free ((char *) base);
342: didecode = 1;
343: }
344: }
345:
346: if (fred_expand)
347: fred_long = fred_subdisplay = TRUE;
348: for (ptr = result.CSR_entries;
349: ptr;
350: ptr = ptr -> ent_next) {
351: if (!didecode)
352: /* not really necessary...
353: normalize_dn (&ptr -> ent_dn);
354: */
355: (void) add_sequence (ptr -> ent_dn);
356: }
357: set_sequence ("default");
358: for (i = 0, ptr = result.CSR_entries;
359: ptr;
360: ptr = ptr -> ent_next, i++) {
361: if (i > 0) {
362: if (fred_expand)
363: ps_print (RPS, "-------\n");
364: else
365: if (nchild)
366: ps_print (RPS, "\n");
367: (void) ps_flush (RPS);
368: }
369:
370: cache_entry (ptr, all_flag, value_flag);
371:
372: nchild = showfred (ptr -> ent_dn, fred_long,
373: fred_subdisplay);
374: }
375: }
376: else
377: for (ptr = result.CSR_entries; ptr != NULLENTRYINFO; ptr = ptr->ent_next) {
378: /* decode it immediately so we only
379: have to do it once. */
380: cache_entry (ptr, all_flag, value_flag);
381: seqno = add_sequence (ptr->ent_dn);
382: if (seqno != 0)
383: ps_printf (RPS,"%-3d ",seqno);
384: nvec[1] = "-compact";
385:
386: if (name_flag)
387: call_showname (2, nvec);
388: else if (seqno != 0)
389: ps_print (RPS,"\n");
390:
391: if (flag_show) {
392: eptr = ptr->ent_attr;
393: for (; eptr != NULLATTR; eptr = eptr->attr_link)
394: showattribute (eptr->attr_type);
395: }
396: }
397: if (rel_dn != NULLDN) {
398: dn_free (rel_dn);
399: rel_dn = NULLDN;
400: }
401: dn_free (current_dn);
402: current_dn = save_dn;
403: current_entry = save_entry;
404: entryinfo_free (result.CSR_entries,0);
405: }
406:
407: handle_problems (aps,result.CSR_cr,result.CSR_limitproblem,part_flag);
408:
409: filter_free (search_arg.sra_filter);
410: }
411:
412: static int csr_compar (a, b)
413: EntryInfo **a,
414: **b;
415: {
416: int i;
417: DN adn,
418: bdn;
419:
420: for (adn = (*a) -> ent_dn; adn -> dn_parent; adn = adn -> dn_parent)
421: continue;
422: for (bdn = (*b) -> ent_dn; bdn -> dn_parent; bdn = bdn -> dn_parent)
423: continue;
424:
425: i = rdn_cmp (adn -> dn_rdn, bdn -> dn_rdn);
426: return (i == (-1) || i == 1 ? i : 0);
427: }
428:
429: handle_problems (aps,cr,limit,proceed)
430: PS aps;
431: ContinuationRef cr;
432: int limit;
433: {
434: if (! proceed)
435: return;
436:
437: if (limit != LSR_NOLIMITPROBLEM) {
438: ps_print (aps, "(");
439: switch (limit) {
440: case LSR_TIMELIMITEXCEEDED:
441: ps_print (aps, flag_show
442: ? "Time limit exceeded"
443: : "Partial results only--time limit exceeded");
444: break;
445: case LSR_SIZELIMITEXCEEDED:
446: ps_print (aps, flag_show
447: ? "Size limit exceeded"
448: : "Partial results only--size limit exceeded");
449: break;
450: default: /* admin limit */
451: ps_print (aps, flag_show
452: ? "Admin limit exceeded"
453: : "Partial results only--admin limit exceeded");
454: break;
455: }
456: ps_print (aps, ")\n");
457: if (! flag_show)
458: return;
459: }
460:
461: if (cr != NULLCONTINUATIONREF) {
462: ContinuationRef crptr;
463: if (!flag_show) {
464: ps_print (aps,"(Partial results only--not all DSAs could be reached)\n");
465: return;
466: }
467: ps_print (aps, "NOTE partial results only:- could not contact following DSA(s):-\n");
468: for (crptr=cr; crptr != NULLCONTINUATIONREF; crptr=crptr->cr_next) {
469: ps_print (aps," ");
470: dn_print (aps,crptr->cr_accesspoints->ap_name,EDBOUT);
471: ps_print (aps," (holding ");
472: dn_print (aps,crptr->cr_name,EDBOUT);
473: ps_print (aps,")\n");
474: }
475: }
476:
477: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.