|
|
1.1 ! root 1: /* calls.c - */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/others/quipu/uips/sd/RCS/calls.c,v 7.2 90/07/27 08:45:41 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/others/quipu/uips/sd/RCS/calls.c,v 7.2 90/07/27 08:45:41 mrose Exp $ ! 9: */ ! 10: ! 11: /* ! 12: * $Log: calls.c,v $ ! 13: * Revision 7.2 90/07/27 08:45:41 mrose ! 14: * update ! 15: * ! 16: * Revision 7.1 90/07/09 14:41:49 mrose ! 17: * sync ! 18: * ! 19: * Revision 7.0 90/06/12 13:14:03 mrose ! 20: * *** empty log message *** ! 21: * ! 22: * Revision 1.6 90/04/26 10:36:16 emsrdsm ! 23: * *** empty log message *** ! 24: * ! 25: * Revision 1.5 90/04/25 15:07:22 emsrdsm ! 26: * i) lint'ed ! 27: * ! 28: * Revision 1.4 90/04/20 17:57:33 emsrdsm ! 29: * i) no more freeing ! 30: * ! 31: * Revision 1.3 90/04/18 18:26:06 emsrdsm ! 32: * fixed i) does not move to leaves ! 33: * ii) added default mechanism described using "typeDefaults" file. ! 34: * iii) added 'sorting' to attribute display ! 35: * ! 36: * Revision 1.2 90/03/15 16:29:40 emsrdsm ! 37: * fixes i) Prints messages correctly on exit. ! 38: * ii) Added rfc822 to greybook mailbox conversion ! 39: * iii) Removed bug that caused crash if 'local_dit' undefined ! 40: * ! 41: * Revision 1.1 90/03/09 17:40:20 emsrdsm ! 42: * Initial revision ! 43: * ! 44: * Revision 1.1 90/03/09 13:36:22 emsrdsm ! 45: * Initial revision ! 46: * ! 47: */ ! 48: ! 49: #include "manifest.h" ! 50: #include "quipu/util.h" ! 51: #include "quipu/common.h" ! 52: #include "quipu/entry.h" ! 53: #include "usr.dirent.h" ! 54: #include "tailor.h" ! 55: #include "sequence.h" ! 56: #include "filt.h" ! 57: #include "y.tab.h" ! 58: #include "symtab.h" ! 59: ! 60: #define RESBUF 10000 ! 61: ! 62: struct attrcomp * sort_attrs(); ! 63: static dn2str (); ! 64: ! 65: typedef enum {rfc822, greybook} mailtype; ! 66: mailtype mailformat = rfc822; ! 67: ! 68: int scrollize; ! 69: PS opt; ! 70: Attr_Sequence read_types = 0, read_types2 = 0, oclass = 0; ! 71: ! 72: D_seq dnseq, textseq, back_seq; ! 73: table_entry symtab = 0; ! 74: ! 75: int current_entry, entry_number, display_entry; ! 76: int back_buf_num; ! 77: ! 78: int dn_print (), rdn_print(), as_print(), avs_comp_print(); ! 79: ! 80: char bound = FALSE; /* indication of wether bound */ ! 81: char * TidyString(); ! 82: ! 83: /* hack to get isode/curses compatability */ ! 84: #define WINDOW char ! 85: ! 86: #include "widget.h" ! 87: #include "wdgtdefs.h" ! 88: ! 89: extern text_height; ! 90: int text_state; ! 91: ! 92: #define DN_LIST 0 ! 93: #define TEXT 1 ! 94: #define BACK_LIST 3 ! 95: ! 96: /* These are common operation variables */ ! 97: #define STRINGLEN 1000 ! 98: #define SMALLSTRING 255 ! 99: #define MAXTYPES 255 ! 100: ! 101: char goto_path[STRINGLEN]; /* Used by the 'G:goto' command*/ ! 102: char base_path[STRINGLEN]; /* Used by all DS operations */ ! 103: char friendly_base_path[STRINGLEN]; ! 104: char friendly_name[STRINGLEN]; ! 105: char namestr[STRINGLEN]; ! 106: char cache [STRINGLEN]; ! 107: char bindpass [STRINGLEN]; ! 108: char srchvalue[STRINGLEN]; /* Used by search */ ! 109: char svalue [STRINGLEN]; ! 110: char mvalue [STRINGLEN]; ! 111: ! 112: unsigned int curr_filt = 0; ! 113: unsigned int filt_num = 0; ! 114: unsigned int typeindx = 0; ! 115: filt_struct *filt_arr[MAXTYPES]; ! 116: char *filtvalue[MAXTYPES]; ! 117: static char *filttype[MAXTYPES]; ! 118: ! 119: int default_num; ! 120: int *av_typeindx; ! 121: int *available_types[MAXTYPES]; ! 122: char *levels[MAXTYPES]; ! 123: int defaults[MAXTYPES]; ! 124: ! 125: #ifndef NO_STATS ! 126: extern LLog *log_stat; ! 127: #endif ! 128: ! 129: /* These are used as the data for the binding connection */ ! 130: char passwd[STRINGLEN]; ! 131: extern char currentpath[]; ! 132: extern char * myname; ! 133: ! 134: extern int sizelimit; ! 135: extern char *local_dit; ! 136: DN user_name; ! 137: ! 138: char * addobj = NULLCP; ! 139: ! 140: Filter search_filter; ! 141: ! 142: FILE *file; ! 143: char *file_names[MAXTYPES]; ! 144: ! 145: char *get_strioid(ptr) ! 146: register char *ptr; ! 147: { ! 148: register char *end_ptr; ! 149: ! 150: while(*ptr == '"') ptr++; ! 151: while(*ptr != '"') ptr++; ! 152: ! 153: while(*ptr > '9' || *ptr < '0') ptr++; ! 154: ! 155: end_ptr = ptr; ! 156: while(*end_ptr != '\n') end_ptr++; ! 157: ! 158: *end_ptr = '\0'; ! 159: return ptr; ! 160: } ! 161: ! 162: ! 163: user_tailor () ! 164: { ! 165: char *part1; ! 166: char *part2; ! 167: char *getenv (); ! 168: char *ptr = "/.quipurc"; ! 169: char *config_dir = "/.duaconfig/"; ! 170: char *isode_config_dir = "sd/duaconfig/"; ! 171: char *type_dir = "filterTypes/"; ! 172: char *read_File = "readTypes"; ! 173: char *type_defaults = "typeDefaults"; ! 174: ! 175: char Dish_Home[BUFSIZ]; ! 176: char read_Home[BUFSIZ]; ! 177: char type_Home[BUFSIZ]; ! 178: char type_defaults_Home[BUFSIZ]; ! 179: ! 180: char stroid_buf[BUFSIZ]; ! 181: ! 182: DIR *dir; ! 183: ! 184: struct dirent *dir_ent; ! 185: ! 186: char Read_in_Stuff[STRINGLEN]; ! 187: char *p, ! 188: *TidyString(), ! 189: *SkipSpace(), ! 190: *end; ! 191: ! 192: int count, n, num; ! 193: int tempints[MAXTYPES]; ! 194: ! 195: #ifndef NO_STATS ! 196: ll_hdinit (log_stat,"sd"); ! 197: #endif ! 198: ! 199: if ((opt = ps_alloc (std_open)) == NULLPS) ! 200: fatal (-1,"ps_alloc failed"); ! 201: if (std_setup (opt,stdout) == NOTOK) ! 202: fatal (-1,"std_setup failed"); ! 203: ! 204: namestr[0] = '\0'; ! 205: *passwd = '\0'; ! 206: cache[0] = '\0'; ! 207: currentpath[0] = '\0'; ! 208: ! 209: (void) strcpy (Dish_Home, getenv ("HOME")); ! 210: (void) strcpy(read_Home, Dish_Home); ! 211: (void) strcpy(type_Home, Dish_Home); ! 212: (void) strcpy(type_defaults_Home, Dish_Home); ! 213: ! 214: (void) strcat(Dish_Home, ptr); ! 215: (void) strcat(read_Home, config_dir); ! 216: (void) strcat(read_Home, read_File); ! 217: (void) strcat(type_Home, config_dir); ! 218: (void) strcat(type_Home, type_dir); ! 219: (void) strcat(type_defaults_Home, type_defaults); ! 220: ! 221: if (!(dir = opendir(type_Home))) { ! 222: (void) strcpy(type_Home, isodefile(isode_config_dir,0)); ! 223: (void) strcat(type_Home, type_dir); ! 224: if(!(dir = opendir(type_Home))) { ! 225: quit("Can't find directory filterTypes.\n", 1); ! 226: } ! 227: } ! 228: ! 229: rewinddir(dir); ! 230: filt_num = 0; ! 231: while(dir_ent = readdir(dir)) { ! 232: if (!(strncmp(dir_ent->d_name, "Type_", 5))) { ! 233: file_names[filt_num] = ! 234: (char *) malloc(strlen(dir_ent->d_name) + strlen(type_Home) + 2); ! 235: (void) strcpy(file_names[filt_num], type_Home); ! 236: (void) strcat(file_names[filt_num], dir_ent->d_name); ! 237: filt_num++; ! 238: } ! 239: } ! 240: (void) closedir(dir); ! 241: ! 242: if ((file = fopen (Dish_Home, "r")) == 0); ! 243: else { ! 244: while (fgets (Read_in_Stuff, STRINGLEN, file) != 0) { ! 245: p = SkipSpace (Read_in_Stuff); ! 246: if (( *p == '#') || (*p == '\0')) ! 247: continue; /* ignore comments and blanks */ ! 248: ! 249: part1 = p; ! 250: if ((part2 = index (p,':')) == NULLCP) ! 251: continue; /* ignore it */ ! 252: ! 253: *part2++ = '\0'; ! 254: part2 = TidyString(part2); ! 255: ! 256: if (strcmp (part1, "username") == 0) ! 257: (void) strcpy (namestr, part2); ! 258: else if (strcmp (part1, "password") == 0) ! 259: (void) strcpy (passwd, part2); ! 260: else if (strcmp(part1, "prefergreybook") == 0) ! 261: mailformat = greybook; ! 262: else if (lexequ (part1, "dsap") == 0) ! 263: (void) tai_string (part2); ! 264: else if (lexequ (part1, "isode") == 0) { ! 265: char * split; ! 266: if ((split = index (part2,' ')) != NULLCP) { ! 267: *split++ = 0; ! 268: (void) isodesetvar (part2,split,0); ! 269: } ! 270: } else if (strcmp (part1, "service") == 0) ! 271: new_service (part2); ! 272: } ! 273: isodexport (NULLCP); ! 274: (void) fclose(file); ! 275: } ! 276: ! 277: if (!(file = fopen(read_Home, "r"))) { ! 278: (void) strcpy(read_Home, isodefile(isode_config_dir,0)); ! 279: (void) strcat(read_Home, read_File); ! 280: if (!(file = fopen(read_Home, "r"))) { ! 281: quit("Can't find file readTypes.\n", 1); ! 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: quit("Can't find filter template file\n", 1); ! 302: } ! 303: filtvalue[curr_filt] = (char *) malloc(STRINGLEN); ! 304: *filtvalue[curr_filt] = '\0'; ! 305: ! 306: (void) yyparse(); ! 307: (void) fclose(file); ! 308: } ! 309: filttype[curr_filt] = NULLCP; ! 310: for (count = 0; count < filt_num; count++) ! 311: free(file_names[count]); ! 312: ! 313: if (!(file = fopen(type_defaults_Home, "r"))) { ! 314: (void) strcpy(type_defaults_Home, isodefile(isode_config_dir,0)); ! 315: (void) strcat(type_defaults_Home, type_defaults); ! 316: if (!(file = fopen(type_defaults_Home, "r"))) { ! 317: (void) strcpy(type_defaults_Home, "./sd/duaconfig/"); ! 318: (void) strcat(type_defaults_Home, type_defaults); ! 319: if (!(file = fopen(type_defaults_Home, "r"))) { ! 320: (void) fprintf(stderr, "Can't open typeDefaults file\n"); ! 321: quit(1); ! 322: } ! 323: } ! 324: } ! 325: ! 326: default_num = 0; ! 327: while (fgets (Read_in_Stuff, STRINGLEN, file) != 0) { ! 328: p = SkipSpace(Read_in_Stuff); ! 329: if (( *p == '#') || (*p == '\0')) ! 330: continue; ! 331: ! 332: part1 = p; ! 333: if ((part2 = index (p,':')) == NULLCP) ! 334: continue; ! 335: ! 336: end = part2 - 1; ! 337: while (isspace(*end)) end--; ! 338: *++end = '\0'; ! 339: ! 340: *part2++ = '\0'; ! 341: ! 342: while (isspace(*part2)) part2++; ! 343: end = part2; ! 344: ! 345: while (!isspace(*end) && *end != ',' && *end != ':') end++; ! 346: ! 347: count = 0; ! 348: while (*part2 != ':') { ! 349: n = 0; ! 350: while (n < filt_num && strncmp(filttype[n], part2, ! 351: (int) (end - part2))) n++; ! 352: ! 353: if (n == filt_num) { ! 354: (void) fprintf(stderr, "Parsing error in typeDefaults file!"); ! 355: quit(1); ! 356: } else { ! 357: tempints[count] = n; ! 358: count++; ! 359: part2 = end; ! 360: while (!isalpha(*part2) && *part2 != ':' && part2 != '\0') part2++; ! 361: ! 362: if (*part2 == '\0') { ! 363: (void) fprintf(stderr, "Parsing error in typeDefaults file!"); ! 364: quit(1); ! 365: } ! 366: ! 367: if (*part2 != ':') { ! 368: while (!isalpha(*part2)) part2++; ! 369: end = part2; ! 370: while (!isspace(*end) && *end != ',' && ! 371: *end != ':' && *end != '\0') end++; ! 372: if (*end == '\0') { ! 373: (void) fprintf(stderr, "Parsing error in typeDefaults file!"); ! 374: quit(1); ! 375: } ! 376: } else end = part2; ! 377: } ! 378: } ! 379: if (*end == ':') { ! 380: while(isspace(*++end)); ! 381: p = end; ! 382: while(!isspace(*++end)); ! 383: *end = '\0'; ! 384: ! 385: n = 0; ! 386: while (n < filt_num && strcmp(filttype[n], p)) n++; ! 387: ! 388: if (n == filt_num) { ! 389: (void) fprintf(stderr, "Parsing error in typeDefaults file!"); ! 390: quit(1); ! 391: } else { ! 392: num = 0; ! 393: while (num < count && n != tempints[num]) num++; ! 394: if (num == count) { ! 395: (void) fprintf(stderr, "Parsing error in typeDefaults file!"); ! 396: quit(1); ! 397: } ! 398: } ! 399: ! 400: defaults[default_num] = n; ! 401: ! 402: levels[default_num] = malloc(strlen(part1) + 1); ! 403: (void) strcpy(levels[default_num], part1); ! 404: available_types[default_num] = ! 405: (int *) malloc(sizeof(int) * (count+1)); ! 406: ! 407: for (n = 0; n < count; n++) ! 408: available_types[default_num][n] = tempints[n]; ! 409: ! 410: available_types[default_num][n] = -1; ! 411: default_num++; ! 412: } ! 413: } ! 414: } ! 415: ! 416: make_type(name_val, filt) ! 417: char * name_val; ! 418: filt_struct * filt; ! 419: { ! 420: filttype[curr_filt] = (char *) malloc(strlen(name_val) + 1); ! 421: (void) strcpy(filttype[curr_filt], name_val); ! 422: ! 423: filt_arr[curr_filt] = filt; ! 424: } ! 425: ! 426: filt_struct * ! 427: make_item_filter(oid, match, value) ! 428: char *oid; ! 429: int match; ! 430: char *value; ! 431: { ! 432: register filt_struct * filt = (filt_struct *) malloc(sizeof(filt_struct)); ! 433: ! 434: filt->flt_type = ITEM; ! 435: filt->next = 0; ! 436: ! 437: filt->fu_cont.item.fi_type = match; ! 438: filt->fu_cont.item.stroid = (char *) malloc(strlen(oid) + 1); ! 439: (void) strcpy(filt->fu_cont.item.stroid, oid); ! 440: ! 441: if (*value == '*') filt->fu_cont.item.name = (char *) 0; ! 442: else { ! 443: filt->fu_cont.item.name = (char *) malloc(strlen(value) + 1); ! 444: (void) strcpy(filt->fu_cont.item.name, value); ! 445: } ! 446: return filt; ! 447: } ! 448: ! 449: filt_struct * ! 450: link_filters(filt1, filt2) ! 451: filt_struct *filt1; ! 452: filt_struct *filt2; ! 453: { ! 454: filt1->next = filt2; ! 455: return filt1; ! 456: } ! 457: ! 458: filt_struct * ! 459: make_parent_filter(filt_type, filt1, filt2, filt3) ! 460: int filt_type; ! 461: filt_struct * filt1; ! 462: filt_struct * filt2; ! 463: filt_struct * filt3; ! 464: { ! 465: filt_struct * parent = (filt_struct *) malloc(sizeof(filt_struct)); ! 466: ! 467: switch (filt_type) { ! 468: ! 469: case NOT: ! 470: parent->flt_type = NOT; ! 471: parent->fu_cont.sub_filt = filt1; ! 472: parent->next = 0; ! 473: break; ! 474: ! 475: case AND: ! 476: parent->flt_type = AND; ! 477: parent->fu_cont.sub_filt = filt1; ! 478: filt1->next = filt2; ! 479: filt2->next = filt3; ! 480: parent->next = 0; ! 481: break; ! 482: ! 483: default: ! 484: parent->flt_type = OR; ! 485: parent->fu_cont.sub_filt = filt1; ! 486: filt1->next = filt2; ! 487: filt2->next = filt3; ! 488: parent->next = 0; ! 489: break; ! 490: } ! 491: ! 492: return parent; ! 493: } ! 494: ! 495: /* These are the functions called by the main level of widgets */ ! 496: ! 497: main_help() ! 498: { ! 499: cleartext(); ! 500: killwidgets(mainwdgts); ! 501: setwidgets(dethelpwdgts,-1); ! 502: help_cncs(); ! 503: } ! 504: ! 505: main_bind() ! 506: { ! 507: cleartext(); ! 508: if (*passwd != 0) ! 509: (void) strcpy(bindpass,"******"); ! 510: else ! 511: bindpass[0] = '\0'; ! 512: } ! 513: ! 514: cnnct_quit () ! 515: { ! 516: quit("Exiting sd.\n", 0); ! 517: } ! 518: ! 519: cnnct_bind() ! 520: { ! 521: struct ds_bind_arg bindarg; ! 522: struct ds_bind_arg bindresult; ! 523: struct ds_bind_error binderr; ! 524: extern char * dsa_address, ! 525: * myname; ! 526: extern char * tailfile; ! 527: FILE * fp; ! 528: char buf [BUFSIZ]; ! 529: ! 530: /* set dsa_address */ ! 531: dsa_address = NULLCP; ! 532: /* read tailor file to get address */ ! 533: if( (fp = fopen(isodefile(tailfile,0), "r")) == (FILE *)NULL) { ! 534: tprint ("Cannot open tailor file %s\n",isodefile(tailfile,0)); ! 535: return; ! 536: } ! 537: while(fgets(buf, sizeof(buf), fp) != NULLCP) ! 538: if ( (*buf != '#') && (*buf != '\n') ) ! 539: (void) tai_string(buf); ! 540: ! 541: (void) fclose(fp); ! 542: ! 543: if (dsa_address == NULLCP) ! 544: dsa_address = myname; ! 545: ! 546: /* set password */ ! 547: if (bindpass[0] != 0) { ! 548: if (strcmp (bindpass,"******") != 0) ! 549: (void) strcpy (passwd,bindpass); ! 550: } else ! 551: passwd[0] = 0; ! 552: ! 553: /* now bind */ ! 554: bindarg.dba_version = DBA_VERSION_V1988; ! 555: if (passwd[0] == 0) { ! 556: bindarg.dba_passwd_len = 0; ! 557: bindarg.dba_passwd [0] = '\0'; ! 558: } else { ! 559: bindarg.dba_passwd_len = strlen (passwd); ! 560: (void) strcpy (bindarg.dba_passwd,passwd); ! 561: } ! 562: ! 563: bindarg.dba_dn = (*namestr == 0? NULLDN: str2dn(namestr)); ! 564: ! 565: if (ds_bind (&bindarg,&binderr,&bindresult) != DS_OK) { ! 566: if (binderr.dbe_type == DBE_TYPE_SECURITY) ! 567: quit("Bind security error - Check name and pasword.\n", 0); ! 568: else ! 569: quit("Bind service error - Can't contact DSA!\n", 1); ! 570: } else { ! 571: setdialogstr(getwidget(mainwdgts, '\0'), friendly_base_path, STRINGLEN); ! 572: setdialogstr(getwidget(mainwdgts, 's'), mvalue, STRINGLEN); ! 573: setdialogstr(getwidget(mainwdgts, '*'), srchvalue, 6); ! 574: settogglstrs(getwidget(mainwdgts, 't'), filttype, 0); ! 575: setwidgets (mainwdgts,-1); ! 576: user_name = bindarg.dba_dn; ! 577: ! 578: if(local_dit && *local_dit) ! 579: (void) strcpy(base_path, local_dit); ! 580: else ! 581: (void) strcpy(base_path, "The World"); ! 582: ! 583: oclass = as_comp_new(AttrT_new("objectClass"), NULLAV, NULLACL_INFO); ! 584: make_friendly(friendly_base_path, base_path); ! 585: printdialog(getwidget(mainwdgts,'\0')); ! 586: set_default_type(); ! 587: ! 588: (void) strcpy (buf, "TERM"); ! 589: ! 590: #ifndef NO_STATS ! 591: LLOG (log_stat,LLOG_NOTICE,("bound ('%s' to '%s')",namestr,dsa_address)); ! 592: #endif ! 593: #ifndef NO_STATS ! 594: LLOG (log_stat,LLOG_NOTICE,("sd called from a ('%s')", getenv(buf))); ! 595: #endif ! 596: } ! 597: display_entry = current_entry = 1; ! 598: entry_number = 0; ! 599: back_buf_num = 0; ! 600: textseq = back_seq = dnseq = NULLDS; ! 601: text_state = TEXT; ! 602: } ! 603: ! 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: cleartext(); ! 612: if (*friendly_base_path == 'T') { ! 613: free_seq(textseq); ! 614: if (text_state == DN_LIST) free_seq(dnseq); ! 615: dnseq = textseq = NULLDS; ! 616: text_state = TEXT; ! 617: entry_number = 0; ! 618: return; ! 619: } ! 620: ! 621: xprint("Reading data on "); ! 622: xprint(friendly_base_path); ! 623: xprint(".\n"); ! 624: tprint("Chugging along....."); ! 625: ! 626: if ( get_default_service (&read_arg.rda_common) != 0) { ! 627: xprint ("Default service error -> check your .quipurc\n"); ! 628: return ; ! 629: } ! 630: ! 631: read_arg.rda_common.ca_servicecontrol.svc_options = 1; ! 632: read_arg.rda_eis.eis_allattributes = FALSE; ! 633: read_arg.rda_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES; ! 634: read_arg.rda_eis.eis_select = read_types; ! 635: ! 636: read_arg.rda_object = (*friendly_base_path != 'T'? str2dn(base_path): NULLDN); ! 637: if ((read_entry = ! 638: local_find_entry (read_arg.rda_object, FALSE)) != NULLENTRY) { ! 639: read_entry->e_attributes = sort_attrs(read_entry->e_attributes); ! 640: read_print (as_print, (caddr_t) read_entry->e_attributes); ! 641: return; ! 642: } ! 643: ! 644: #ifndef NO_STATS ! 645: LLOG (log_stat,LLOG_NOTICE,("read +%s",base_path)); ! 646: #endif ! 647: ! 648: if (ds_read (&read_arg,&error,&result) != DS_OK) { ! 649: /* deal with error */ ! 650: cleartext(); ! 651: xprint("Read error due to:\n"); ! 652: quipu_error(&error); ! 653: } else { ! 654: /* use data */ ! 655: if (result.rdr_entry.ent_attr == NULLATTR) { ! 656: free_seq(textseq); ! 657: if (text_state == DN_LIST) free_seq(dnseq); ! 658: dnseq = textseq = NULLDS; ! 659: entry_number = 0; ! 660: text_state = TEXT; ! 661: xprint("No attributes"); ! 662: return; ! 663: } ! 664: xprint("Result of look up ...\n"); ! 665: if (result.rdr_common.cr_aliasdereferenced) ! 666: xprint("Alias dereferenced)\n"); ! 667: ! 668: result.rdr_entry.ent_attr = sort_attrs(result.rdr_entry.ent_attr); ! 669: cache_entry(&(result.rdr_entry), TRUE, TRUE); ! 670: read_print(as_print, (caddr_t) result.rdr_entry.ent_attr); ! 671: } ! 672: } ! 673: ! 674: back_start() ! 675: { ! 676: if (!back_buf_num) { ! 677: cleartext(); ! 678: tprint("You haven't been anywhere yet!\n"); ! 679: sleep(3); ! 680: scrollbar('\0'); ! 681: return; ! 682: } ! 683: ! 684: if (text_state == DN_LIST) free_seq(dnseq); ! 685: ! 686: free_seq(textseq); ! 687: textseq = NULLDS; ! 688: dnseq = back_seq; ! 689: text_state = BACK_LIST; ! 690: entry_number = back_buf_num; ! 691: current_entry = display_entry = 1; ! 692: scrollbar('\0'); ! 693: } ! 694: ! 695: widen() ! 696: { ! 697: register char *str, *sptr; ! 698: int count = 0; ! 699: ! 700: str = get_from_seq(count+1, back_seq); ! 701: while (count < back_buf_num && strcmp(str, base_path)){ ! 702: count++; ! 703: str = get_from_seq(count+1, back_seq); ! 704: } ! 705: if (count == back_buf_num) { ! 706: add_seq(&back_seq, base_path); ! 707: back_buf_num++; ! 708: } ! 709: ! 710: str = base_path; ! 711: if (*str != 'T') { ! 712: ! 713: for (sptr = str; *sptr != '\0'; sptr++) ! 714: if (*sptr == '@') str = sptr; ! 715: ! 716: sptr = str; ! 717: typetoggled = 0; ! 718: ! 719: if (str != base_path) { ! 720: if (*--sptr == ' ') ! 721: str = sptr; ! 722: *str = '\0'; ! 723: } else ! 724: (void) strcpy(base_path, "The World"); ! 725: ! 726: make_friendly(friendly_base_path, base_path); ! 727: set_default_type(); ! 728: printdialog(getwidget(mainwdgts, '\0')); ! 729: rd_start(); ! 730: } ! 731: } ! 732: ! 733: set_default_type() ! 734: { ! 735: int count, lastindx; ! 736: WIDGET *wdgt, *vwdgt; ! 737: DN base_name; ! 738: ! 739: wdgt = getwidget(mainwdgts,'t'); ! 740: vwdgt = getwidget(mainwdgts, 's'); ! 741: ! 742: if (av_typeindx) ! 743: lastindx = wdgt->tindx; ! 744: else ! 745: lastindx = 0; ! 746: ! 747: if (*base_path != 'T') { ! 748: if (!typetoggled) { ! 749: base_name = str2dn(base_path); ! 750: while (base_name->dn_parent) base_name = base_name->dn_parent; ! 751: for (count = 0; count < default_num && ! 752: strcmp(levels[count] ,base_name->dn_rdn->rdn_at-> ! 753: oa_ot.ot_stroid); ! 754: count++); ! 755: ! 756: if (count < default_num) { ! 757: av_typeindx = available_types[count]; ! 758: typeindx = defaults[count]; ! 759: } else { ! 760: av_typeindx = available_types[0]; ! 761: typeindx = defaults[0]; ! 762: } ! 763: count = typeindx; ! 764: ! 765: if (count < filt_num) { ! 766: if (lastindx) ! 767: (void) strcpy(filtvalue[lastindx], vwdgt->dstr); ! 768: wdgt->tindx = count; ! 769: (void) strcpy(vwdgt->dstr, filtvalue[wdgt->tindx]); ! 770: } ! 771: } ! 772: } else { ! 773: for(count = 0; count < default_num && strcmp(levels[count], "@"); count++); ! 774: if (count < default_num) { ! 775: av_typeindx = available_types[count]; ! 776: typeindx = defaults[count]; ! 777: } else { ! 778: av_typeindx = available_types[0]; ! 779: typeindx = defaults[0]; ! 780: } ! 781: count = typeindx; ! 782: if (count < filt_num) { ! 783: if (lastindx) ! 784: (void) strcpy(filtvalue[lastindx], vwdgt->dstr); ! 785: wdgt->tindx = count; ! 786: (void) strcpy(vwdgt->dstr, filtvalue[wdgt->tindx]); ! 787: } ! 788: } ! 789: ! 790: make_friendly(friendly_base_path, base_path); ! 791: typetoggled = 0; ! 792: printtoggle(wdgt); ! 793: printdialog(vwdgt); ! 794: } ! 795: ! 796: /* These are the functions called by the list level widgets */ ! 797: ! 798: list_start() ! 799: { ! 800: struct ds_search_arg search_arg; ! 801: struct ds_search_result result; ! 802: struct DSError error; ! 803: ! 804: cleartext(); ! 805: xprint("OK, listing.\n"); ! 806: tprint("Chugging along....."); ! 807: ! 808: if (get_default_service (&search_arg.sra_common) != 0) { ! 809: xprint ("Default service error -> check your .quipurc\n"); ! 810: return ; ! 811: } ! 812: ! 813: search_arg.sra_common.ca_servicecontrol.svc_sizelimit = sizelimit; ! 814: search_arg.sra_common.ca_servicecontrol.svc_options = 1; ! 815: search_arg.sra_baseobject = (*base_path != 'T'? ! 816: str2dn (base_path): ! 817: NULLDN); ! 818: search_arg.sra_eis.eis_allattributes = FALSE; ! 819: search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES; ! 820: search_arg.sra_eis.eis_select = read_types; ! 821: search_arg.sra_subset = SRA_ONELEVEL; ! 822: ! 823: search_arg.sra_filter = filter_alloc(); ! 824: search_arg.sra_filter->flt_type = FILTER_NOT; ! 825: search_arg.sra_filter->flt_next = NULLFILTER; ! 826: search_arg.sra_filter->flt_un.flt_un_filter = filter_alloc(); ! 827: search_arg.sra_filter->flt_un.flt_un_filter->flt_type = FILTER_ITEM; ! 828: search_arg.sra_filter->flt_un.flt_un_filter->flt_next = NULLFILTER; ! 829: search_arg.sra_filter->flt_un.flt_un_filter->flt_un.flt_un_item.fi_type ! 830: = FILTERITEM_EQUALITY; ! 831: ! 832: search_arg.sra_filter->flt_un.flt_un_filter->flt_un.flt_un_item.fi_un. ! 833: fi_un_ava.ava_type = AttrT_new("2.5.4.0"); ! 834: ! 835: search_arg.sra_filter->flt_un.flt_un_filter->flt_un.flt_un_item.fi_un. ! 836: fi_un_ava.ava_value = ! 837: str2AttrV("dsa", search_arg.sra_filter->flt_un.flt_un_filter-> ! 838: flt_un.flt_un_item.fi_un.fi_un_ava.ava_type-> ! 839: oa_syntax); ! 840: ! 841: if (search_arg.sra_filter->flt_un.flt_un_filter->flt_un.flt_un_item. ! 842: fi_un.fi_un_ava.ava_value == NULLAttrV) { ! 843: cleartext(); ! 844: xprint("No can do. Sorry!"); ! 845: } else if (ds_search (&search_arg,&error,&result) != DS_OK) { ! 846: /* deal with error */ ! 847: free_seq(textseq); ! 848: if (text_state == DN_LIST) free_seq(dnseq); ! 849: dnseq = textseq = NULLDS; ! 850: text_state = TEXT; ! 851: entry_number = 0; ! 852: cleartext(); ! 853: xprint("Search error due to:\n"); ! 854: quipu_error(&error); ! 855: } else { ! 856: cleartext(); ! 857: correlate_search_results (&result); ! 858: if (result.CSR_entries != NULLENTRYINFO) { ! 859: register EntryInfo *ptr; ! 860: ! 861: xprint ("Result of search ...\n"); ! 862: if (result.CSR_common.cr_aliasdereferenced) { ! 863: xprint ("(Alias dereferenced - object is "); ! 864: quipu_print (dn_print, (caddr_t) result.CSR_object); ! 865: dn_free (result.CSR_object); ! 866: xprint (")\n"); ! 867: } ! 868: ! 869: if (text_state == DN_LIST) free_seq(dnseq); ! 870: free_seq(textseq); ! 871: dnseq = textseq = NULLDS; ! 872: display_entry = current_entry = 1; ! 873: entry_number = 0; ! 874: text_state = DN_LIST; ! 875: ! 876: for (ptr = result.CSR_entries; ptr != NULLENTRYINFO; ! 877: ptr = ptr->ent_next) { ! 878: entry_number++; ! 879: dn2str ((caddr_t)ptr->ent_dn, goto_path); ! 880: add_seq (&dnseq, goto_path); ! 881: cache_entry (ptr,TRUE,TRUE); ! 882: } ! 883: scrollbar('\0'); ! 884: } else if (result.CSR_limitproblem != LSR_TIMELIMITEXCEEDED) { ! 885: free_seq(textseq); ! 886: if (text_state == DN_LIST) free_seq(dnseq); ! 887: dnseq = textseq = NULLDS; ! 888: entry_number = 0; ! 889: text_state = TEXT; ! 890: xprint("Nothing found"); ! 891: } ! 892: ! 893: if(result.CSR_limitproblem != LSR_NOLIMITPROBLEM) { ! 894: if(result.CSR_limitproblem == LSR_TIMELIMITEXCEEDED) { ! 895: free_seq(textseq); ! 896: if (text_state == DN_LIST) free_seq(dnseq); ! 897: dnseq = textseq = NULLDS; ! 898: entry_number = 0; ! 899: text_state = TEXT; ! 900: xprint("(Time limit exceeded)"); ! 901: } else ! 902: xprint("(Size limit exceeded)"); ! 903: } ! 904: ! 905: entryinfo_free(result.CSR_entries, 0); ! 906: } ! 907: ! 908: filter_free(search_arg.sra_filter); ! 909: } ! 910: ! 911: rdn2str(ptr,cptr) ! 912: caddr_t ptr; ! 913: char * cptr; ! 914: { ! 915: PS ps; ! 916: char buffer [RESBUF]; ! 917: ! 918: if ((ps = ps_alloc(str_open)) == NULLPS) { ! 919: return ; ! 920: } ! 921: if (str_setup(ps, buffer, RESBUF, 1) == NOTOK) { ! 922: return ; ! 923: } ! 924: rdn_print(ps, (RDN) ptr, READOUT); ! 925: ! 926: ps_free(ps); ! 927: *ps->ps_ptr = 0; ! 928: ! 929: (void) strcpy(cptr, buffer); ! 930: } ! 931: ! 932: ! 933: /* search ... */ ! 934: ! 935: Filter ! 936: make_filter(filt) ! 937: filt_struct *filt; ! 938: { ! 939: int type, count; ! 940: char *value; ! 941: Filter rfilt, sfilt = filter_alloc(); ! 942: ! 943: if (!filt) ! 944: return (Filter) 0; ! 945: ! 946: switch(filt->flt_type) { ! 947: ! 948: case ITEM: ! 949: sfilt->flt_type = FILTER_ITEM; ! 950: sfilt->flt_next = make_filter(filt->next); ! 951: ! 952: if (strcmp(filt->fu_cont.item.stroid, "2.5.4.4")) ! 953: (void) strcpy(svalue, (filt->fu_cont.item.name? ! 954: filt->fu_cont.item.name: ! 955: mvalue)); ! 956: else if (!filt->fu_cont.item.name) { ! 957: count = strlen(mvalue); ! 958: value = mvalue + count - 1; ! 959: ! 960: while(!isalpha(*value) && value > mvalue) value--; ! 961: while (!isspace(*value) && value > mvalue) value--; ! 962: ! 963: if (mvalue < value) (void) strcpy(svalue, ++value); ! 964: else (void) strcpy(svalue, mvalue); ! 965: } else (void) strcpy(svalue, filt->fu_cont.item.name); ! 966: type = filt->fu_cont.item.fi_type; ! 967: ! 968: switch(type) { ! 969: case APPROX: ! 970: case EQUAL: ! 971: sfilt->flt_un.flt_un_item.fi_un.fi_un_ava.ava_type = ! 972: AttrT_new(filt->fu_cont.item.stroid); ! 973: ! 974: if ((sfilt->flt_un.flt_un_item.fi_un.fi_un_ava.ava_value = ! 975: str2AttrV(svalue, ! 976: sfilt->flt_un.flt_un_item.fi_un.fi_un_ava.ava_type-> ! 977: oa_syntax)) == NULL) { ! 978: ! 979: rfilt = sfilt->flt_next; ! 980: sfilt->flt_next = NULLFILTER; ! 981: filter_free(sfilt); ! 982: return rfilt; ! 983: } ! 984: ! 985: if (type == EQUAL) ! 986: sfilt->flt_un.flt_un_item.fi_type = FILTERITEM_EQUALITY; ! 987: else ! 988: sfilt->flt_un.flt_un_item.fi_type = FILTERITEM_APPROX; ! 989: ! 990: break; ! 991: ! 992: case SUBSTRING: ! 993: sfilt->flt_un.flt_un_item.fi_type = FILTERITEM_SUBSTRINGS; ! 994: sfilt->flt_un.flt_un_item.fi_un.fi_un_substrings.fi_sub_type = ! 995: AttrT_new(filt->fu_cont.item.stroid); ! 996: ! 997: sfilt->flt_un.flt_un_item.fi_un.fi_un_substrings.fi_sub_initial = ! 998: NULLAV; ! 999: sfilt->flt_un.flt_un_item.fi_un.fi_un_substrings.fi_sub_final = ! 1000: NULLAV; ! 1001: sfilt->flt_un.flt_un_item.fi_un.fi_un_substrings.fi_sub_any = ! 1002: avs_comp_new(str2AttrV(svalue, ! 1003: sfilt->flt_un.flt_un_item.fi_un. ! 1004: fi_un_substrings.fi_sub_type-> ! 1005: oa_syntax)); ! 1006: break; ! 1007: ! 1008: default: ! 1009: sfilt->flt_un.flt_un_item.fi_type = FILTERITEM_APPROX; ! 1010: break; ! 1011: } ! 1012: return sfilt; ! 1013: break; ! 1014: ! 1015: case AND: ! 1016: sfilt->flt_type = FILTER_AND; ! 1017: sfilt->flt_un.flt_un_filter = make_filter(filt->fu_cont.sub_filt); ! 1018: sfilt->flt_next = make_filter(filt->next); ! 1019: return sfilt; ! 1020: break; ! 1021: ! 1022: case OR: ! 1023: sfilt->flt_type = FILTER_OR; ! 1024: sfilt->flt_un.flt_un_filter = make_filter(filt->fu_cont.sub_filt); ! 1025: sfilt->flt_next = make_filter(filt->next); ! 1026: return sfilt; ! 1027: break; ! 1028: ! 1029: case NOT: ! 1030: sfilt->flt_type = FILTER_NOT; ! 1031: sfilt->flt_next = make_filter(filt->next); ! 1032: sfilt->flt_un.flt_un_filter = make_filter(filt->fu_cont.sub_filt); ! 1033: return sfilt; ! 1034: break; ! 1035: ! 1036: default: ! 1037: return NULLFILTER; ! 1038: } ! 1039: } ! 1040: ! 1041: ! 1042: srch_start() ! 1043: { ! 1044: struct ds_search_arg search_arg; ! 1045: struct ds_search_result result; ! 1046: struct DSError error; ! 1047: WIDGET *wdgt; ! 1048: char *str = base_path; ! 1049: ! 1050: if (*mvalue == '\0') { ! 1051: list_start(); ! 1052: return; ! 1053: } ! 1054: ! 1055: cleartext(); ! 1056: xprint("OK. Starting search.\n"); ! 1057: tprint("Chugging along....."); ! 1058: ! 1059: wdgt = getwidget(mainwdgts,'t'); ! 1060: ! 1061: if (get_default_service (&search_arg.sra_common) != 0) { ! 1062: xprint ("Default service error -> check your .quipurc\n"); ! 1063: return ; ! 1064: } ! 1065: ! 1066: search_arg.sra_common.ca_servicecontrol.svc_options = 1; ! 1067: search_arg.sra_common.ca_servicecontrol.svc_sizelimit = sizelimit; ! 1068: search_arg.sra_baseobject = (*base_path != 'T'? ! 1069: str2dn (base_path): ! 1070: NULLDN); ! 1071: search_arg.sra_eis.eis_allattributes = FALSE; ! 1072: search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES; ! 1073: search_arg.sra_eis.eis_select = read_types; ! 1074: ! 1075: while (*str != '\0' && *str != '@') str++; ! 1076: ! 1077: search_arg.sra_subset = ((*base_path != 'T' && *str == '@')? ! 1078: SRA_WHOLESUBTREE: ! 1079: SRA_ONELEVEL); ! 1080: search_arg.sra_filter = ! 1081: make_filter(filt_arr[gettogglindx(wdgt)]); ! 1082: ! 1083: #ifndef NO_STATS ! 1084: LLOG (log_stat,LLOG_NOTICE,("search +%s, extent %d, val %s",base_path,search_arg.sra_subset,mvalue)); ! 1085: #endif ! 1086: ! 1087: if(ds_search (&search_arg,&error,&result) != DS_OK) { ! 1088: /* deal with error */ ! 1089: free_seq(textseq); ! 1090: if (text_state == DN_LIST) free_seq(dnseq); ! 1091: dnseq = textseq = NULLDS; ! 1092: entry_number = 0; ! 1093: text_state = TEXT; ! 1094: cleartext(); ! 1095: xprint(" Search error due to:\n "); ! 1096: quipu_error(&error); ! 1097: } else { ! 1098: cleartext(); ! 1099: correlate_search_results (&result); ! 1100: ! 1101: if (result.CSR_entries != NULLENTRYINFO) { ! 1102: register EntryInfo *ptr; ! 1103: ! 1104: if (result.CSR_common.cr_aliasdereferenced) { ! 1105: xprint (" (Alias dereferenced - object is "); ! 1106: quipu_print (dn_print, (caddr_t) result.CSR_object); ! 1107: dn_free (result.CSR_object); ! 1108: xprint (")\n"); ! 1109: } ! 1110: ! 1111: if (text_state == DN_LIST) free_seq(dnseq); ! 1112: free_seq(textseq); ! 1113: dnseq = textseq = NULLDS; ! 1114: display_entry = current_entry = 1; ! 1115: entry_number = 0; ! 1116: text_state = DN_LIST; ! 1117: ! 1118: for (ptr = result.CSR_entries; ! 1119: ptr != NULLENTRYINFO; ptr = ptr->ent_next){ ! 1120: entry_number++; ! 1121: dn2str ((caddr_t) ptr->ent_dn, goto_path); ! 1122: add_seq (&dnseq, goto_path); ! 1123: cache_entry (ptr,TRUE,TRUE); ! 1124: } ! 1125: ! 1126: if (entry_number != 1) ! 1127: scrollbar('\0'); ! 1128: else { ! 1129: if (!isleaf(goto_path)) { ! 1130: get_listed_object('1', 0); ! 1131: } else { ! 1132: char temp[1024]; ! 1133: (void) strcpy(temp, base_path); ! 1134: (void) strcpy(base_path, goto_path); ! 1135: rd_start(); ! 1136: (void) strcpy(base_path, temp); ! 1137: } ! 1138: } ! 1139: } else if(result.CSR_limitproblem != LSR_TIMELIMITEXCEEDED) { ! 1140: free_seq(textseq); ! 1141: if (text_state == DN_LIST) free_seq(dnseq); ! 1142: dnseq = textseq = NULLDS; ! 1143: entry_number = 0; ! 1144: text_state = TEXT; ! 1145: xprint("Nothing found using current search parameters. Sorry!\n"); ! 1146: } ! 1147: ! 1148: if(result.CSR_limitproblem != LSR_NOLIMITPROBLEM) ! 1149: if(result.CSR_limitproblem == LSR_TIMELIMITEXCEEDED) { ! 1150: free_seq(textseq); ! 1151: if (text_state == DN_LIST) free_seq(dnseq); ! 1152: dnseq = textseq = NULLDS; ! 1153: entry_number = 0; ! 1154: text_state = TEXT; ! 1155: xprint("(Time limit exceeded)"); ! 1156: } else ! 1157: xprint("(Size limit exceeded)"); ! 1158: ! 1159: entryinfo_free(result.CSR_entries, 0); ! 1160: } ! 1161: ! 1162: filter_free(search_arg.sra_filter); ! 1163: } ! 1164: ! 1165: static dn2str (ptr,cptr) ! 1166: caddr_t ptr; ! 1167: char * cptr; ! 1168: { ! 1169: PS ps; ! 1170: char buffer [RESBUF]; ! 1171: ! 1172: if((ps = ps_alloc(str_open)) == NULLPS) return ; ! 1173: ! 1174: if(str_setup(ps, buffer, RESBUF, 1) == NOTOK) return ; ! 1175: ! 1176: dn_print(ps, (DN) ptr, EDBOUT); ! 1177: *ps->ps_ptr = 0; ! 1178: ! 1179: ps_free (ps); ! 1180: ! 1181: (void) strcpy(cptr, buffer); ! 1182: } ! 1183: ! 1184: ! 1185: read_print(func,ptr) ! 1186: int (*func) (); ! 1187: caddr_t ptr; ! 1188: { ! 1189: PS ps; ! 1190: char buffer [RESBUF]; ! 1191: char save; ! 1192: int i, size; ! 1193: register char *str, *sptr; ! 1194: ! 1195: if ((ps = ps_alloc (str_open)) == NULLPS) return ; ! 1196: ! 1197: if (str_setup (ps,buffer,RESBUF,1) == NOTOK) return ; ! 1198: ! 1199: (*func) (ps, ptr, READOUT); ! 1200: *ps->ps_ptr = 0; ! 1201: ! 1202: ps_free(ps); ! 1203: str = buffer ; ! 1204: sptr = str; ! 1205: size = strlen(buffer); ! 1206: ! 1207: if (text_state == DN_LIST) free_seq(dnseq); ! 1208: dnseq = NULLDS; ! 1209: free_seq(textseq); ! 1210: textseq = NULLDS; ! 1211: display_entry = current_entry = 1; ! 1212: entry_number = 0; ! 1213: text_state = TEXT; ! 1214: ! 1215: for (i = 0; i <= size; i++, sptr++) ! 1216: if (*sptr == '\n' || *sptr == '\0') { ! 1217: entry_number++; ! 1218: save = *sptr ; ! 1219: *sptr = '\0'; ! 1220: ! 1221: if (mailformat == greybook && indexstring(str, "rfc822") >= 0) ! 1222: (void) rfc2jnt(str); ! 1223: add_seq(&textseq, str); ! 1224: ! 1225: str = sptr+1; ! 1226: *sptr = save; ! 1227: } ! 1228: ! 1229: scrollbar('\0'); ! 1230: } ! 1231: ! 1232: quipu_print (func,ptr) ! 1233: int (*func) (); /* assumes func (PS ,dataptr,(int) format); */ ! 1234: caddr_t ptr; ! 1235: { ! 1236: /* log info to pstream */ ! 1237: PS ps; ! 1238: char buffer [RESBUF]; ! 1239: int count; ! 1240: register char *str, *sptr; ! 1241: char save; ! 1242: ! 1243: if ((ps = ps_alloc (str_open)) == NULLPS) return ; ! 1244: ! 1245: if (str_setup (ps,buffer,RESBUF,1) == NOTOK) return ; ! 1246: ! 1247: (*func) (ps,ptr,READOUT); ! 1248: *ps->ps_ptr = 0; ! 1249: ! 1250: ps_free (ps); ! 1251: ! 1252: /* print in blocks of 100 bytes-larger seems too much for curses*/ ! 1253: str = buffer; ! 1254: do { ! 1255: for (count = 0, sptr = str; *sptr != '\0' && ! 1256: count < 100; sptr++, count++); ! 1257: save = *sptr; ! 1258: *sptr = 0; ! 1259: xprint (str); ! 1260: *sptr = save; ! 1261: str = sptr; ! 1262: } while (*sptr != '\0'); ! 1263: } ! 1264: ! 1265: quipu_error (err) ! 1266: struct DSError * err; ! 1267: { ! 1268: PS ps; ! 1269: char buffer [RESBUF]; ! 1270: ! 1271: if ((ps = ps_alloc(str_open)) == NULLPS) return ; ! 1272: ! 1273: if (str_setup (ps, buffer, RESBUF, 1) == NOTOK) return ; ! 1274: ds_error(ps, err); ! 1275: ! 1276: *ps->ps_ptr = 0; ! 1277: xprint(buffer); ! 1278: } ! 1279: ! 1280: returnmain() ! 1281: { ! 1282: QUITFN(); ! 1283: setwidgets (mainwdgts,-1); ! 1284: rd_start(); ! 1285: scrollbar('\0'); ! 1286: } ! 1287: ! 1288: free_filt(filt) ! 1289: filt_struct *filt; ! 1290: { ! 1291: if (filt) { ! 1292: free_filt(filt->next); ! 1293: ! 1294: if (filt->flt_type = ITEM) { ! 1295: free(filt->fu_cont.item.stroid); ! 1296: if (filt->fu_cont.item.name) free(filt->fu_cont.item.name); ! 1297: } else ! 1298: free_filt(filt->fu_cont.sub_filt); ! 1299: ! 1300: free(filt); ! 1301: } else ! 1302: return; ! 1303: } ! 1304: ! 1305: get_listed_object(number, wdgt) ! 1306: char number; ! 1307: WIDGET *wdgt; ! 1308: { ! 1309: int entrynum, count = 0; ! 1310: char *sptr, *str; ! 1311: char buffer[1024]; ! 1312: ! 1313: if (text_state != DN_LIST && text_state != BACK_LIST) { ! 1314: *wdgt->dstr = '\0'; ! 1315: printdialog(wdgt); ! 1316: return; ! 1317: } ! 1318: ! 1319: *srchvalue = number; ! 1320: *(srchvalue+1) = '\0'; ! 1321: ! 1322: if (wdgt) { ! 1323: printdialog(wdgt); ! 1324: dialog(wdgt); ! 1325: } ! 1326: ! 1327: entrynum = atoi(srchvalue); ! 1328: ! 1329: if (entrynum > entry_number) { ! 1330: *wdgt->dstr = '\0'; ! 1331: printdialog(wdgt); ! 1332: return; ! 1333: } ! 1334: ! 1335: if (sptr = get_from_seq (entrynum, dnseq)) ! 1336: if(!isleaf(sptr)) { ! 1337: cleartext(); ! 1338: str = get_from_seq(count+1, back_seq); ! 1339: ! 1340: while (count < back_buf_num && strcmp(str, base_path)){ ! 1341: count++; ! 1342: str = get_from_seq(count+1, back_seq); ! 1343: } ! 1344: ! 1345: if (count == back_buf_num) { ! 1346: add_seq(&back_seq, base_path); ! 1347: back_buf_num++; ! 1348: } ! 1349: ! 1350: (void) strcpy(base_path, sptr); ! 1351: make_friendly(friendly_base_path, base_path); ! 1352: wdgt = getwidget(mainwdgts, '\0'); ! 1353: printdialog(wdgt); ! 1354: rd_start(); ! 1355: typetoggled = 0; ! 1356: set_default_type(); ! 1357: } else { ! 1358: (void) strcpy(buffer, base_path); ! 1359: (void) strcpy(base_path, sptr); ! 1360: make_friendly(friendly_base_path, base_path); ! 1361: rd_start(); ! 1362: (void) strcpy(base_path, buffer); ! 1363: } ! 1364: *srchvalue = '\0'; ! 1365: } ! 1366: ! 1367: scrollbar(command) ! 1368: char command; ! 1369: { ! 1370: register char *str; ! 1371: char *base_rdn; ! 1372: register int rdn_count = 0; ! 1373: int lines, count = 0; ! 1374: D_seq thisseq; ! 1375: ! 1376: if (!entry_number) ! 1377: return 0; ! 1378: ! 1379: if(command == '[') { ! 1380: if(display_entry >= entry_number) ! 1381: return; ! 1382: ! 1383: for (count = 0; (display_entry + count) < entry_number && ! 1384: count < text_height/2; count++); ! 1385: ! 1386: current_entry += count; ! 1387: } else if(command == ']') { ! 1388: ! 1389: for (count = 0; (current_entry - count) > 1 && ! 1390: count < text_height/2; count++); ! 1391: ! 1392: current_entry -= count; ! 1393: } ! 1394: ! 1395: cleartext(); ! 1396: ! 1397: switch(text_state) { ! 1398: ! 1399: case BACK_LIST: ! 1400: thisseq = back_seq; ! 1401: break; ! 1402: ! 1403: case DN_LIST: ! 1404: base_rdn = base_path; ! 1405: while(*base_rdn != '\0') { ! 1406: if(*base_rdn == '@') ! 1407: rdn_count++; ! 1408: base_rdn++; ! 1409: } ! 1410: if (*base_path != 'T') rdn_count++; ! 1411: thisseq = dnseq; ! 1412: break; ! 1413: ! 1414: case TEXT: ! 1415: thisseq = textseq; ! 1416: break; ! 1417: } ! 1418: ! 1419: if (current_entry > entry_number) ! 1420: current_entry = 1; ! 1421: ! 1422: lines = linec()-2; ! 1423: count = 0; ! 1424: ! 1425: for (display_entry = current_entry; display_entry <= entry_number ! 1426: && gety() < lines; display_entry++) { ! 1427: ! 1428: if (text_state == DN_LIST || text_state == BACK_LIST) ! 1429: xprintint(" %d ", display_entry) ; ! 1430: ! 1431: base_rdn = str = get_from_seq(display_entry, thisseq); ! 1432: ! 1433: if (text_state == DN_LIST && rdn_count) { ! 1434: while (rdn_count) { ! 1435: if (*str == '@') rdn_count--; ! 1436: str++; ! 1437: } ! 1438: ! 1439: while(*str == ' ') str++; ! 1440: count = (int) (str - base_rdn); ! 1441: ! 1442: } else if (count) str += count; ! 1443: ! 1444: if (str) { ! 1445: if (text_state != TEXT) { ! 1446: make_friendly(friendly_name, str); ! 1447: xprint(friendly_name); ! 1448: } else ! 1449: xprint(str); ! 1450: xprint("\n"); ! 1451: } ! 1452: } ! 1453: ! 1454: if (text_state == DN_LIST) ! 1455: if (current_entry >= entry_number) xprint("<List finished>"); ! 1456: else xprintint("<Total of %d entries>", entry_number); ! 1457: ! 1458: printbar(entry_number, current_entry, display_entry-current_entry); ! 1459: display_entry--; ! 1460: return 1; ! 1461: } ! 1462: ! 1463: make_friendly(fstr, str) ! 1464: char *fstr; ! 1465: register char *str; ! 1466: { ! 1467: register char *end_ptr; ! 1468: char save; ! 1469: ! 1470: *fstr = '\0'; ! 1471: if (!strcmp(str, "The World")) { ! 1472: (void) strcpy(fstr, str); ! 1473: return; ! 1474: } ! 1475: ! 1476: while (*str != '\0') { ! 1477: while (*str != '=') str++; ! 1478: while (*str == ' ') str++; ! 1479: ! 1480: end_ptr = ++str; ! 1481: while (*end_ptr != '@' && *end_ptr != '\0') end_ptr++; ! 1482: save = *end_ptr; ! 1483: *end_ptr = '\0'; ! 1484: if (*fstr == '\0') ! 1485: (void) strcpy(fstr, str); ! 1486: else ! 1487: (void) strcat(fstr, str); ! 1488: *end_ptr = save; ! 1489: str = end_ptr; ! 1490: if (*str != '\0') ! 1491: (void) strcat(fstr, ", "); ! 1492: } ! 1493: } ! 1494: ! 1495: ! 1496: goto_addr() ! 1497: { ! 1498: set_default_type(); ! 1499: rd_start(); ! 1500: } ! 1501: ! 1502: int ! 1503: isleaf(name) ! 1504: char *name; ! 1505: { ! 1506: struct ds_list_arg list_arg; ! 1507: struct ds_list_result list_result; ! 1508: ! 1509: struct ds_read_arg read_arg; ! 1510: struct ds_read_result read_result; ! 1511: ! 1512: struct DSError list_error, read_error; ! 1513: char entry_str[1024]; ! 1514: ! 1515: if (get_default_service (&read_arg.rda_common) != 0) return(1); ! 1516: ! 1517: read_arg.rda_common.ca_servicecontrol.svc_options = 1; ! 1518: read_arg.rda_eis.eis_allattributes = FALSE; ! 1519: read_arg.rda_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES; ! 1520: read_arg.rda_eis.eis_select = oclass; ! 1521: ! 1522: read_arg.rda_object = (*name? str2dn(name): NULLDN); ! 1523: if (ds_read (&read_arg,&read_error,&read_result) != DS_OK) return(1); ! 1524: else { ! 1525: if (read_result.rdr_entry.ent_attr == NULLATTR) return(0); ! 1526: entry2str((caddr_t) read_result.rdr_entry.ent_attr, entry_str, 1024); ! 1527: if (issubstr(entry_str, "NonLeaf")) return(0); ! 1528: } ! 1529: if (get_default_service (&list_arg.lsa_common) != 0) return(1); ! 1530: ! 1531: list_arg.lsa_common.ca_servicecontrol.svc_sizelimit = 1; ! 1532: list_arg.lsa_common.ca_servicecontrol.svc_options = 1; ! 1533: ! 1534: if (*name) ! 1535: list_arg.lsa_object = str2dn(name); ! 1536: else ! 1537: list_arg.lsa_object = NULLDN; ! 1538: ! 1539: if (ds_list (&list_arg,&list_error,&list_result) != DS_OK) ! 1540: return (1); ! 1541: else { ! 1542: if (list_result.lsr_subordinates == NULLSUBORD) return(1); ! 1543: else return(0); ! 1544: } ! 1545: } ! 1546: ! 1547: entry2str(ptr, cptr, size) ! 1548: caddr_t ptr; ! 1549: char *cptr; ! 1550: int size; ! 1551: { ! 1552: PS ps; ! 1553: ! 1554: if ((ps = ps_alloc (str_open)) == NULLPS) return ; ! 1555: if (str_setup (ps, cptr, size, 1) == NOTOK) return ; ! 1556: ! 1557: as_print(ps, (Attr_Sequence) ptr, READOUT); ! 1558: *ps->ps_ptr = 0; ! 1559: ! 1560: ps_free(ps); ! 1561: } ! 1562: ! 1563: int issubstr(str, substr) ! 1564: char *str; ! 1565: char *substr; ! 1566: { ! 1567: register char *sptr; ! 1568: char c; ! 1569: int substrlen = strlen(substr); ! 1570: int count; ! 1571: ! 1572: if (*substr == '\0' || *str == '\0') return(0); ! 1573: ! 1574: sptr = str; ! 1575: c = *substr; ! 1576: ! 1577: while (1) { ! 1578: while (*sptr != '\0' && *sptr != c) sptr++; ! 1579: if (*sptr == '\0') return(0); ! 1580: for (count = 0; count >= 0 && count < substrlen; count++) { ! 1581: if (sptr[count] == '\0') return(0); ! 1582: else if (substr[count] != sptr[count]) count = -2; ! 1583: } ! 1584: if (count == substrlen) return(1); ! 1585: } ! 1586: } ! 1587: ! 1588: int indexstring(string, substring) ! 1589: char *string, ! 1590: *substring; ! 1591: { ! 1592: register char *sub, *str; ! 1593: char c, s; ! 1594: int indx = 0; ! 1595: ! 1596: while (1) { ! 1597: str = string + indx;; ! 1598: if (*str == '\0') return(-1); ! 1599: sub = substring; ! 1600: ! 1601: if (*str == *sub) { ! 1602: s = *str; ! 1603: c = *sub; ! 1604: while(c == s && c != '\0') { ! 1605: c = *++sub; ! 1606: s = *++str; ! 1607: } ! 1608: if (c == '\0') return((int) indx); ! 1609: else if(s == '\0') return(-1); ! 1610: } ! 1611: indx++; ! 1612: } ! 1613: } ! 1614: ! 1615: rfc2jnt(string) ! 1616: char *string; ! 1617: { ! 1618: char reversed[STRINGLEN]; ! 1619: char front[STRINGLEN]; ! 1620: register char *part; ! 1621: char *mailbox; ! 1622: ! 1623: mailbox = string; ! 1624: while (*mailbox != '-') mailbox++; ! 1625: ! 1626: reversed[0] = '\0'; ! 1627: part = string + strlen(string); ! 1628: ! 1629: if (*part != '\0') return; ! 1630: ! 1631: while(1) { ! 1632: while (*part != '.' && *part != '@') --part; ! 1633: ! 1634: if (*part == '.') { ! 1635: if (reversed[0] != '\0') (void) strcat(reversed, "."); ! 1636: part++; ! 1637: (void) strcat(reversed, part); ! 1638: *--part = '\0'; ! 1639: --part; ! 1640: } else { ! 1641: part++; ! 1642: (void) strcat(reversed, "."); ! 1643: (void) strcat(reversed, part); ! 1644: *part-- = '\0'; ! 1645: while (!isspace(*part)) --part; ! 1646: ++part; ! 1647: (void) strcpy(front, part); ! 1648: (void) strcpy(string, "mailbox - "); ! 1649: (void) strcat(string, front); ! 1650: (void) strcat(string, reversed); ! 1651: return; ! 1652: } ! 1653: } ! 1654: } ! 1655: ! 1656: struct attrcomp * ! 1657: sort_attrs(entry_attrs) ! 1658: struct attrcomp *entry_attrs; ! 1659: { ! 1660: struct attrcomp *last, *next, *curr, *first, *firstn; ! 1661: ! 1662: first = curr = entry_attrs; ! 1663: firstn = last = next = 0; ! 1664: ! 1665: while (curr) ! 1666: if (!strcmp("2.5.4.3", curr->attr_type->oa_ot.ot_stroid) || ! 1667: !strcmp("2.5.4.4", curr->attr_type->oa_ot.ot_stroid) || ! 1668: !strcmp("0.9.2342.19200300.100.1.3", ! 1669: curr->attr_type->oa_ot.ot_stroid) || ! 1670: !strcmp("0.9.2342.19200300.100.1.2", ! 1671: curr->attr_type->oa_ot.ot_stroid) || ! 1672: !strcmp("2.5.4.20", curr->attr_type->oa_ot.ot_stroid)) { ! 1673: ! 1674: if (first == curr) first = curr->attr_link; ! 1675: ! 1676: if (next) ! 1677: next->attr_link = curr; ! 1678: else ! 1679: firstn = curr; ! 1680: ! 1681: next = curr; ! 1682: ! 1683: if (last) ! 1684: last->attr_link = curr->attr_link; ! 1685: ! 1686: curr = curr->attr_link; ! 1687: next->attr_link = 0; ! 1688: } else { ! 1689: last = curr; ! 1690: curr = curr->attr_link; ! 1691: } ! 1692: ! 1693: if (next) { ! 1694: next->attr_link = first; ! 1695: return firstn; ! 1696: } else ! 1697: return first; ! 1698: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.