|
|
1.1 root 1: /* $Header: /f/osi/others/quipu/uips/xd/RCS/calls.c,v 7.2 90/07/27 08:45:53 mrose Exp $ */
2: #ifndef lint
3: static char *rcsid = "$Id: calls.c,v 7.2 90/07/27 08:45:53 mrose Exp $";
4: #endif
5: /*
6: $Log: calls.c,v $
7: * Revision 7.2 90/07/27 08:45:53 mrose
8: * update
9: *
10: * Revision 7.1 90/07/09 14:42:12 mrose
11: * sync
12: *
13: * Revision 7.0 90/06/12 13:10:48 mrose
14: * *** empty log message ***
15: *
16: * Revision 1.5 90/04/26 10:22:34 emsrssn
17: * Installation fixed
18: *
19: *
20: * Revision 1.4 90/04/25 17:28:04 emsrssn
21: * Lint tidy up
22: *
23: *
24: * Revision 1.3 90/04/19 13:54:04 emsrssn
25: * keyboard accelerator now activates button highlight.
26: *
27: * search types available is dependent on current position
28: * to prevent unreasonable searches.
29: *
30: * the help popup changes automatically depending on the
31: * position of the cursor
32: *
33: * buttons remain a fixed size when the application is
34: * resized
35: *
36: * command line options are now handled properly
37: *
38: * logging added
39: *
40: * "reads" are now sorted to show mail address at top etc.
41: *
42: *
43: * Revision 1.2 90/03/09 15:57:27 emsrssn
44: * First public distribution
45: *
46: *
47: * Revision 1.1 90/03/08 13:18:36 emsrssn
48: * Initial revision
49: *
50: *
51: */
52:
53: #include "manifest.h"
54: #include "quipu/util.h"
55: #include "quipu/common.h"
56: #include "quipu/entry.h"
57: #include <malloc.h>
58: #include "usr.dirent.h"
59: #include "tailor.h"
60: #include "sequence.h"
61: #include "filt.h"
62: #include "y.tab.h"
63: #include "symtab.h"
64:
65: struct attrcomp * sort_attrs();
66: static dn2str ();
67:
68: #define RESBUF 10000
69:
70: PS opt;
71: Attr_Sequence read_types = 0, read_types2;
72:
73: table_entry symtab = 0;
74: int typetoggled = 0;
75:
76: int dn_print (), rdn_print(), as_print(), avs_comp_print();
77:
78: char bound = FALSE; /* indication of whether bound */
79: char * TidyString();
80:
81: D_seq dnseq = NULLDS, backseq = NULLDS, showseq = NULLDS;
82: int entry_number, back_buf_num, element_num;
83:
84: /* These are common operation variables */
85: #define STRINGLEN 1000
86: #define SMALLSTRING 255
87: #define MAXTYPES 255
88:
89: char goto_path[STRINGLEN]; /* Used by the 'G:goto' command*/
90: char base_path[STRINGLEN]; /* Used by all DS operations */
91: char friendly_base_path[STRINGLEN];
92: char friendly_name[STRINGLEN];
93: char namestr[STRINGLEN];
94: char cache [STRINGLEN];
95: char bindpass [STRINGLEN];
96: char srchvalue[STRINGLEN]; /* Used by search */
97: char svalue [STRINGLEN];
98: char mvalue [STRINGLEN];
99:
100: unsigned int curr_filt = 0;
101: unsigned int filt_num = 0;
102: unsigned int typeindx = 0;
103: filt_struct *filt_arr[MAXTYPES];
104: char *filtvalue[MAXTYPES];
105: char *filttype[MAXTYPES];
106:
107: int default_num;
108: int *av_typeindx;
109: int *available_types[MAXTYPES];
110: char *levels[MAXTYPES];
111: int defaults[MAXTYPES];
112:
113: extern Filter make_filter();
114: extern int Switch_On_Result_Update();
115: extern int Switch_Off_Result_Update();
116: extern void Clear_Results();
117: extern void xprint();
118:
119: extern char *local_dit;
120:
121: #ifndef NO_STATS
122: extern LLog *log_stat;
123: #endif
124:
125:
126: /* These are used as the data for the binding connection */
127: char passwd[STRINGLEN];
128: extern char * myname;
129:
130: extern int asizelimit;
131: DN user_name;
132:
133: char * addobj = NULLCP;
134: Filter search_filter;
135: FILE *file;
136: char *file_names[MAXTYPES];
137: char dua_help_dir[256];
138:
139: char *get_strioid(ptr)
140: register char *ptr;
141: {
142: register char *end_ptr;
143:
144: while(*ptr == '"') ptr++;
145: while(*ptr != '"') ptr++;
146:
147: while(*ptr > '9' || *ptr < '0') ptr++;
148:
149: end_ptr = ptr;
150: while(*end_ptr != '\n') end_ptr++;
151:
152: *end_ptr = '\0';
153: return ptr;
154: }
155:
156:
157: user_tailor ()
158: {
159: char *part1;
160: char *part2;
161: char *getenv ();
162: char *ptr = "/.quipurc";
163: char *config_dir = "/.duaconfig/";
164: char *isode_config_dir = "xd/duaconfig/";
165: char *type_dir = "filterTypes/";
166: char *read_File = "readTypes";
167: char *type_defaults = "typeDefaults";
168:
169: char Dish_Home[BUFSIZ];
170: char read_Home[BUFSIZ];
171: char type_Home[BUFSIZ];
172: char type_defaults_Home[BUFSIZ];
173:
174: char stroid_buf[BUFSIZ];
175:
176: DIR *dir;
177:
178: struct dirent *dir_ent;
179:
180: char Read_in_Stuff[STRINGLEN];
181: char *p,
182: *TidyString(),
183: *SkipSpace(),
184: *end;
185:
186: int count, n, num;
187: int tempints[MAXTYPES];
188:
189: (void) strcpy(dua_help_dir, isodefile("xd/helpdir/", 0));
190:
191:
192: if ((opt = ps_alloc (std_open)) == NULLPS)
193: fatal (-1,"ps_alloc failed");
194: if (std_setup (opt,stdout) == NOTOK)
195: fatal (-1,"std_setup failed");
196:
197: namestr[0] = '\0';
198: *passwd = '\0';
199: cache[0] = '\0';
200:
201: (void) strcpy (Dish_Home, getenv ("HOME"));
202: (void) strcpy(read_Home, Dish_Home);
203: (void) strcpy(type_Home, Dish_Home);
204:
205: (void) strcat(Dish_Home, ptr);
206: (void) strcat(read_Home, config_dir);
207: (void) strcat(read_Home, read_File);
208: (void) strcat(type_Home, config_dir);
209: (void) strcat(type_Home, type_dir);
210:
211: if (!(dir = opendir(type_Home))) {
212: (void) strcpy(type_Home, isodefile(isode_config_dir,0));
213: (void) strcat(type_Home, type_dir);
214: if(!(dir = opendir(type_Home))) {
215: (void) strcpy(type_Home, "./");
216: (void) strcat(type_Home, isode_config_dir);
217: (void) strcat(type_Home, type_dir);
218: if(!(dir = opendir(type_Home))) {
219: (void) printf("Can't find directory %s!\n", type_dir);
220: quit(1);
221: }
222: }
223: }
224:
225: rewinddir(dir);
226: filt_num = 0;
227: while(dir_ent = readdir(dir)) {
228: if (!(strncmp(dir_ent->d_name, "Type_", 5))) {
229: file_names[filt_num] =
230: (char *) malloc((unsigned int) (strlen(dir_ent->d_name) + strlen(type_Home) + 2) );
231: (void) strcpy(file_names[filt_num], type_Home);
232: (void) strcat(file_names[filt_num], dir_ent->d_name);
233: filt_num++;
234: }
235: }
236: (void) closedir(dir);
237:
238: if ((file = fopen (Dish_Home, "r")) == 0);
239: else {
240: while (fgets (Read_in_Stuff, STRINGLEN, file) != 0) {
241: p = SkipSpace (Read_in_Stuff);
242: if (( *p == '#') || (*p == '\0'))
243: continue; /* ignore comments and blanks */
244:
245: part1 = p;
246: if ((part2 = index (p,':')) == NULLCP)
247: continue; /* ignore it */
248:
249: *part2++ = '\0';
250: part2 = TidyString(part2);
251:
252: if (strcmp (part1, "username") == 0)
253: (void) strcpy (namestr, part2);
254: else if (strcmp (part1, "password") == 0)
255: (void) strcpy (passwd, part2);
256: else if (lexequ (part1, "dsap") == 0)
257: (void) tai_string (part2);
258: else if (lexequ (part1, "isode") == 0) {
259: char * split;
260: if ((split = index (part2,' ')) != NULLCP) {
261: *split++ = 0;
262: (void) isodesetvar (part2,split,0);
263: }
264: } else if (strcmp (part1, "service") == 0)
265: new_service (part2);
266: }
267: isodexport (NULLCP);
268: (void) fclose(file);
269: }
270:
271: if (!(file = fopen(read_Home, "r"))) {
272: (void) strcpy(read_Home, isodefile(isode_config_dir,0));
273: (void) strcat(read_Home, read_File);
274: if (!(file = fopen(read_Home, "r"))) {
275: (void) strcpy(read_Home, "./");
276: (void) strcat(read_Home, isode_config_dir);
277: (void) strcat(read_Home, read_File);
278: if (!(file = fopen(read_Home, "r"))) {
279: (void) printf("Can't find read file (%s)!\n", read_Home);
280: quit(1);
281: }
282: }
283: }
284: load_oid_table("oidtable");
285:
286: while(fgets(Read_in_Stuff, STRINGLEN, file) != 0) {
287: (void) strcpy(stroid_buf, get_strioid(Read_in_Stuff));
288: if (*stroid_buf) {
289: if (!read_types)
290: read_types = as_comp_new(AttrT_new(stroid_buf), NULLAV, NULLACL_INFO);
291: else {
292: read_types2 = as_comp_new(AttrT_new(stroid_buf) ,NULLAV, NULLACL_INFO);
293: read_types = as_merge(read_types, read_types2);
294: }
295: }
296: }
297: (void) fclose(file);
298:
299: for (curr_filt = 0; curr_filt < filt_num; curr_filt++) {
300: if (!(file = fopen(file_names[curr_filt], "r"))) {
301: (void) printf("Can't find file %s!\n", (char *) file_names[curr_filt]);
302: quit(1);
303: }
304: filtvalue[curr_filt] = (char *) malloc(STRINGLEN);
305: *filtvalue[curr_filt] = '\0';
306:
307: yyparse();
308: (void) fclose(file);
309: }
310: filttype[curr_filt] = NULLCP;
311: for (count = 0; count < filt_num; count++)
312: free(file_names[count]);
313:
314: if (!(file = fopen(type_defaults_Home, "r"))) {
315: (void) strcpy(type_defaults_Home, isodefile(isode_config_dir,0));
316: (void) strcat(type_defaults_Home, type_defaults);
317: if (!(file = fopen(type_defaults_Home, "r"))) {
318: (void) strcpy(type_defaults_Home, "./Xd/duaconfig/");
319: (void) strcat(type_defaults_Home, type_defaults);
320: if (!(file = fopen(type_defaults_Home, "r"))) {
321: (void) fprintf(stderr, "Can't open typeDefaults file\n");
322: quit(1);
323: }
324: }
325: }
326:
327: default_num = 0;
328: while (fgets (Read_in_Stuff, STRINGLEN, file) != 0) {
329: p = SkipSpace(Read_in_Stuff);
330: if (( *p == '#') || (*p == '\0'))
331: continue;
332:
333: part1 = p;
334: if ((part2 = index (p,':')) == NULLCP)
335: continue;
336:
337: end = part2 - 1;
338: while (isspace(*end)) end--;
339: *++end = '\0';
340:
341: *part2++ = '\0';
342:
343: while (isspace(*part2)) part2++;
344: end = part2;
345:
346: while (!isspace(*end) && *end != ',' && *end != ':') end++;
347:
348: count = 0;
349: while (*part2 != ':') {
350: n = 0;
351: while (n < filt_num && strncmp(filttype[n], part2,
352: (int) (end - part2))) n++;
353:
354: if (n == filt_num) {
355: (void) fprintf(stderr, "Parsing error in typeDefaults file!");
356: quit(1);
357: } else {
358: tempints[count] = n;
359: count++;
360: part2 = end;
361: while (!isalpha(*part2) && *part2 != ':' && part2 != '\0') part2++;
362:
363: if (*part2 == '\0') {
364: (void) fprintf(stderr, "Parsing error in typeDefaults file!");
365: quit(1);
366: }
367:
368: if (*part2 != ':') {
369: while (!isalpha(*part2)) part2++;
370: end = part2;
371: while (!isspace(*end) && *end != ',' &&
372: *end != ':' && *end != '\0') end++;
373: if (*end == '\0') {
374: (void) fprintf(stderr, "Parsing error in typeDefaults file!");
375: quit(1);
376: }
377: } else end = part2;
378: }
379: }
380:
381: if (*end == ':') {
382: while(isspace(*++end));
383: p = end;
384: while(!isspace(*++end));
385: *end = '\0';
386:
387: n = 0;
388: while (n < filt_num && strcmp(filttype[n], p)) n++;
389:
390: if (n == filt_num) {
391: (void) fprintf(stderr, "Parsing error in typeDefaults file!");
392: quit(1);
393: } else {
394: num = 0;
395: while (num < count && n != tempints[num]) num++;
396: if (num == count) {
397: (void) fprintf(stderr, "Parsing error in typeDefaults file!");
398: quit(1);
399: }
400: }
401:
402: defaults[default_num] = n;
403:
404: levels[default_num] = malloc((unsigned int) (strlen(part1) + 1) );
405: (void) strcpy(levels[default_num], part1);
406: available_types[default_num] =
407: (int *) malloc((unsigned int) (sizeof(int) * (count+1)) );
408:
409: for (n = 0; n < count; n++)
410: available_types[default_num][n] = tempints[n];
411:
412: available_types[default_num][n] = -1;
413: default_num++;
414: }
415: }
416: av_typeindx = available_types[0];
417: typeindx = defaults[0];
418: }
419:
420: cnnct_bind()
421: {
422: struct ds_bind_arg bindarg;
423: struct ds_bind_arg bindresult;
424: struct ds_bind_error binderr;
425: extern char * dsa_address,
426: * myname;
427: extern char * tailfile;
428: FILE * fp;
429: char buf [BUFSIZ];
430:
431: if (*passwd != 0)
432: (void) strcpy(bindpass,"******");
433: else
434: bindpass[0] = '\0';
435: /* set dsa_address */
436: dsa_address = NULLCP;
437: /* read tailor file to get address */
438: if( (fp = fopen(isodefile(tailfile,0), "r")) == (FILE *)NULL) {
439: (void) printf ("Cannot open tailor file %s\n",isodefile(tailfile,0));
440: return;
441: }
442: while(fgets(buf, sizeof(buf), fp) != NULLCP)
443: if ( (*buf != '#') && (*buf != '\n') )
444: (void) tai_string (buf);
445:
446: (void) fclose(fp);
447:
448: if (dsa_address == NULLCP)
449: dsa_address = myname;
450:
451: /* set password */
452: if (bindpass[0] != 0) {
453: if (strcmp (bindpass,"******") != 0)
454: (void) strcpy (passwd,bindpass);
455: } else
456: passwd[0] = 0;
457:
458: /* now bind */
459: bindarg.dba_version = DBA_VERSION_V1988;
460: if (passwd[0] == 0) {
461: bindarg.dba_passwd_len = 0;
462: bindarg.dba_passwd [0] = '\0';
463: } else {
464: bindarg.dba_passwd_len = strlen (passwd);
465: (void) strcpy (bindarg.dba_passwd,passwd);
466: }
467:
468: bindarg.dba_dn = (*namestr == 0? NULLDN: str2dn(namestr));
469:
470: if (ds_bind (&bindarg,&binderr,&bindresult) != DS_OK) {
471: (void) printf (binderr.dbe_type == DBE_TYPE_SECURITY?
472: "Bind security error - Check name and pasword.\n":
473: "Bind service error - Can't contact DSA!\n");
474: quit(1);
475: } else {
476: user_name = bindarg.dba_dn;
477: (void) strcpy (buf, "TERM");
478: if(local_dit && *local_dit)
479: (void) strcpy(base_path, local_dit);
480:
481: #ifndef NO_STATS
482: LLOG (log_stat,LLOG_NOTICE,("bound ('%s' to '%s')",namestr,dsa_address));
483: #endif
484: #ifndef NO_STATS
485: LLOG (log_stat,LLOG_NOTICE,("xd bound to directory"));
486: #endif
487:
488: make_friendly(friendly_base_path, base_path);
489: set_default_type();
490: }
491: entry_number = 0;
492: back_buf_num = 0;
493: backseq = dnseq = NULLDS;
494: }
495:
496: rd_start()
497: {
498: struct ds_read_arg read_arg;
499: struct ds_read_result result;
500: struct DSError error;
501: Entry read_entry;
502:
503: if (*friendly_base_path == 'T') {
504: free_seq(dnseq);
505: dnseq = NULLDS;
506: entry_number = 0;
507: return;
508: }
509:
510:
511: if (get_default_service (&read_arg.rda_common) != 0) {
512: xprint ("Default service error -> check your .quipurc\n");
513: return ;
514: }
515:
516: read_arg.rda_eis.eis_allattributes = FALSE;
517: read_arg.rda_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
518: read_arg.rda_eis.eis_select = read_types;
519:
520: read_arg.rda_common.ca_servicecontrol.svc_options = 1;
521: read_arg.rda_object = (*friendly_base_path != 'T'? str2dn(base_path): NULLDN);
522: if ((read_entry =
523: local_find_entry (read_arg.rda_object, FALSE)) != NULLENTRY) {
524: read_entry->e_attributes = sort_attrs(read_entry->e_attributes);
525: read_print (as_print, (caddr_t) read_entry->e_attributes);
526: return;
527: }
528:
529: #ifndef NO_STATS
530: LLOG (log_stat,LLOG_NOTICE,("read +%s",base_path));
531: #endif
532:
533: if (ds_read (&read_arg,&error,&result) != DS_OK) {
534: /* deal with error */
535: Clear_Results();
536: xprint("Read error due to:\n");
537: quipu_error(&error);
538: } else {
539: /* use data */
540: if (result.rdr_entry.ent_attr == NULLATTR) {
541: free_seq(dnseq);
542: dnseq = NULLDS;
543: entry_number = 0;
544: xprint("No attributes found! Sorry.");
545: return;
546: }
547: xprint("Result of look up ...\n");
548:
549: if (result.rdr_common.cr_aliasdereferenced)
550: xprint("Alias dereferenced)\n");
551:
552: result.rdr_entry.ent_attr = sort_attrs(result.rdr_entry.ent_attr);
553: cache_entry(&(result.rdr_entry), TRUE, TRUE);
554: read_print(as_print, (caddr_t) result.rdr_entry.ent_attr);
555: }
556: }
557:
558: back_start()
559: {
560: if (!back_buf_num) {
561: xprint("You haven't been anywhere yet!\n");
562: return;
563: }
564: element_num = back_buf_num;
565: showseq = backseq;
566: }
567:
568: widen()
569: {
570: register char *str, *sptr;
571: int count = 0;
572:
573: str = get_from_seq(count+1, backseq);
574: while (count < back_buf_num && strcmp(str, base_path)){
575: count++;
576: str = get_from_seq(count+1, backseq);
577: }
578: if (count == back_buf_num) {
579: add_seq(&backseq, base_path);
580: back_buf_num++;
581: }
582:
583: str = base_path;
584: if (*str != 'T') {
585:
586: for (sptr = str; *sptr != '\0'; sptr++)
587: if (*sptr == '@') str = sptr;
588:
589: sptr = str;
590: typetoggled = 0;
591:
592: if (str != base_path) {
593: if (*--sptr == ' ')
594: str = sptr;
595: *str = '\0';
596: } else
597: (void) strcpy(base_path, "The World");
598:
599: make_friendly(friendly_base_path, base_path);
600: rd_start();
601: set_default_type();
602: }
603: }
604:
605: set_default_type()
606: {
607: int count;
608: DN base_name;
609:
610: if (*base_path != 'T') {
611: base_name = str2dn(base_path);
612: while (base_name->dn_parent) base_name = base_name->dn_parent;
613: for (count = 0; count < default_num &&
614: strcmp(levels[count] ,base_name->dn_rdn->rdn_at->
615: oa_ot.ot_stroid);
616: count++);
617:
618: if (count < default_num) {
619: av_typeindx = available_types[count];
620: typeindx = defaults[count];
621: } else {
622: av_typeindx = available_types[0];
623: typeindx = defaults[0];
624: }
625: } else {
626: for(count = 0; count < default_num && strcmp(levels[count], "@"); count++);
627: if (count < default_num) {
628: av_typeindx = available_types[count];
629: typeindx = defaults[count];
630: } else {
631: av_typeindx = available_types[0];
632: typeindx = defaults[0];
633: }
634: }
635:
636: make_friendly(friendly_base_path, base_path);
637: typetoggled = 0;
638: Set_Search_Type(filttype[typeindx]); /* change string in widget */
639: }
640:
641: /* These are the functions called by the list level widgets */
642:
643: list_start()
644: {
645: struct ds_search_arg search_arg;
646: struct ds_search_result result;
647: struct DSError error;
648:
649: xprint("OK, listing.");
650: xprint("Chugging along.....");
651:
652: if (get_default_service (&search_arg.sra_common) != 0) {
653: xprint ("Default service error -> check your .quipurc\n");
654: return ;
655: }
656:
657: search_arg.sra_common.ca_servicecontrol.svc_sizelimit = asizelimit;
658: search_arg.sra_common.ca_servicecontrol.svc_options = 1;
659: search_arg.sra_baseobject = (*base_path != 'T'?
660: str2dn (base_path):
661: NULLDN);
662: search_arg.sra_eis.eis_allattributes = FALSE;
663: search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
664: search_arg.sra_eis.eis_select = read_types;
665: search_arg.sra_subset = SRA_ONELEVEL;
666:
667: search_arg.sra_filter = filter_alloc();
668: search_arg.sra_filter->flt_type = FILTER_NOT;
669: search_arg.sra_filter->flt_next = NULLFILTER;
670: search_arg.sra_filter->flt_un.flt_un_filter = filter_alloc();
671: search_arg.sra_filter->flt_un.flt_un_filter->flt_type = FILTER_ITEM;
672: search_arg.sra_filter->flt_un.flt_un_filter->flt_next = NULLFILTER;
673: search_arg.sra_filter->flt_un.flt_un_filter->flt_un.flt_un_item.fi_type
674: = FILTERITEM_EQUALITY;
675:
676: search_arg.sra_filter->flt_un.flt_un_filter->flt_un.flt_un_item.fi_un.
677: fi_un_ava.ava_type = AttrT_new("2.5.4.0");
678:
679: search_arg.sra_filter->flt_un.flt_un_filter->flt_un.flt_un_item.fi_un.
680: fi_un_ava.ava_value =
681: str2AttrV("dsa", search_arg.sra_filter->flt_un.flt_un_filter->
682: flt_un.flt_un_item.fi_un.fi_un_ava.ava_type->
683: oa_syntax);
684:
685: #ifndef NO_STATS
686: LLOG (log_stat,LLOG_NOTICE,("search +%s,extent %d, val objectClass != dsa",base_path,search_arg.sra_subset));
687: #endif
688:
689:
690: if (search_arg.sra_filter->flt_un.flt_un_filter->flt_un.flt_un_item.
691: fi_un.fi_un_ava.ava_value == NULLAttrV) {
692: xprint("No can do. Sorry!");
693: } else if (ds_search (&search_arg,&error,&result) != DS_OK) {
694: /* deal with error */
695: free_seq(dnseq);
696: dnseq = NULLDS;
697: entry_number = 0;
698: xprint("Search error due to:\n");
699: quipu_error(&error);
700: } else {
701: correlate_search_results (&result);
702: if (result.CSR_entries != NULLENTRYINFO) {
703: register EntryInfo *ptr;
704:
705: xprint ("Result of search ...\n");
706: if (result.CSR_common.cr_aliasdereferenced) {
707: xprint ("(Alias dereferenced - object is ");
708: quipu_print (dn_print, (caddr_t) result.CSR_object);
709: dn_free (result.CSR_object);
710: xprint (")\n");
711: }
712:
713: free_seq(dnseq);
714: dnseq = NULLDS;
715: entry_number = 0;
716:
717: for (ptr = result.CSR_entries; ptr != NULLENTRYINFO;
718: ptr = ptr->ent_next) {
719: entry_number++;
720: dn2str ((caddr_t)ptr->ent_dn, goto_path);
721: add_seq (&dnseq, goto_path);
722: cache_entry (ptr,TRUE,TRUE);
723: }
724:
725: if (entry_number == 1)
726: get_listed_object(1);
727:
728: } else if (result.CSR_limitproblem != LSR_TIMELIMITEXCEEDED) {
729: free_seq(dnseq);
730: dnseq = NULLDS;
731: entry_number = 0;
732: xprint("Nothing found. Sorry!");
733: }
734:
735: if(result.CSR_limitproblem != LSR_NOLIMITPROBLEM) {
736: if(result.CSR_limitproblem == LSR_TIMELIMITEXCEEDED) {
737: free_seq(dnseq);
738: dnseq = NULLDS;
739: entry_number = 0;
740: xprint("(Time limit exceeded)");
741: } else
742: xprint("(Size limit exceeded)");
743: }
744: entryinfo_free(result.CSR_entries, 0);
745: }
746:
747: filter_free(search_arg.sra_filter);
748: }
749:
750: rdn2str(ptr,cptr)
751: caddr_t ptr;
752: char * cptr;
753: {
754: PS ps;
755: char buffer [RESBUF];
756:
757: if ((ps = ps_alloc(str_open)) == NULLPS) {
758: return ;
759: }
760: if (str_setup(ps, buffer, RESBUF, 1) == NOTOK) {
761: return ;
762: }
763: rdn_print(ps, (RDN) ptr, READOUT);
764:
765: ps_free(ps);
766: *ps->ps_ptr = 0;
767:
768: (void) strcpy(cptr, buffer);
769: }
770:
771:
772: /* search ... */
773:
774: srch_start()
775: {
776: struct ds_search_arg search_arg;
777: struct ds_search_result result;
778: struct DSError error;
779: char *str = base_path;
780:
781: if (*mvalue == '\0') {
782: list_start();
783: return;
784: }
785:
786: xprint("OK. Starting search.\n");
787:
788: if (get_default_service (&search_arg.sra_common) != 0) {
789: xprint ("Default service error -> check your .quipurc\n");
790: return ;
791: }
792:
793: search_arg.sra_common.ca_servicecontrol.svc_sizelimit = asizelimit;
794: search_arg.sra_common.ca_servicecontrol.svc_options = 1;
795: search_arg.sra_baseobject = (*base_path != 'T'?
796: str2dn (base_path):
797: NULLDN);
798: search_arg.sra_eis.eis_allattributes = FALSE;
799: search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
800: search_arg.sra_eis.eis_select = read_types;
801:
802: while (*str != '\0' && *str != '@') str++;
803:
804: search_arg.sra_subset = ((*base_path != 'T' && *str == '@')?
805: SRA_WHOLESUBTREE:
806: SRA_ONELEVEL);
807: search_arg.sra_filter =
808: make_filter(filt_arr[typeindx]);
809:
810: #ifndef NO_STATS
811: LLOG (log_stat,LLOG_NOTICE,("search +%s, extent %d, val %s",base_path,search_arg.sra_subset,mvalue));
812: #endif
813:
814:
815: if(ds_search (&search_arg,&error,&result) != DS_OK) {
816: /* deal with error */
817: free_seq(dnseq);
818: dnseq = NULLDS;
819: entry_number = 0;
820: xprint(" Search error due to:\n ");
821: quipu_error(&error);
822: } else {
823: correlate_search_results (&result);
824:
825: if (result.CSR_entries != NULLENTRYINFO) {
826: register EntryInfo *ptr;
827:
828: if (result.CSR_common.cr_aliasdereferenced) {
829: xprint (" (Alias dereferenced - object is ");
830: quipu_print (dn_print, (caddr_t) result.CSR_object);
831: dn_free (result.CSR_object);
832: xprint (")\n");
833: }
834:
835: free_seq(dnseq);
836: dnseq = NULLDS;
837: entry_number = 0;
838: for (ptr = result.CSR_entries;
839: ptr != NULLENTRYINFO; ptr = ptr->ent_next){
840: entry_number++;
841: dn2str ((caddr_t) ptr->ent_dn, goto_path);
842: add_seq (&dnseq, goto_path);
843: cache_entry (ptr,TRUE,TRUE);
844: }
845:
846: if (entry_number == 1)
847: get_listed_object(1);
848:
849: } else if(result.CSR_limitproblem != LSR_TIMELIMITEXCEEDED) {
850: free_seq(dnseq);
851: dnseq = NULLDS;
852: entry_number = 0;
853: xprint("Nothing found using current search parameters. Sorry!\n");
854: }
855:
856: if(result.CSR_limitproblem != LSR_NOLIMITPROBLEM)
857: if(result.CSR_limitproblem == LSR_TIMELIMITEXCEEDED) {
858: free_seq(dnseq);
859: dnseq = NULLDS;
860: entry_number = 0;
861: xprint("(Time limit exceeded)");
862: } else
863: xprint("(Size limit exceeded)");
864:
865: entryinfo_free(result.CSR_entries, 0);
866: }
867: filter_free(search_arg.sra_filter);
868: }
869:
870: static dn2str (ptr,cptr)
871: caddr_t ptr;
872: char * cptr;
873: {
874: PS ps;
875: char buffer [RESBUF];
876:
877: if((ps = ps_alloc(str_open)) == NULLPS) return ;
878:
879: if(str_setup(ps, buffer, RESBUF, 1) == NOTOK) return ;
880:
881: dn_print(ps, (DN) ptr, EDBOUT);
882: *ps->ps_ptr = 0;
883:
884: ps_free (ps);
885:
886: (void) strcpy(cptr, buffer);
887: }
888:
889:
890: read_print(func,ptr)
891: int (*func) ();
892: caddr_t ptr;
893: {
894: PS ps;
895: char buffer [RESBUF];
896: char save;
897: int i, size;
898: register char *str, *sptr;
899:
900: if ((ps = ps_alloc (str_open)) == NULLPS) return ;
901:
902: if (str_setup (ps,buffer,RESBUF,1) == NOTOK) return ;
903:
904: (*func) (ps, ptr, READOUT);
905: *ps->ps_ptr = 0;
906:
907: ps_free(ps);
908: str = buffer ;
909: sptr = str;
910: size = strlen(buffer);
911:
912: free_seq(dnseq);
913: dnseq = NULLDS;
914: entry_number = 0;
915:
916: Switch_Off_Result_Update();
917:
918: for (i = 0; i <= size; i++, sptr++)
919: if (*sptr == '\n' || *sptr == '\0') {
920: entry_number++;
921: save = *sptr ;
922: *sptr = '\0';
923: xprint(str);
924: str = sptr+1;
925: *sptr = save;
926: }
927:
928: Switch_On_Result_Update();
929: }
930:
931: quipu_print (func,ptr)
932: int (*func) (); /* assumes func (PS ,dataptr,(int) format); */
933: caddr_t ptr;
934: {
935: /* log info to pstream */
936: PS ps;
937: char buffer [RESBUF];
938: register char *str, *sptr;
939: char save;
940:
941: if ((ps = ps_alloc (str_open)) == NULLPS) return ;
942:
943: if (str_setup (ps,buffer,RESBUF,1) == NOTOK) return ;
944:
945: (*func) (ps,ptr,READOUT);
946: *ps->ps_ptr = 0;
947:
948: ps_free (ps);
949:
950: /* print in blocks of 100 bytes-larger seems too much for curses*/
951: str = buffer;
952: do {
953: for (sptr = str; *sptr != '\0'; sptr++);
954: save = *sptr;
955: *sptr = 0;
956: xprint (str);
957: *sptr = save;
958: str = sptr;
959: } while (*sptr != '\0');
960: }
961:
962: quipu_error (err)
963: struct DSError * err;
964: {
965: PS ps;
966: char buffer [RESBUF];
967:
968: if ((ps = ps_alloc(str_open)) == NULLPS) return ;
969:
970: if (str_setup (ps, buffer, RESBUF, 1) == NOTOK) return ;
971: ds_error(ps, err);
972:
973: *ps->ps_ptr = 0;
974: xprint(buffer);
975: }
976:
977: free_all()
978: {
979: int count;
980:
981: free_seq(dnseq);
982: free_seq(backseq);
983: free_table(symtab);
984: for (count = 0; count < filt_num; count++) {
985: free_filt(filt_arr[count]);
986: free(filtvalue[count]);
987: free(filttype[count]);
988: }
989: }
990:
991: get_listed_object(entrynum)
992: int entrynum;
993: {
994: int count = 0;
995: char *sptr, *str;
996:
997: if (entrynum > element_num) return;
998:
999: if (sptr = get_from_seq (entrynum, showseq)) {
1000:
1001: str = get_from_seq(count+1, backseq);
1002: while (count < back_buf_num && strcmp(str, base_path)){
1003: count++;
1004: str = get_from_seq(count+1, backseq);
1005: }
1006:
1007: if (count == back_buf_num) {
1008: add_seq(&backseq, base_path);
1009: back_buf_num++;
1010: }
1011:
1012: (void) strcpy(base_path, sptr);
1013: make_friendly(friendly_base_path, base_path);
1014: rd_start();
1015: typetoggled = 0;
1016: set_default_type();
1017: }
1018: *srchvalue = '\0';
1019: }
1020:
1021: make_friendly(fstr, str)
1022: char *fstr;
1023: register char *str;
1024: {
1025: register char *end_ptr;
1026: char save;
1027:
1028: *fstr = '\0';
1029: if (!strcmp(str, "The World")) {
1030: (void) strcpy(fstr, str);
1031: return;
1032: }
1033:
1034: while (*str != '\0') {
1035: while (*str != '=') str++;
1036: while (*str == ' ') str++;
1037:
1038: end_ptr = ++str;
1039: while (*end_ptr != '@' && *end_ptr != '\0') end_ptr++;
1040: save = *end_ptr;
1041: *end_ptr = '\0';
1042: if (*fstr == '\0')
1043: (void) strcpy(fstr, str);
1044: else
1045: (void) strcat(fstr, str);
1046: *end_ptr = save;
1047: str = end_ptr;
1048: if (*str != '\0')
1049: (void) strcat(fstr, ", ");
1050: }
1051: }
1052:
1053:
1054:
1055: goto_addr()
1056: {
1057: set_default_type();
1058: rd_start();
1059: }
1060:
1061: struct attrcomp *
1062: sort_attrs(entry_attrs)
1063: struct attrcomp *entry_attrs;
1064: {
1065: struct attrcomp *last, *next, *curr, *first, *firstn;
1066:
1067: first = curr = entry_attrs;
1068: firstn = last = next = 0;
1069:
1070: while (curr)
1071: if (!strcmp("2.5.4.3", curr->attr_type->oa_ot.ot_stroid) ||
1072: !strcmp("2.5.4.4", curr->attr_type->oa_ot.ot_stroid) ||
1073: !strcmp("0.9.2342.19200300.100.1.3",
1074: curr->attr_type->oa_ot.ot_stroid) ||
1075: !strcmp("0.9.2342.19200300.100.1.2",
1076: curr->attr_type->oa_ot.ot_stroid) ||
1077: !strcmp("2.5.4.20", curr->attr_type->oa_ot.ot_stroid)) {
1078:
1079: if (first == curr) first = curr->attr_link;
1080:
1081: if (next)
1082: next->attr_link = curr;
1083: else
1084: firstn = curr;
1085:
1086: next = curr;
1087:
1088: if (last)
1089: last->attr_link = curr->attr_link;
1090:
1091: curr = curr->attr_link;
1092: next->attr_link = 0;
1093: } else {
1094: last = curr;
1095: curr = curr->attr_link;
1096: }
1097:
1098: if (next) {
1099: next->attr_link = first;
1100: return firstn;
1101: } else
1102: return first;
1103: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.