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

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

unix.superglobalmegacorp.com

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