|
|
1.1 root 1:
2: #ifndef lint
3: static char *rcsid = "$Header: /f/osi/others/quipu/uips/pod/RCS/calls.c,v 7.2 90/07/27 08:45:32 mrose Exp $";
4: #endif
5:
6: /*
7: * $Header: /f/osi/others/quipu/uips/pod/RCS/calls.c,v 7.2 90/07/27 08:45:32 mrose Exp $
8: */
9:
10: /*
11: * $Log: calls.c,v $
12: * Revision 7.2 90/07/27 08:45:32 mrose
13: * update
14: *
15: * Revision 7.1 90/07/09 14:41:29 mrose
16: * sync
17: *
18: * Revision 7.0 90/06/12 13:15:48 mrose
19: * *** empty log message ***
20: *
21: * Revision 1.5 90/04/26 10:21:02 emsrdsm
22: * *** empty log message ***
23: *
24: * Revision 1.4 90/04/25 13:46:44 emsrdsm
25: * i) lint'ed
26: *
27: * Revision 1.3 90/04/20 10:27:45 emsrdsm
28: * *** empty log message ***
29: *
30: * Revision 1.2 90/04/18 18:47:56 emsrdsm
31: * i) added logging
32: *
33: * Revision 1.1 90/04/10 16:43:29 emsrdsm
34: * Initial revision
35: *
36: */
37:
38: #include "manifest.h"
39: #include <malloc.h>
40: #include <string.h>
41: #include <ctype.h>
42:
43: #include "quipu/util.h"
44: #include "quipu/common.h"
45: #include "quipu/entry.h"
46:
47: #include "usr.dirent.h"
48: #include "tailor.h"
49: #include "sequence.h"
50: #include "filt.h"
51: #include "y.tab.h"
52: #include "symtab.h"
53: #include "defs.h"
54:
55: struct attrcomp * sort_attrs();
56: static dn2str ();
57:
58: #define RESBUF 10000
59:
60: extern Filter make_filter();
61: extern void xprint();
62:
63: typedef enum {rfc822, greybook} mailtype;
64:
65: mailtype mailformat = rfc822;
66: extern mode listmode;
67:
68: PS opt;
69: Attr_Sequence read_types = 0, read_types2 = 0, oclass = 0;
70:
71: table_entry symtab = 0;
72: int typetoggled = 0;
73:
74: int dn_print (), rdn_print(), as_print(), avs_comp_print();
75:
76: char bound = FALSE; /* indication of wether bound */
77: char * TidyString();
78:
79: D_seq dnseq = NULLDS, backseq = NULLDS, showseq = NULLDS;
80: int entry_number, back_buf_num, dn_number;
81:
82: int two_passes = 0;
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: typedef struct friendlyName {
114: D_seq names;
115: char fname[256];
116: } *fName;
117:
118: unsigned int fname_num = 0;
119: fName name_map[MAXTYPES];
120:
121: #ifndef NO_STATS
122: extern LLog *log_stat;
123: #endif
124:
125: /* These are used as the data for the binding connection */
126: char passwd[STRINGLEN];
127:
128: extern char * myname;
129: extern int sizelimit;
130: extern char *local_dit;
131:
132: DN user_name;
133:
134: char * addobj = NULLCP;
135: Filter search_filter;
136: FILE *file;
137: char *file_names[MAXTYPES];
138: char dua_help_dir[256];
139:
140: char *get_strioid(ptr)
141: register char *ptr;
142: {
143: register char *end_ptr;
144:
145: while(*ptr == '"') ptr++;
146: while(*ptr != '"') ptr++;
147:
148: while(*ptr > '9' || *ptr < '0') ptr++;
149:
150: end_ptr = ptr;
151: while(*end_ptr != '\n') end_ptr++;
152:
153: *end_ptr = '\0';
154: return ptr;
155: }
156:
157:
158: user_tailor()
159: {
160: char *part1;
161: char *part2;
162: char *getenv ();
163: char *ptr = "/.quipurc";
164: char *config_dir = "/.duaconfig/";
165: char *type_dir = "filterTypes/";
166: char *read_File = "readTypes";
167: char *friendly_File = "friendlyNames";
168: char *options = "podOptions";
169: char *type_defaults = "typeDefaults";
170:
171: char Dish_Home[BUFSIZ];
172: char read_Home[BUFSIZ];
173: char type_Home[BUFSIZ];
174: char optionsHome[BUFSIZ];
175: char friendly_Home[BUFSIZ];
176: char type_defaults_Home[BUFSIZ];
177: char dua_config_dir[BUFSIZ];
178:
179: char stroid_buf[BUFSIZ];
180: char *str, *sptr;
181: char save;
182:
183: DIR *dir;
184:
185: struct dirent *dir_ent;
186:
187: char Read_in_Stuff[STRINGLEN];
188: char *p,
189: *TidyString(),
190: *SkipSpace(),
191: *end;
192:
193: int count, n, num;
194: int tempints[MAXTYPES];
195:
196: #ifndef NO_STATS
197: ll_hdinit (log_stat,"sd");
198: #endif
199:
200: (void) strcpy(dua_config_dir, isodefile("xd/", 0));
201: (void) strcpy(dua_help_dir, dua_config_dir);
202:
203: (void) strcat(dua_config_dir, "duaconfig/");
204: (void) strcat(dua_help_dir, "podHelpdir/");
205:
206: if ((opt = ps_alloc (std_open)) == NULLPS)
207: fatal (-1,"ps_alloc failed");
208: if (std_setup (opt,stdout) == NOTOK)
209: fatal (-1,"std_setup failed");
210:
211: namestr[0] = '\0';
212: *passwd = '\0';
213: cache[0] = '\0';
214:
215: (void) strcpy (Dish_Home, getenv ("HOME"));
216: (void) strcpy(read_Home, Dish_Home);
217: (void) strcpy(type_Home, Dish_Home);
218: (void) strcpy(friendly_Home, Dish_Home);
219: (void) strcpy(optionsHome, Dish_Home);
220: (void) strcpy(type_defaults_Home, Dish_Home);
221:
222: (void) strcat(Dish_Home, ptr);
223: (void) strcat(read_Home, config_dir);
224: (void) strcat(read_Home, read_File);
225: (void) strcat(type_Home, config_dir);
226: (void) strcat(type_Home, type_dir);
227: (void) strcat(friendly_Home, config_dir);
228: (void) strcat(friendly_Home, friendly_File);
229: (void) strcat(optionsHome, config_dir);
230: (void) strcat(optionsHome, options);
231: (void) strcat(type_defaults_Home, config_dir);
232: (void) strcat(type_defaults_Home, type_defaults);
233:
234: if (!(dir = opendir(type_Home))) {
235: (void) strcpy(type_Home, dua_config_dir);
236: (void) strcat(type_Home, type_dir);
237: if(!(dir = opendir(type_Home))) {
238: (void) strcpy(type_Home, "./Xd/duaconfig/");
239: (void) strcat(type_Home, type_dir);
240: if (!(dir = opendir(type_Home))) {
241: (void) fprintf(stderr, "Can't find directory %s!\n", type_dir);
242: quit(1);
243: }
244: }
245: }
246:
247: rewinddir(dir);
248: filt_num = 0;
249: while(dir_ent = readdir(dir)) {
250: if (!(strncmp(dir_ent->d_name, "Type_", 5))) {
251: file_names[filt_num] =
252: (char *) malloc((unsigned int)
253: (strlen(dir_ent->d_name) +
254: strlen(type_Home) + 2));
255: (void) strcpy(file_names[filt_num], type_Home);
256: (void) strcat(file_names[filt_num], dir_ent->d_name);
257: filt_num++;
258: }
259: }
260: (void) closedir(dir);
261:
262: if ((file = fopen (Dish_Home, "r")) == 0);
263: else {
264: while (fgets (Read_in_Stuff, STRINGLEN, file) != 0) {
265: p = SkipSpace (Read_in_Stuff);
266: if (( *p == '#') || (*p == '\0'))
267: continue; /* ignore comments and blanks */
268:
269: part1 = p;
270: if ((part2 = index (p,':')) == NULLCP)
271: continue; /* ignore it */
272:
273: *part2++ = '\0';
274: part2 = TidyString(part2);
275:
276: if (strcmp (part1, "username") == 0)
277: (void) strcpy (namestr, part2);
278: else if (strcmp (part1, "password") == 0)
279: (void) strcpy (passwd, part2);
280: else if (strcmp(part1, "prefergreybook") == 0)
281: mailformat = greybook;
282: else if (lexequ (part1, "dsap") == 0)
283: (void) tai_string (part2);
284: else if (lexequ (part1, "isode") == 0) {
285: char * split;
286: if ((split = index (part2,' ')) != NULLCP) {
287: *split++ = 0;
288: (void) isodesetvar (part2,split,0);
289: }
290: } else if (strcmp (part1, "service") == 0)
291: new_service (part2);
292: }
293: isodexport (NULLCP);
294: (void) fclose(file);
295: }
296:
297: if ((file = fopen(optionsHome, "r")) == 0) {
298: (void) strcpy(optionsHome, dua_config_dir);
299: (void) strcat(optionsHome, options);
300: if ((file = fopen(optionsHome, "r")) == 0) {
301: (void) strcpy(optionsHome, "./Xd/duaconfig/");
302: (void) strcat(optionsHome, options);
303: if ((file = fopen(optionsHome, "r")) == 0) {
304: (void) fprintf(stderr, "Can't find options file (%s)!\n", options);
305: }
306: }
307: }
308:
309: if (file) {
310: while (fgets (Read_in_Stuff, STRINGLEN, file) != 0) {
311: p = SkipSpace (Read_in_Stuff);
312: if (( *p == '#') || (*p == '\0'))
313: continue; /* ignore comments and blanks */
314:
315: part1 = p;
316: if ((part2 = index (p,':')) == NULLCP)
317: continue; /* ignore it */
318:
319: *part2++ = '\0';
320: part2 = TidyString(part2);
321:
322: if (strcmp (part1, "listmode") == 0)
323: if (strcmp (part2, "one") == 0)
324: listmode = one;
325: else
326: listmode = many;
327: }
328: }
329: if (!(file = fopen(read_Home, "r"))) {
330: (void) strcpy(read_Home, dua_config_dir);
331: (void) strcat(read_Home, read_File);
332: if (!(file = fopen(read_Home, "r"))) {
333: (void) strcpy(read_Home, "./Xd/duaconfig/");
334: (void) strcat(read_Home, read_File);
335: if (!(file = fopen(read_Home, "r"))) {
336: (void) fprintf(stderr, "Can't find read file (%s)!\n", read_Home);
337: quit(1);
338: }
339: }
340: }
341:
342: while(fgets(Read_in_Stuff, STRINGLEN, file) != 0) {
343: (void) strcpy(stroid_buf, get_strioid(Read_in_Stuff));
344: if (*stroid_buf) {
345: if (!read_types)
346: read_types = as_comp_new(AttrT_new(stroid_buf), NULLAV, NULLACL_INFO);
347: else {
348: read_types2 = as_comp_new(AttrT_new(stroid_buf) ,NULLAV, NULLACL_INFO);
349: read_types = as_merge(read_types, read_types2);
350: }
351: }
352: }
353: (void) fclose(file);
354:
355: if (!(file = fopen(friendly_Home, "r"))) {
356: (void) strcpy(friendly_Home, dua_config_dir);
357: (void) strcat(friendly_Home, friendly_File);
358: if (!(file = fopen(friendly_Home, "r"))) {
359: (void) strcpy(friendly_Home, "./Xd/duaconfig/");
360: (void) strcat(friendly_Home, friendly_File);
361: if (!(file = fopen(friendly_Home, "r"))) {
362: (void) fprintf(stderr, "Can't find read file (%s)!\n", friendly_Home);
363: quit(1);
364: }
365: }
366: }
367:
368: name_map[fname_num] = 0;
369: while(fgets(Read_in_Stuff, STRINGLEN, file) != 0) {
370: if (*Read_in_Stuff != '#') {
371: sptr = str = Read_in_Stuff;
372: while (*sptr != ':' && !isspace(*sptr) && sptr != '\0') {
373: while (!isalnum(*sptr)) sptr++;
374: str = sptr;
375: while (*str != ' ' && *str != ',' && *str != ':') str++;
376: save = *str;
377: *str = '\0';
378:
379: if (!name_map[fname_num]) {
380: name_map[fname_num] = (fName) malloc(sizeof(struct friendlyName));
381: name_map[fname_num]->names = 0;
382: }
383:
384: add_seq(&name_map[fname_num]->names, sptr);
385: *str = save;
386: sptr = str;
387: while (*sptr != ',' && *sptr != ':') sptr++;
388: }
389:
390: while (!isalpha(*sptr) && *sptr != '\0') sptr++;
391:
392: str = sptr;
393: while (*str != '\0' && *str != '\n') str++;
394: *str = '\0';
395:
396: if (name_map[fname_num]) {
397: (void) strcpy(name_map[fname_num]->fname, sptr);
398: fname_num++;
399: name_map[fname_num] = 0;
400: }
401: }
402: }
403:
404: for (curr_filt = 0; curr_filt < filt_num; curr_filt++) {
405: if (!(file = fopen(file_names[curr_filt], "r"))) {
406: (void) fprintf(stderr, "Can't find file %s!\n", file_names[curr_filt]);
407: quit(1);
408: }
409: filtvalue[curr_filt] = (char *) malloc(STRINGLEN);
410: *filtvalue[curr_filt] = '\0';
411:
412: (void) yyparse();
413: (void) fclose(file);
414: }
415: filttype[curr_filt] = NULLCP;
416: for (count = 0; count < filt_num; count++)
417: free(file_names[count]);
418:
419: if (!(file = fopen(type_defaults_Home, "r"))) {
420: (void) strcpy(type_defaults_Home, dua_config_dir);
421: (void) strcat(type_defaults_Home, type_defaults);
422: if (!(file = fopen(type_defaults_Home, "r"))) {
423: (void) strcpy(type_defaults_Home, "./Xd/duaconfig/");
424: (void) strcat(type_defaults_Home, type_defaults);
425: if (!(file = fopen(type_defaults_Home, "r"))) {
426: (void) fprintf(stderr, "Can't open typeDefaults file\n");
427: quit(1);
428: }
429: }
430: }
431:
432: default_num = 0;
433: while (fgets (Read_in_Stuff, STRINGLEN, file) != 0) {
434: p = SkipSpace(Read_in_Stuff);
435: if (( *p == '#') || (*p == '\0'))
436: continue;
437:
438: part1 = p;
439: if ((part2 = index (p,':')) == NULLCP)
440: continue;
441:
442: end = part2 - 1;
443: while (isspace(*end)) end--;
444: *++end = '\0';
445:
446: *part2++ = '\0';
447:
448: while (isspace(*part2)) part2++;
449: end = part2;
450:
451: while (!isspace(*end) && *end != ',' && *end != ':') end++;
452:
453: count = 0;
454: while (*part2 != ':') {
455: n = 0;
456: while (n < filt_num && strncmp(filttype[n], part2,
457: (int) (end - part2))) n++;
458:
459: if (n == filt_num) {
460: (void) fprintf(stderr, "Parsing error in typeDefaults file!");
461: quit(1);
462: } else {
463: tempints[count] = n;
464: count++;
465: part2 = end;
466: while (!isalpha(*part2) && *part2 != ':' && part2 != '\0') part2++;
467:
468: if (*part2 == '\0') {
469: (void) fprintf(stderr, "Parsing error in typeDefaults file!");
470: quit(1);
471: }
472:
473: if (*part2 != ':') {
474: while (!isalpha(*part2)) part2++;
475: end = part2;
476: while (!isspace(*end) && *end != ',' &&
477: *end != ':' && *end != '\0') end++;
478: if (*end == '\0') {
479: (void) fprintf(stderr, "Parsing error in typeDefaults file!");
480: quit(1);
481: }
482: } else end = part2;
483: }
484: }
485:
486: if (*end == ':') {
487: while(isspace(*++end));
488: p = end;
489: while(!isspace(*++end));
490: *end = '\0';
491:
492: n = 0;
493: while (n < filt_num && strcmp(filttype[n], p)) n++;
494:
495: if (n == filt_num) {
496: (void) fprintf(stderr, "Parsing error in typeDefaults file!");
497: quit(1);
498: } else {
499: num = 0;
500: while (num < count && n != tempints[num]) num++;
501: if (num == count) {
502: (void) fprintf(stderr, "Parsing error in typeDefaults file!");
503: quit(1);
504: }
505: }
506:
507: defaults[default_num] = n;
508:
509: levels[default_num] = malloc((unsigned int) (strlen(part1) + 1));
510: (void) strcpy(levels[default_num], part1);
511: available_types[default_num] =
512: (int *) malloc((unsigned int) (sizeof(int) * (count+1)));
513:
514: for (n = 0; n < count; n++)
515: available_types[default_num][n] = tempints[n];
516:
517: available_types[default_num][n] = -1;
518: default_num++;
519: }
520: }
521: }
522:
523: cnnct_bind()
524: {
525: struct ds_bind_arg bindarg;
526: struct ds_bind_arg bindresult;
527: struct ds_bind_error binderr;
528: extern char * dsa_address,
529: * myname;
530: extern char * tailfile;
531: FILE * fp;
532: char buf [BUFSIZ];
533:
534: if (*passwd != 0)
535: (void) strcpy(bindpass,"******");
536: else
537: bindpass[0] = '\0';
538: /* set dsa_address */
539: dsa_address = NULLCP;
540: /* read tailor file to get address */
541: if( (fp = fopen(isodefile(tailfile,0), "r")) == (FILE *) NULL) {
542: (void) fprintf(stderr,
543: "Cannot open tailor file %s\n", isodefile(tailfile,0));
544: return;
545: }
546: while(fgets(buf, sizeof(buf), fp) != NULLCP)
547: if ( (*buf != '#') && (*buf != '\n') )
548: (void) tai_string (buf);
549:
550: (void) fclose(fp);
551:
552: if (dsa_address == NULLCP)
553: dsa_address = myname;
554:
555: /* set password */
556: if (bindpass[0] != 0) {
557: if (strcmp (bindpass,"******") != 0)
558: (void) strcpy (passwd,bindpass);
559: } else
560: passwd[0] = 0;
561:
562: /* now bind */
563: bindarg.dba_version = DBA_VERSION_V1988;
564: if (passwd[0] == 0) {
565: bindarg.dba_passwd_len = 0;
566: bindarg.dba_passwd [0] = '\0';
567: } else {
568: bindarg.dba_passwd_len = strlen (passwd);
569: (void) strcpy (bindarg.dba_passwd,passwd);
570: }
571:
572: bindarg.dba_dn = (*namestr == 0? NULLDN: str2dn(namestr));
573:
574: if (ds_bind (&bindarg,&binderr,&bindresult) != DS_OK) {
575: (void) fprintf(stderr, binderr.dbe_type == DBE_TYPE_SECURITY?
576: "Security error - Check name and pasword.\n":
577: "Service error - Can't connect to directory!\n");
578: quit(1);
579: } else {
580: user_name = bindarg.dba_dn;
581: (void) strcpy (buf, "TERM");
582:
583: if(local_dit && *local_dit)
584: (void) strcpy(base_path, local_dit);
585:
586: #ifndef NO_STATS
587: LLOG (log_stat,LLOG_NOTICE,("bound ('%s' to '%s')",namestr,dsa_address));
588: #endif
589: #ifndef NO_STATS
590: LLOG (log_stat,LLOG_NOTICE,("pod bound to directory"));
591: #endif
592:
593: make_friendly(friendly_base_path, base_path);
594:
595: set_default_type();
596: oclass = as_comp_new(AttrT_new("2.5.4.0"), NULLAV, NULLACL_INFO);
597: }
598: dn_number = 0;
599: back_buf_num = 0;
600: backseq = dnseq = NULLDS;
601: }
602:
603: dsEnqError
604: rd_start()
605: {
606: struct ds_read_arg read_arg;
607: struct ds_read_result result;
608: struct DSError error;
609: Entry read_entry;
610:
611: hold_text();
612: cleartext();
613:
614: if (*base_path == '\0') {
615: xprint("The World - Big and Round\n");
616: restart_text();
617: return Okay;
618: }
619:
620: if (get_default_service (&read_arg.rda_common) != 0) {
621: return nothingfound;
622: }
623:
624: refresh();
625:
626: read_arg.rda_common.ca_servicecontrol.svc_options = 1;
627: read_arg.rda_eis.eis_allattributes = FALSE;
628: read_arg.rda_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
629: read_arg.rda_eis.eis_select = read_types;
630:
631: read_arg.rda_object = (*friendly_base_path != 'T'? str2dn(base_path): NULLDN);
632: if ((read_entry =
633: local_find_entry (read_arg.rda_object, FALSE)) != NULLENTRY) {
634: cleartext();
635: xprint("Information on:\n");
636: xprint(friendly_base_path);
637: read_entry->e_attributes = sort_attrs(read_entry->e_attributes);
638: read_print (as_print, (caddr_t) read_entry->e_attributes);
639: restart_text();
640: return Okay;
641: }
642:
643: #ifndef NO_STATS
644: LLOG (log_stat,LLOG_NOTICE,("read +%s",base_path));
645: #endif
646:
647: if (ds_read (&read_arg,&error,&result) != DS_OK) {
648: /* deal with error */
649: restart_text();
650: return localdsaerror;
651: } else {
652: /* use data */
653: if (result.rdr_entry.ent_attr == NULLATTR) {
654: cleartext();
655: dn_number = 0;
656: restart_text();
657: return nothingfound;
658: }
659: if (result.rdr_common.cr_aliasdereferenced)
660: xprint("Alias dereferenced)\n");
661:
662: result.rdr_entry.ent_attr = sort_attrs(result.rdr_entry.ent_attr);
663: cache_entry(&(result.rdr_entry), TRUE, TRUE);
664: cleartext();
665: xprint("Information on:\n");
666: xprint(friendly_base_path);
667: read_print(as_print, (caddr_t) result.rdr_entry.ent_attr);
668: }
669: restart_text();
670: return Okay;
671: }
672:
673: set_default_type()
674: {
675: int count;
676: DN base_name;
677:
678: if (*base_path != '\0') {
679: base_name = str2dn(base_path);
680: while (base_name->dn_parent) base_name = base_name->dn_parent;
681: for (count = 0; count < default_num &&
682: strcmp(levels[count] ,base_name->dn_rdn->rdn_at->
683: oa_ot.ot_stroid);
684: count++);
685:
686: if (count < default_num) {
687: av_typeindx = available_types[count];
688: typeindx = defaults[count];
689: } else {
690: av_typeindx = available_types[0];
691: typeindx = defaults[0];
692: }
693: } else {
694: for(count = 0; count < default_num && strcmp(levels[count], "@"); count++);
695: if (count < default_num) {
696: av_typeindx = available_types[count];
697: typeindx = defaults[count];
698: } else {
699: av_typeindx = available_types[0];
700: typeindx = defaults[0];
701: }
702: }
703: typetoggled = 0;
704: }
705:
706: /* These are the functions called by the list level widgets */
707:
708: dsEnqError
709: list_start()
710: {
711: struct ds_search_arg search_arg;
712: struct ds_search_result result;
713: struct DSError error;
714: dsEnqError return_error;
715:
716: return_error = Okay;
717:
718: if (get_default_service (&search_arg.sra_common) != 0) {
719: return localdsaerror;
720: }
721:
722: refresh();
723:
724: search_arg.sra_common.ca_servicecontrol.svc_sizelimit = sizelimit;
725: search_arg.sra_common.ca_servicecontrol.svc_options = 1;
726: search_arg.sra_baseobject = (*base_path != 'T'?
727: str2dn (base_path):
728: NULLDN);
729: search_arg.sra_eis.eis_allattributes = FALSE;
730: search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
731: search_arg.sra_eis.eis_select = read_types;
732: search_arg.sra_subset = SRA_ONELEVEL;
733:
734: search_arg.sra_filter = filter_alloc();
735: search_arg.sra_filter->flt_type = FILTER_NOT;
736: search_arg.sra_filter->flt_next = NULLFILTER;
737: search_arg.sra_filter->flt_un.flt_un_filter = filter_alloc();
738: search_arg.sra_filter->flt_un.flt_un_filter->flt_type = FILTER_ITEM;
739: search_arg.sra_filter->flt_un.flt_un_filter->flt_next = NULLFILTER;
740: search_arg.sra_filter->flt_un.flt_un_filter->flt_un.flt_un_item.fi_type
741: = FILTERITEM_EQUALITY;
742:
743: search_arg.sra_filter->flt_un.flt_un_filter->flt_un.flt_un_item.fi_un.
744: fi_un_ava.ava_type = AttrT_new("2.5.4.0");
745:
746: search_arg.sra_filter->flt_un.flt_un_filter->flt_un.flt_un_item.fi_un.
747: fi_un_ava.ava_value =
748: str2AttrV("dsa", search_arg.sra_filter->flt_un.flt_un_filter->
749: flt_un.flt_un_item.fi_un.fi_un_ava.ava_type->
750: oa_syntax);
751:
752: #ifndef NO_STATS
753: LLOG (log_stat,LLOG_NOTICE,("search +%s,extent %d, val objectClass != dsa",base_path,search_arg.sra_subset));
754: #endif
755:
756: if (search_arg.sra_filter->flt_un.flt_un_filter->flt_un.flt_un_item.
757: fi_un.fi_un_ava.ava_value == NULLAttrV) {
758: return_error = localdsaerror;
759: } else if (ds_search (&search_arg,&error,&result) != DS_OK) {
760: free_seq(dnseq);
761: dnseq = NULLDS;
762: dn_number = 0;
763: switch (error.dse_type) {
764: case DSE_LOCALERROR:
765: return_error = duaerror;
766: break;
767: case DSE_REMOTEERROR:
768: return_error = localdsaerror;
769: break;
770: case DSE_ATTRIBUTEERROR:
771: return_error = attributerror;
772: break;
773: case DSE_REFERRAL:
774: case DSE_DSAREFERRAL:
775: return_error = remotedsaerror;
776: break;
777: case DSE_SECURITYERROR:
778: return_error = security;
779: break;
780: case DSE_NAMEERROR:
781: return_error = namerror;
782: break;
783: default:
784: return_error = localdsaerror;
785: break;
786: }
787: } else {
788: correlate_search_results (&result);
789: if (result.CSR_entries != NULLENTRYINFO) {
790: register EntryInfo *ptr;
791:
792: if (result.CSR_common.cr_aliasdereferenced) {
793: /*quipu_print (dn_print, (caddr_t) result.CSR_object);*/
794: dn_free (result.CSR_object);
795: }
796:
797: free_seq(dnseq);
798: dnseq = NULLDS;
799: dn_number = 0;
800:
801: for (ptr = result.CSR_entries; ptr != NULLENTRYINFO;
802: ptr = ptr->ent_next) {
803: dn_number++;
804: dn2str ((caddr_t)ptr->ent_dn, goto_path);
805: add_seq (&dnseq, goto_path);
806: cache_entry (ptr,TRUE,TRUE);
807: }
808: if (!dn_number) return_error = nothingfound;
809: } else if (result.CSR_limitproblem != LSR_TIMELIMITEXCEEDED) {
810: free_seq(dnseq);
811: dnseq = NULLDS;
812: dn_number = 0;
813: }
814:
815: if(result.CSR_limitproblem != LSR_NOLIMITPROBLEM) {
816: if(result.CSR_limitproblem == LSR_TIMELIMITEXCEEDED) {
817: free_seq(dnseq);
818: dnseq = NULLDS;
819: dn_number = 0;
820: return_error = timelimit;
821: } else return_error = listsizelimit;
822: }
823: entryinfo_free(result.CSR_entries, 0);
824: }
825:
826: entry_number = dn_number;
827: filter_free(search_arg.sra_filter);
828: return return_error;
829: }
830:
831: rdn2str(ptr,cptr)
832: caddr_t ptr;
833: char * cptr;
834: {
835: PS ps;
836: char buffer [RESBUF];
837:
838: if ((ps = ps_alloc(str_open)) == NULLPS) {
839: return ;
840: }
841: if (str_setup(ps, buffer, RESBUF, 1) == NOTOK) {
842: return ;
843: }
844: rdn_print(ps, (RDN) ptr, READOUT);
845:
846: ps_free(ps);
847: *ps->ps_ptr = 0;
848:
849: (void) strcpy(cptr, buffer);
850: }
851:
852:
853: /* search ... */
854:
855: dsEnqError
856: srch_start()
857: {
858: struct ds_search_arg search_arg;
859: struct ds_search_result result;
860: struct DSError error;
861: dsEnqError return_error;
862: char *str = base_path;
863:
864: if (*mvalue == '\0') {
865: return list_start();
866: }
867:
868: if (get_default_service (&search_arg.sra_common) != 0) {
869: return nothingfound;
870: }
871:
872: refresh();
873:
874: search_arg.sra_common.ca_servicecontrol.svc_sizelimit = sizelimit;
875: search_arg.sra_common.ca_servicecontrol.svc_options = 1;
876: search_arg.sra_baseobject = (*base_path != 'T'?
877: str2dn (base_path):
878: NULLDN);
879: search_arg.sra_eis.eis_allattributes = FALSE;
880: search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
881: search_arg.sra_eis.eis_select = read_types;
882:
883: while (*str != '\0' && *str != '@') str++;
884:
885: search_arg.sra_subset = ((*base_path != 'T' && *str == '@')?
886: SRA_WHOLESUBTREE:
887: SRA_ONELEVEL);
888: search_arg.sra_filter =
889: make_filter(filt_arr[typeindx]);
890:
891: #ifndef NO_STATS
892: LLOG (log_stat,LLOG_NOTICE,("search +%s, extent %d, val %s",base_path,search_arg.sra_subset,mvalue));
893: #endif
894:
895: if(ds_search (&search_arg,&error,&result) != DS_OK) {
896: /* deal with error */
897: free_seq(dnseq);
898: dnseq = NULLDS;
899: dn_number = 0;
900: switch (error.dse_type) {
901: case DSE_LOCALERROR:
902: return_error = duaerror;
903: break;
904: case DSE_REMOTEERROR:
905: return_error = localdsaerror;
906: break;
907: case DSE_ATTRIBUTEERROR:
908: return_error = attributerror;
909: break;
910: case DSE_REFERRAL:
911: case DSE_DSAREFERRAL:
912: return_error = remotedsaerror;
913: break;
914: case DSE_SECURITYERROR:
915: return_error = security;
916: break;
917: case DSE_NAMEERROR:
918: return_error = namerror;
919: break;
920: default:
921: return_error = localdsaerror;
922: break;
923: }
924: } else {
925: correlate_search_results (&result);
926:
927: if (result.CSR_entries != NULLENTRYINFO) {
928: register EntryInfo *ptr;
929:
930: if (result.CSR_common.cr_aliasdereferenced) {
931: quipu_print (dn_print, (caddr_t) result.CSR_object);
932: dn_free (result.CSR_object);
933: }
934: return_error = Okay;
935: free_seq(dnseq);
936: dnseq = NULLDS;
937: dn_number = 0;
938: for (ptr = result.CSR_entries;
939: ptr != NULLENTRYINFO; ptr = ptr->ent_next){
940: dn_number++;
941: dn2str ((caddr_t) ptr->ent_dn, goto_path);
942: add_seq (&dnseq, goto_path);
943: cache_entry (ptr,TRUE,TRUE);
944: }
945: if (!dn_number) return_error = nothingfound;
946: } else if(result.CSR_limitproblem != LSR_TIMELIMITEXCEEDED) {
947: free_seq(dnseq);
948: dnseq = NULLDS;
949: dn_number = 0;
950: return_error = nothingfound;
951: }
952:
953: if(result.CSR_limitproblem != LSR_NOLIMITPROBLEM)
954: if(result.CSR_limitproblem == LSR_TIMELIMITEXCEEDED) {
955: free_seq(dnseq);
956: dnseq = NULLDS;
957: dn_number = 0;
958: return_error = timelimit;
959: } else return_error = listsizelimit;
960: entryinfo_free(result.CSR_entries, 0);
961: }
962: entry_number = dn_number;
963: filter_free(search_arg.sra_filter);
964: return return_error;
965: }
966:
967: static dn2str (ptr,cptr)
968: caddr_t ptr;
969: char * cptr;
970: {
971: PS ps;
972: char buffer [RESBUF];
973:
974: if((ps = ps_alloc(str_open)) == NULLPS) return ;
975:
976: if(str_setup(ps, buffer, RESBUF, 1) == NOTOK) return ;
977:
978: dn_print(ps, (DN) ptr, EDBOUT);
979: *ps->ps_ptr = 0;
980:
981: ps_free (ps);
982:
983: (void) strcpy(cptr, buffer);
984: }
985:
986:
987: read_print(func,ptr)
988: int (*func) ();
989: caddr_t ptr;
990: {
991: PS ps;
992: char buffer [RESBUF];
993: char save;
994: int i, size;
995: register char *str, *sptr;
996:
997: if ((ps = ps_alloc (str_open)) == NULLPS) return ;
998:
999: if (str_setup (ps,buffer,RESBUF,1) == NOTOK) return ;
1000:
1001: (*func) (ps, ptr, READOUT);
1002: *ps->ps_ptr = 0;
1003:
1004: ps_free(ps);
1005: str = buffer ;
1006: sptr = str;
1007: size = strlen(buffer);
1008:
1009: xprint("\n");
1010: for (i = 0; i <= size; i++, sptr++)
1011: if (*sptr == '\n' || *sptr == '\0') {
1012: save = *sptr ;
1013: *sptr = '\0';
1014:
1015: if (mailformat == greybook && indexstring(str, "rfc822") >= 0)
1016: (void) rfc2jnt(str);
1017:
1018: *sptr = '\n';
1019: str = sptr+1;
1020: *sptr = save;
1021: }
1022:
1023: xprint(buffer);
1024: }
1025:
1026: /*ARGSUSED*/
1027: podphoto(ps, picture, format)
1028: PS ps;
1029: PE picture;
1030: int format;
1031: {
1032: PS sps;
1033:
1034: if ((sps = ps_alloc (str_open)) == NULLPS)
1035: return;
1036: if (str_setup (sps,NULLCP,LINESIZE,0) == NOTOK) {
1037: ps_free (sps);
1038: return;
1039: }
1040:
1041: two_passes = 0;
1042:
1043: (void) pe2ps (sps,picture);
1044: decode_t4 (sps->ps_base, "photo", 0);
1045: decode_t4 (sps->ps_base, "photo", 0);
1046:
1047: ps_print (ps,"(see below)");
1048: ps_free (sps);
1049: }
1050:
1051: quipu_print (func,ptr)
1052: int (*func) (); /* assumes func (PS ,dataptr,(int) format); */
1053: caddr_t ptr;
1054: {
1055: /* log info to pstream */
1056: PS ps;
1057: char buffer [RESBUF];
1058: register char *str, *sptr;
1059: char save;
1060:
1061: if ((ps = ps_alloc (str_open)) == NULLPS) return ;
1062:
1063: if (str_setup (ps,buffer,RESBUF,1) == NOTOK) return ;
1064:
1065: (*func) (ps,ptr,READOUT);
1066: *ps->ps_ptr = 0;
1067:
1068: ps_free (ps);
1069:
1070: str = buffer;
1071: do {
1072: for (sptr = str; *sptr != '\0'; sptr++);
1073: save = *sptr;
1074: *sptr = 0;
1075: xprint (str);
1076: *sptr = save;
1077: str = sptr;
1078: } while (*sptr != '\0');
1079: }
1080:
1081: quipu_error (err)
1082: struct DSError * err;
1083: {
1084: PS ps;
1085: char buffer [RESBUF];
1086:
1087: if ((ps = ps_alloc(str_open)) == NULLPS) return ;
1088:
1089: if (str_setup (ps, buffer, RESBUF, 1) == NOTOK) return ;
1090: ds_error(ps, err);
1091:
1092: *ps->ps_ptr = 0;
1093: xprint(buffer);
1094: }
1095:
1096: make_friendly(fstr, str)
1097: char *fstr;
1098: register char *str;
1099: {
1100: register char *end_ptr;
1101: char *string;
1102: char save;
1103: int count, seqnum = 0, mapped;
1104:
1105: *fstr = '\0';
1106: if (*str == '\0') {
1107: *fstr = '\0';
1108: return;
1109: }
1110:
1111: while (*str != '\0') {
1112: end_ptr = str;
1113: while (*end_ptr != '=') end_ptr++;
1114: while (!isalpha(*end_ptr)) end_ptr--;
1115: end_ptr++;
1116: save = *end_ptr;
1117: *end_ptr = '\0';
1118:
1119: mapped = FALSE;
1120: for (count = 0; count < fname_num; count++) {
1121: seqnum = 0;
1122: while (!mapped &&
1123: (string = get_from_seq(seqnum++, name_map[count]->names)))
1124: if (!strcmp(string, str)) {
1125: (void) strcat(fstr, name_map[count]->fname);
1126: count = fname_num;
1127: mapped = TRUE;
1128: }
1129: }
1130:
1131: if (!mapped)
1132: (void) strcat(fstr, str);
1133:
1134: (void) strcat(fstr, " = ");
1135:
1136: *end_ptr++ = save;
1137: str = end_ptr;
1138: while (!(isalpha(*str))) str++;
1139:
1140: end_ptr = str;
1141: while (*end_ptr != '@' && *end_ptr != '\0') end_ptr++;
1142:
1143: save = *end_ptr;
1144: *end_ptr = '\0';
1145: (void) strcat(fstr, str);
1146: *end_ptr = save;
1147:
1148: str = end_ptr;
1149: if (*str != '\0') {
1150: (void) strcat(fstr, ", ");
1151: str++;
1152: }
1153: }
1154: }
1155:
1156: make_friendly_rdn(friendly, object, base)
1157: char *friendly;
1158: char *object, *base;
1159: {
1160: register char *front;
1161: int count;
1162:
1163: *friendly = '\0';
1164:
1165: front = base;
1166: count = 0;
1167:
1168: if (showseq != backseq) {
1169: while (*front != '\0')
1170: if (*front != '=') front++;
1171: else {count++; front++;}
1172: } else
1173: count = 0;
1174:
1175: front = object;
1176:
1177: while (count && *front != '\0')
1178: if (*front != '=') front++;
1179: else {count--; front++;}
1180:
1181: while (front != object && *front != '@') front++;
1182: while (!isalpha(*front)) front++;
1183:
1184: make_friendly(friendly, front);
1185: }
1186:
1187: goto_addr()
1188: {
1189: register char *str;
1190: int count = 0;
1191:
1192: set_default_type();
1193:
1194: make_friendly(friendly_base_path, base_path);
1195:
1196: str = get_from_seq(count+1, backseq);
1197: while (count < back_buf_num && strcmp(str, base_path)){
1198: count++;
1199: str = get_from_seq(count+1, backseq);
1200: }
1201:
1202: if (count == back_buf_num) {
1203: add_seq(&backseq, base_path);
1204: back_buf_num++;
1205: add_to_history(friendly_base_path, back_buf_num);
1206: }
1207: }
1208:
1209: clear_dnseq()
1210: {
1211: free_seq(dnseq);
1212: dnseq = NULLDS;
1213: dn_number = 0;
1214: }
1215:
1216:
1217: int
1218: isleaf(name)
1219: char *name;
1220: {
1221: struct ds_list_arg list_arg;
1222: struct ds_list_result list_result;
1223:
1224: struct ds_read_arg read_arg;
1225: struct ds_read_result read_result;
1226:
1227: struct DSError list_error, read_error;
1228:
1229: char entry_str[1024];
1230:
1231: if (get_default_service (&read_arg.rda_common) != 0) return(1);
1232:
1233: read_arg.rda_common.ca_servicecontrol.svc_options = 1;
1234: read_arg.rda_eis.eis_allattributes = FALSE;
1235: read_arg.rda_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
1236: read_arg.rda_eis.eis_select = oclass;
1237:
1238: read_arg.rda_object = (*name? str2dn(name): NULLDN);
1239: if (ds_read (&read_arg,&read_error,&read_result) == DS_OK) {
1240: if (read_result.rdr_entry.ent_attr == NULLATTR) return(0);
1241: entry2str((caddr_t) read_result.rdr_entry.ent_attr, entry_str, 1024);
1242: if (issubstr(entry_str, "NonLeaf")) return(0);
1243: }
1244:
1245: if (get_default_service (&list_arg.lsa_common) != 0) return(1);
1246: list_arg.lsa_common.ca_servicecontrol.svc_sizelimit = 1;
1247: list_arg.lsa_common.ca_servicecontrol.svc_options = 1;
1248: list_arg.lsa_object = (*name? str2dn(name): NULLDN);
1249: if (ds_list (&list_arg, &list_error, &list_result) == DS_OK) {
1250: if (list_result.lsr_subordinates) return(0);
1251: else return(1);
1252: } else
1253: return (1);
1254: }
1255:
1256: entry2str(ptr, cptr, size)
1257: caddr_t ptr;
1258: char *cptr;
1259: int size;
1260: {
1261: PS ps;
1262:
1263: if ((ps = ps_alloc (str_open)) == NULLPS) return ;
1264: if (str_setup (ps, cptr, size, 1) == NOTOK) return ;
1265:
1266: as_print(ps, ptr, READOUT);
1267: *ps->ps_ptr = 0;
1268:
1269: ps_free(ps);
1270: }
1271:
1272: int issubstr(str, substr)
1273: char *str;
1274: char *substr;
1275: {
1276: register char *sptr;
1277: char c;
1278: int substrlen = strlen(substr);
1279: int count;
1280:
1281: if (*substr == '\0' || *str == '\0') return(0);
1282:
1283: sptr = str;
1284: c = *substr;
1285:
1286: while (1) {
1287: while (*sptr != '\0' && *sptr != c) sptr++;
1288: if (*sptr == '\0') return(0);
1289: for (count = 0; count >= 0 && count < substrlen; count++) {
1290: if (sptr[count] == '\0') return(0);
1291: else if (substr[count] != sptr[count]) count = -2;
1292: }
1293: if (count == substrlen) return(1);
1294: }
1295: }
1296:
1297: int indexstring(string, substring)
1298: char *string,
1299: *substring;
1300: {
1301: register char *sub, *str;
1302: char c, s;
1303: int indx = 0;
1304:
1305: while (1) {
1306: str = string + indx;;
1307: if (*str == '\0') return(-1);
1308: sub = substring;
1309:
1310: if (*str == *sub) {
1311: s = *str;
1312: c = *sub;
1313: while(c == s && c != '\0') {
1314: c = *++sub;
1315: s = *++str;
1316: }
1317:
1318: if (c == '\0') return((int) indx);
1319: else if(s == '\0') return(-1);
1320: }
1321: indx++;
1322: }
1323: }
1324:
1325: rfc2jnt(string)
1326: char *string;
1327: {
1328: char reversed[STRINGLEN], front[STRINGLEN];
1329: register char *part;
1330:
1331: reversed[0] = '\0';
1332: part = string + strlen(string);
1333:
1334: if (*part != '\0') return;
1335:
1336: while(1) {
1337: while (*part != '.' && *part != '@') --part;
1338:
1339: if (*part == '.') {
1340: if (reversed[0] != '\0') (void) strcat(reversed, ".");
1341: part++;
1342: (void) strcat(reversed, part);
1343: *--part = '\0';
1344: --part;
1345: } else {
1346: part++;
1347: (void) strcat(reversed, ".");
1348: (void) strcat(reversed, part);
1349: *part-- = '\0';
1350: while (!isspace(*part)) --part;
1351: ++part;
1352: (void) strcpy(front, part);
1353: (void) strcpy(string, "mailbox - ");
1354: (void) strcat(string, front);
1355: (void) strcat(string, reversed);
1356: return;
1357: }
1358: }
1359: }
1360:
1361: struct attrcomp *
1362: sort_attrs(entry_attrs)
1363: struct attrcomp *entry_attrs;
1364: {
1365: struct attrcomp *last, *next, *curr, *first, *firstn;
1366:
1367: first = curr = entry_attrs;
1368: firstn = last = next = 0;
1369:
1370: while (curr)
1371: if (!strcmp("2.5.4.3", curr->attr_type->oa_ot.ot_stroid) ||
1372: !strcmp("2.5.4.4", curr->attr_type->oa_ot.ot_stroid) ||
1373: !strcmp("0.9.2342.19200300.100.1.3",
1374: curr->attr_type->oa_ot.ot_stroid) ||
1375: !strcmp("0.9.2342.19200300.100.1.2",
1376: curr->attr_type->oa_ot.ot_stroid) ||
1377: !strcmp("2.5.4.20", curr->attr_type->oa_ot.ot_stroid)) {
1378:
1379: if (first == curr) first = curr->attr_link;
1380:
1381: if (next)
1382: next->attr_link = curr;
1383: else
1384: firstn = curr;
1385:
1386: next = curr;
1387:
1388: if (last)
1389: last->attr_link = curr->attr_link;
1390:
1391: curr = curr->attr_link;
1392: next->attr_link = 0;
1393: } else {
1394: last = curr;
1395: curr = curr->attr_link;
1396: }
1397:
1398: if (next) {
1399: next->attr_link = first;
1400: return firstn;
1401: } else
1402: return first;
1403: }
1404:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.