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

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

unix.superglobalmegacorp.com

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