Annotation of 43BSDReno/contrib/isode-beta/others/quipu/uips/sd/calls.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.