Annotation of 43BSDReno/contrib/isode-beta/dsap/common/ufn_parse.c, revision 1.1

1.1     ! root        1: /* ufn_parse.c - user-friendly name resolution */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/ufn_parse.c,v 7.1 90/07/09 14:35:20 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/dsap/common/RCS/ufn_parse.c,v 7.1 90/07/09 14:35:20 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       ufn_parse.c,v $
        !            12:  * Revision 7.1  90/07/09  14:35:20  mrose
        !            13:  * sync
        !            14:  * 
        !            15:  * Revision 7.0  90/06/11  09:59:42  mrose
        !            16:  * *** empty log message ***
        !            17:  * 
        !            18:  */
        !            19: 
        !            20: /*
        !            21:  *                               NOTICE
        !            22:  *
        !            23:  *    Acquisition, use, and distribution of this module and related
        !            24:  *    materials are subject to the restrictions of a license agreement.
        !            25:  *    Consult the Preface in the User's Manual for the full terms of
        !            26:  *    this agreement.
        !            27:  *
        !            28:  */
        !            29: 
        !            30: 
        !            31: #include "quipu/ufn.h"
        !            32: #include "tailor.h"
        !            33: #include "quipu/list.h"
        !            34: #include "quipu/ds_search.h"
        !            35: #include "quipu/connection.h"  /* ds_search uses di_block - include this for lint !!! */
        !            36: #include "quipu/dua.h"
        !            37: 
        !            38: char ufn_notify = FALSE;
        !            39: extern char PY_pepy[];
        !            40: #define NOTIFY(x) if (ufn_notify) (void) printf x, (void) putchar('\n'); else ;
        !            41: 
        !            42: AttributeType at_OrgUnit;
        !            43: AttributeType at_Organisation;
        !            44: AttributeType at_Locality;
        !            45: AttributeType at_CountryName;
        !            46: AttributeType at_FriendlyCountryName;
        !            47: AttributeType at_CommonName;
        !            48: AttributeType at_Surname;
        !            49: AttributeType at_Userid;
        !            50: 
        !            51: AttributeType at_ObjectClass;
        !            52: 
        !            53: Attr_Sequence ufnas = NULL;
        !            54: 
        !            55: extern LLog * log_dsap;
        !            56: 
        !            57: extern Filter strfilter ();
        !            58: extern Filter ocfilter ();
        !            59: extern Filter joinfilter ();
        !            60: 
        !            61: DNS DNS_append (a,b)
        !            62: DNS a, b;
        !            63: {      
        !            64: DNS c;
        !            65:        if (a == NULLDNS)
        !            66:                return b;
        !            67: 
        !            68:        for (c=a; c->dns_next != NULLDNS; c=c->dns_next)
        !            69:                ; /* Nothing */
        !            70: 
        !            71:        c->dns_next = b;
        !            72: 
        !            73:        return a;
        !            74: }
        !            75: 
        !            76: static Attr_Sequence read_cache (base)
        !            77: DN base;
        !            78: {
        !            79: Entry ptr;
        !            80: 
        !            81:        if ((ptr = local_find_entry (base,FALSE)) != NULLENTRY) 
        !            82:                return (ptr->e_attributes);
        !            83: 
        !            84:        (void) printf ("You need the bug fix to libquipu.a !!!\n");
        !            85:        return NULLATTR;
        !            86: }
        !            87: 
        !            88: static char exact_match (dn,s) 
        !            89: DN dn;
        !            90: char * s;
        !            91: {
        !            92: RDN rdn;
        !            93:        for (; dn->dn_parent != NULLDN; dn=dn->dn_parent)
        !            94:                ; /* Nothing */
        !            95: 
        !            96:        for (rdn = dn->dn_rdn; rdn != NULLRDN; rdn=rdn->rdn_next) {
        !            97:                if (sub_string (rdn->rdn_av.av_syntax)
        !            98:                && (lexequ((char *)rdn->rdn_av.av_struct,s) == 0))
        !            99:                        return TRUE;
        !           100:        }
        !           101:        return FALSE;
        !           102: }
        !           103: 
        !           104: static char good_match (dn,s) 
        !           105: DN dn;
        !           106: char * s;
        !           107: {
        !           108: Attr_Sequence as;
        !           109: AV_Sequence avs;
        !           110: 
        !           111:        for (as = read_cache(dn); as != NULLATTR; as=as->attr_link)
        !           112:                for (avs=as->attr_value; avs!= NULLAV; avs=avs->avseq_next)
        !           113:                        if (sub_string (avs->avseq_av.av_syntax)
        !           114:                                && (lexequ((char *)avs->avseq_av.av_struct,s) == 0))
        !           115:                                        return TRUE;
        !           116:        return FALSE;
        !           117: }
        !           118: 
        !           119: dnSelect (s,dlist,interact,el)
        !           120: char * s;
        !           121: DNS *dlist;
        !           122: DNS (* interact) ();
        !           123: DNS el;
        !           124: {
        !           125: DNS exact = NULLDNS;
        !           126: DNS good  = NULLDNS;
        !           127: DNS bad   = NULLDNS;
        !           128: DNS tmp, next = NULLDNS;
        !           129: 
        !           130:        if ((dlist == (DNS *)NULL) || (*dlist == NULLDNS))
        !           131:                return 2;
        !           132: 
        !           133:        for (tmp= *dlist; tmp != NULLDNS; tmp=next) {
        !           134:                next = tmp->dns_next;
        !           135:                if (exact_match(tmp->dns_dn,s)) {
        !           136:                        tmp->dns_next = exact;
        !           137:                        exact = tmp;
        !           138:                } else if (good_match(tmp->dns_dn,s)) {
        !           139:                        tmp->dns_next = good;
        !           140:                        good = tmp;
        !           141:                } else {
        !           142:                        tmp->dns_next = bad;
        !           143:                        bad = tmp;
        !           144:                }
        !           145:        }
        !           146: 
        !           147: 
        !           148:        if (exact) {
        !           149:                NOTIFY (("Found exact match(es) for '%s'",s));
        !           150:                *dlist = exact;
        !           151:                dn_seq_free (good);
        !           152:                dn_seq_free (bad);
        !           153:                return TRUE;
        !           154:        }
        !           155: 
        !           156:        if (good) {
        !           157:                NOTIFY (("Found good match(es) for '%s'",s));
        !           158:                *dlist = good;
        !           159:                dn_seq_free (bad);
        !           160:                return TRUE;
        !           161:        }
        !           162: 
        !           163:        good = (*interact)(bad,el->dns_dn,s);
        !           164:        *dlist = good;
        !           165:        if (good != NULLDNS)
        !           166:                return TRUE;
        !           167:        else
        !           168:                return 2;       /* back track allowed ! */
        !           169: 
        !           170: }
        !           171: 
        !           172: ufn_search (base, subtree, filt, res, s, interact, el)
        !           173: DN base;
        !           174: char subtree;
        !           175: Filter filt;
        !           176: DNS * res;
        !           177: char * s;
        !           178: DNS (* interact) ();
        !           179: DNS el;
        !           180: {
        !           181: struct ds_search_arg search_arg;
        !           182: static struct ds_search_result result;
        !           183: struct DSError err;
        !           184: static CommonArgs ca = default_common_args;
        !           185: EntryInfo * ptr;
        !           186: DNS newdns, r = NULLDNS;
        !           187: 
        !           188:        search_arg.sra_baseobject = base;
        !           189:        search_arg.sra_filter = filt;
        !           190:        if (subtree)
        !           191:                search_arg.sra_subset = SRA_WHOLESUBTREE;
        !           192:        else    
        !           193:                search_arg.sra_subset = SRA_ONELEVEL;
        !           194:        search_arg.sra_searchaliases = TRUE;
        !           195:        search_arg.sra_common = ca; /* struct copy */
        !           196:        search_arg.sra_eis.eis_infotypes = TRUE;
        !           197:        search_arg.sra_eis.eis_allattributes = FALSE;
        !           198:        search_arg.sra_eis.eis_select = ufnas;
        !           199: 
        !           200: #ifdef DEBUG
        !           201:        if (ufn_notify == 2)
        !           202:            print_search (base, subtree, filt);
        !           203: #endif
        !           204:        if (ds_search (&search_arg, &err, &result) != DS_OK) {
        !           205:                log_ds_error (&err);
        !           206:                NOTIFY (("DAP Search returned an error"))
        !           207:                ds_error_free (&err);
        !           208:                filter_free (filt);
        !           209:                return FALSE;
        !           210:        }
        !           211: 
        !           212:        filter_free (filt);
        !           213:        correlate_search_results (&result);
        !           214: 
        !           215:        if ( (result.CSR_limitproblem != LSR_NOLIMITPROBLEM) || (result.CSR_cr != NULLCONTINUATIONREF)) {
        !           216:                if ( ! result.CSR_entries) {
        !           217:                        NOTIFY (("Search returned partial results"))
        !           218:                        return FALSE;
        !           219:                } 
        !           220:                NOTIFY (("Continuing with partial results !"));
        !           221:        }
        !           222: 
        !           223:        for (ptr = result.CSR_entries; ptr != NULLENTRYINFO; ptr=ptr->ent_next) {
        !           224:                cache_entry (ptr,FALSE,TRUE);
        !           225:                newdns = dn_seq_alloc();
        !           226:                newdns->dns_next = r;
        !           227:                newdns->dns_dn = dn_cpy (ptr->ent_dn);
        !           228:                r = newdns;
        !           229:        }
        !           230: 
        !           231:        *res = r;
        !           232: 
        !           233:        return dnSelect (s,res,interact,el);
        !           234: }
        !           235: 
        !           236: static rootSearch (s,interact,el,result)
        !           237: char * s;
        !           238: DNS (* interact) ();
        !           239: DNS el;
        !           240: DNS * result;
        !           241: {
        !           242: Filter filt, filta, filtb, filtc, filtd, filte, filtf;
        !           243: 
        !           244:        if (strlen (s) == 2) {
        !           245: 
        !           246:                filta = strfilter (at_CountryName,s,FILTERITEM_EQUALITY);
        !           247:                filtb = strfilter (at_FriendlyCountryName,s,FILTERITEM_EQUALITY);
        !           248:                filtc = strfilter (at_Organisation,s,FILTERITEM_EQUALITY);
        !           249: 
        !           250:                filtb->flt_next = filta;
        !           251:                filtc->flt_next = filtb;
        !           252: 
        !           253:                filt = joinfilter (filtc, FILTER_OR);
        !           254: 
        !           255:                return ufn_search (NULLDN,FALSE,filt,result,s,interact,el);
        !           256: 
        !           257:        } else {
        !           258: 
        !           259:                filta = strfilter (at_FriendlyCountryName,s,FILTERITEM_SUBSTRINGS);
        !           260:                filtb = strfilter (at_FriendlyCountryName,s,FILTERITEM_APPROX);
        !           261:                filtc = strfilter (at_Organisation,s,FILTERITEM_SUBSTRINGS);
        !           262:                filtd = strfilter (at_Organisation,s,FILTERITEM_APPROX);
        !           263:                filte = strfilter (at_Locality,s,FILTERITEM_SUBSTRINGS);
        !           264:                filtf = strfilter (at_Locality,s,FILTERITEM_APPROX);
        !           265: 
        !           266:                filtb->flt_next = filta;
        !           267:                filtc->flt_next = filtb;
        !           268:                filtd->flt_next = filtc;
        !           269:                filte->flt_next = filtd;
        !           270:                filtf->flt_next = filte;
        !           271: 
        !           272:                filt = joinfilter (filtf, FILTER_OR);
        !           273: 
        !           274:                return ufn_search (NULLDN,FALSE,filt,result,s,interact,el);
        !           275:        }
        !           276: }
        !           277: 
        !           278: static char present (d,t)
        !           279: DN d;
        !           280: AttributeType t;
        !           281: {
        !           282:        for (; d != NULLDN; d=d->dn_parent)
        !           283:                if (AttrT_cmp (d->dn_rdn->rdn_at,t) == 0)
        !           284:                        return TRUE;
        !           285: 
        !           286:        return FALSE;   /* More work ... */
        !           287: }
        !           288: 
        !           289: static intSearch (base,s,interact,el,result)
        !           290: DN base;
        !           291: char * s;
        !           292: DNS (* interact) ();
        !           293: DNS el;
        !           294: DNS * result;
        !           295: {
        !           296: Filter filt, filta, filtb, filtc, filtd, filte, filtf, filtg, filth;
        !           297: 
        !           298:        if ( present (base,at_OrgUnit) ) {
        !           299: 
        !           300:                filta = strfilter (at_OrgUnit,s,FILTERITEM_APPROX);
        !           301:                filtb = strfilter (at_OrgUnit,s,FILTERITEM_SUBSTRINGS);
        !           302: 
        !           303:                filtb->flt_next = filta;
        !           304: 
        !           305:                filt = joinfilter (filtb, FILTER_OR);
        !           306: 
        !           307:                if ((filte = ocfilter ("OrganizationalUnit")) == NULLFILTER)
        !           308:                        return FALSE;
        !           309: 
        !           310:                filte->flt_next = filt;
        !           311: 
        !           312:                filtf = joinfilter (filte, FILTER_AND);
        !           313: 
        !           314:                return ufn_search (base,FALSE,filtf,result,s,interact,el);
        !           315: 
        !           316:        } else if ( present (base,at_Organisation) ) {
        !           317: 
        !           318:                filta = strfilter (at_OrgUnit,s,FILTERITEM_APPROX);
        !           319:                filtb = strfilter (at_OrgUnit,s,FILTERITEM_SUBSTRINGS);
        !           320:                filtc = strfilter (at_Locality,s,FILTERITEM_APPROX);
        !           321:                filtd = strfilter (at_Locality,s,FILTERITEM_SUBSTRINGS);
        !           322: 
        !           323:                filtb->flt_next = filta;
        !           324:                filtc->flt_next = filtb;
        !           325:                filtd->flt_next = filtc;
        !           326: 
        !           327:                filt = joinfilter (filtd, FILTER_OR);
        !           328: 
        !           329:                if ((filte = ocfilter ("OrganizationalUnit")) == NULLFILTER)
        !           330:                        return FALSE;
        !           331:                if ((filth = ocfilter ("Locality")) == NULLFILTER)
        !           332:                        return FALSE;
        !           333: 
        !           334:                filth->flt_next = filte;
        !           335: 
        !           336:                filtg = joinfilter (filth, FILTER_OR);
        !           337:                filtg->flt_next = filt;
        !           338:                filtf = joinfilter (filtg, FILTER_AND);
        !           339: 
        !           340:                return ufn_search (base,FALSE,filtf,result,s,interact,el);
        !           341: 
        !           342:        } else if ( present (base,at_Locality) ) {
        !           343: 
        !           344:                filta = strfilter (at_Organisation,s,FILTERITEM_APPROX);
        !           345:                filtb = strfilter (at_Organisation,s,FILTERITEM_SUBSTRINGS);
        !           346: 
        !           347:                filtb->flt_next = filta;
        !           348: 
        !           349:                filt = joinfilter (filtb, FILTER_OR);
        !           350: 
        !           351:                if ((filte = ocfilter ("Organization")) == NULLFILTER)
        !           352:                        return FALSE;
        !           353: 
        !           354:                filte->flt_next = filt;
        !           355: 
        !           356:                filtf = joinfilter (filte, FILTER_AND);
        !           357: 
        !           358:                return ufn_search (base,FALSE,filtf,result,s,interact,el);
        !           359:        } else {
        !           360:                filta = strfilter (at_Organisation,s,FILTERITEM_APPROX);
        !           361:                filtb = strfilter (at_Organisation,s,FILTERITEM_SUBSTRINGS);
        !           362:                filtc = strfilter (at_Locality,s,FILTERITEM_APPROX);
        !           363:                filtd = strfilter (at_Locality,s,FILTERITEM_SUBSTRINGS);
        !           364: 
        !           365:                filtb->flt_next = filta;
        !           366:                filtc->flt_next = filtb;
        !           367:                filtd->flt_next = filtc;
        !           368: 
        !           369:                filt = joinfilter (filtd, FILTER_OR);
        !           370: 
        !           371:                if ((filte = ocfilter ("Organization")) == NULLFILTER)
        !           372:                        return FALSE;
        !           373:                if ((filth = ocfilter ("Locality")) == NULLFILTER)
        !           374:                        return FALSE;
        !           375: 
        !           376:                filth->flt_next = filte;
        !           377: 
        !           378:                filtg = joinfilter (filth, FILTER_OR);
        !           379:                filtg->flt_next = filt;
        !           380:                filtf = joinfilter (filtg, FILTER_AND);
        !           381: 
        !           382:                return ufn_search (base,FALSE,filtf,result,s,interact,el);
        !           383:        }
        !           384: }
        !           385: 
        !           386: static leafSearch (base,s,subtree,interact,el,result)
        !           387: DN base;
        !           388: char * s;
        !           389: char subtree;
        !           390: DNS (* interact) ();
        !           391: DNS el;
        !           392: DNS * result;
        !           393: {
        !           394: Filter filt, filta, filtb, filtc, filtd, filte, filtf;
        !           395: 
        !           396:        filta = strfilter (at_CommonName,s,FILTERITEM_APPROX);
        !           397:        filtb = strfilter (at_CommonName,s,FILTERITEM_SUBSTRINGS);
        !           398:        filtc = strfilter (at_Surname,s,FILTERITEM_APPROX);
        !           399:        filtd = strfilter (at_Surname,s,FILTERITEM_SUBSTRINGS);
        !           400:        filte = strfilter (at_Userid,s,FILTERITEM_APPROX);
        !           401:        filtf = strfilter (at_Userid,s,FILTERITEM_SUBSTRINGS);
        !           402: 
        !           403:        filtb->flt_next = filta;
        !           404:        filtc->flt_next = filtb;
        !           405:        filtd->flt_next = filtc;
        !           406:        filte->flt_next = filtd;
        !           407:        filtf->flt_next = filte;
        !           408: 
        !           409:        filt = joinfilter (filtf, FILTER_OR);
        !           410: 
        !           411:        return ufn_search (base,subtree,filt,result,s,interact,el);
        !           412: }
        !           413: 
        !           414: static keyedSearch (base,t,v,interact,el,result)
        !           415: DN base;
        !           416: char * t, *v; 
        !           417: DNS (* interact) ();
        !           418: DNS el;
        !           419: DNS * result;
        !           420: {
        !           421: Filter filt, filta, filtb;
        !           422: AttributeType at;
        !           423: 
        !           424:        if ((at = AttrT_new (t)) == NULLAttrT) {
        !           425:                NOTIFY (("Invalid Key !"));
        !           426:                return FALSE;
        !           427:        }
        !           428:        if ( ! sub_string (at->oa_syntax)) {
        !           429:                NOTIFY (("String types only !"));
        !           430:                return FALSE;
        !           431:        }
        !           432: 
        !           433:        filta = strfilter (at,v,FILTERITEM_SUBSTRINGS);
        !           434:        filtb = strfilter (at,v,FILTERITEM_APPROX);
        !           435: 
        !           436:        filtb->flt_next = filta;
        !           437: 
        !           438:        filt = joinfilter (filtb, FILTER_OR);
        !           439: 
        !           440:        if (base && base->dn_parent)
        !           441:                return ufn_search (base,TRUE,filt,result,v,interact,el);
        !           442:        else
        !           443:                return ufn_search (base,FALSE,filt,result,v,interact,el);
        !           444: }
        !           445: 
        !           446: 
        !           447: static purportedMatch(base,c,v,interact,el,result)
        !           448: DN base;
        !           449: int c;
        !           450: char ** v;
        !           451: DNS (* interact) ();
        !           452: DNS el;
        !           453: DNS * result;
        !           454: {
        !           455: char * s = v[c-1];
        !           456: DNS root, x, new = NULLDNS;
        !           457: char * ptr;
        !           458: int matches;
        !           459: 
        !           460:        if (c == 1) {
        !           461: 
        !           462:                if ((ptr = index (s,'=')) != NULLCP) {
        !           463:                        *ptr++ = 0;
        !           464:                        matches = keyedSearch (base,SkipSpace(s),SkipSpace(ptr),interact,el,result);
        !           465:                        *(--ptr) = '=';
        !           466:                        return matches;
        !           467:                } else if (base == NULLDN) {
        !           468:                        matches = rootSearch(s,interact,el,result);
        !           469:                        if (*result != NULLDNS)
        !           470:                                return matches;
        !           471:                        else if (matches == TRUE)
        !           472:                                return TRUE;
        !           473:                        else
        !           474:                                return leafSearch (base,s,FALSE,interact,el,result);
        !           475:                } else if (base->dn_parent == NULLDN) {
        !           476:                        /* length == 1 */
        !           477:                        matches = intSearch (base,s,interact,el,result);
        !           478:                        if (*result != NULLDNS)
        !           479:                                return matches;
        !           480:                        else if (matches == TRUE)
        !           481:                                return TRUE;
        !           482:                        else
        !           483:                                return leafSearch (base,s,FALSE,interact,el,result);
        !           484:                } else {
        !           485:                        matches = leafSearch (base,s,TRUE,interact,el,result);
        !           486:                        if (*result != NULLDNS)
        !           487:                                return matches;
        !           488:                        else if (matches == TRUE)
        !           489:                                return TRUE;
        !           490:                        else
        !           491:                                return intSearch (base,s,interact,el,result);
        !           492:                }
        !           493:        }
        !           494: 
        !           495:        if ((ptr = index (s,'=')) != NULLCP) {
        !           496:                *ptr++ = 0;
        !           497:                if ( ! (matches = keyedSearch (base,SkipSpace(s),SkipSpace(ptr),interact,el,&root))) {
        !           498:                        *(--ptr) = '=';
        !           499:                        return FALSE;
        !           500:                }
        !           501:                *(--ptr) = '=';
        !           502:        } else if (base == NULLDN) {
        !           503:                if ( ! (matches = rootSearch (s,interact,el,&root)))
        !           504:                        return FALSE;
        !           505:        } else {
        !           506:                if ( ! (matches = intSearch (base,s,interact,el,&root)))
        !           507:                        return FALSE;
        !           508:        }
        !           509: 
        !           510:        for (x = root; x != NULLDNS; x = x->dns_next) {
        !           511:                if (purportedMatch (x->dns_dn, c-1, v,interact,el,&new)) {
        !           512:                        if (new != NULLDNS)
        !           513:                                *result = DNS_append (*result,new);
        !           514:                } else
        !           515:                        return FALSE;
        !           516:        }
        !           517: 
        !           518:        return matches;
        !           519: }
        !           520: 
        !           521: static envMatch (c,v,el,interact,result)
        !           522: int c;
        !           523: char ** v;
        !           524: DNS el;
        !           525: DNS (* interact) ();
        !           526: DNS * result;
        !           527: {
        !           528: int res;
        !           529: 
        !           530:        if (el == NULLDNS)
        !           531:                return TRUE;
        !           532: 
        !           533:        if ( ! ( res = purportedMatch(el->dns_dn,c,v,interact,el,result)))
        !           534:                return FALSE;
        !           535:        if (*result != NULLDNS) 
        !           536:                return res;
        !           537:        if (res == TRUE)
        !           538:                return TRUE;            
        !           539: 
        !           540:        return envMatch(c,v,el->dns_next,interact,result);
        !           541: 
        !           542: }
        !           543: 
        !           544: static friendlyMatch_aux (c,v,el,interact,result)
        !           545: int c;
        !           546: char ** v;
        !           547: envlist el;
        !           548: DNS (* interact) ();
        !           549: DNS * result;
        !           550: {
        !           551:        if (el == NULLEL)
        !           552:                return TRUE;
        !           553: 
        !           554:        if ( ( c <= el->Upper) && (c >= el->Lower) ) 
        !           555:                return envMatch (c,v,el->Dns,interact,result);
        !           556: 
        !           557:        return (friendlyMatch_aux (c,v,el->Next,interact,result));
        !           558: 
        !           559: }
        !           560: 
        !           561: envlist read_envlist()
        !           562: {
        !           563: char * home, *p, *ptr;
        !           564: char ufnrc [LINESIZE];
        !           565: char * def;
        !           566: char buffer [LINESIZE];
        !           567: envlist env, top = NULLEL, trail = NULLEL;
        !           568: DNS dtail = NULLDNS;
        !           569: FILE * file;
        !           570: DN dn;
        !           571: int i = 0;
        !           572: extern char * TidyString ();
        !           573: 
        !           574:        if (home = getenv ("UFNRC"))
        !           575:                (void) strcpy (ufnrc, home);
        !           576:        else 
        !           577:                if (home = getenv ("HOME"))
        !           578:                        (void) sprintf (ufnrc, "%s/.ufnrc", home);
        !           579:                else
        !           580:                        (void) strcpy (ufnrc, "./.ufnrc");
        !           581: 
        !           582:        if ((file = fopen (ufnrc,"r")) == 0) {
        !           583:                def = isodefile("ufnrc",0);
        !           584:                if ((file = fopen(def,"r")) == 0) {
        !           585:                        (void) sprintf (PY_pepy,"Can't open '%s' or '%s'",ufnrc,def);
        !           586:                        return NULLEL;
        !           587:                }
        !           588:        }
        !           589: 
        !           590:        while (fgets (buffer, LINESIZE, file) != 0) {
        !           591:                i++;
        !           592:                p = buffer;
        !           593:                if (( *p == '#') || (*p == '\0') || (*p == '\n'))
        !           594:                        continue;       /* ignore comments and blanks */
        !           595: 
        !           596:                if (isspace (*p)) {
        !           597:                        /* part of current environment */
        !           598:                        if (!dtail) {
        !           599:                                (void) sprintf (PY_pepy, "Unexpected blank at start of line %d",i);
        !           600:                                (void) fclose (file);
        !           601:                                return NULLEL;
        !           602:                        }
        !           603:                        p = TidyString(p);
        !           604:                        if (*p == '-')
        !           605:                                dn = NULLDN;
        !           606:                        else if ((dn = str2dn (p)) == NULLDN) {
        !           607:                                (void) sprintf (PY_pepy, "Bad DN in environment file line %d",i);
        !           608:                                (void) fclose (file);
        !           609:                                return NULLEL;
        !           610:                        }
        !           611:                        dtail->dns_next = dn_seq_alloc();
        !           612:                        dtail = dtail->dns_next;
        !           613:                        dtail->dns_next = NULLDNS;
        !           614:                        dtail->dns_dn   = dn;
        !           615:                        continue;
        !           616:                }
        !           617: 
        !           618:                p = TidyString (p);
        !           619: 
        !           620:                if ((ptr = index (p,':')) == NULLCP) {
        !           621:                        (void) sprintf (PY_pepy, "':' missing in environment file line %d",i);
        !           622:                        (void) fclose (file);
        !           623:                        return NULLEL;
        !           624:                }
        !           625: 
        !           626:                *ptr++ = 0;
        !           627:                ptr = SkipSpace (ptr);
        !           628: 
        !           629:                if (*ptr == '-')
        !           630:                        dn = NULLDN;
        !           631:                else if ((dn = str2dn (ptr)) == NULLDN) {
        !           632:                        (void) sprintf (PY_pepy, "Bad DN in environment file line %d",i);
        !           633:                        (void) fclose (file);
        !           634:                        return NULLEL;
        !           635:                }
        !           636: 
        !           637:                env = (envlist) smalloc (sizeof (*env));
        !           638:                dtail = env->Dns = dn_seq_alloc();
        !           639:                dtail->dns_next = NULLDNS;
        !           640:                dtail->dns_dn   = dn;
        !           641:                env->Next = NULLEL;
        !           642:                if (top == NULLEL)
        !           643:                        top = env;
        !           644:                else 
        !           645:                        trail->Next = env;
        !           646:                trail = env;
        !           647: 
        !           648:                if ((ptr = index (p,',')) != NULLCP) {
        !           649:                        *ptr++ = 0;
        !           650:                        ptr = SkipSpace(ptr);
        !           651:                        if (*ptr == '+')
        !           652:                                env->Upper = 32767;     /* ~= infinity */
        !           653:                        else 
        !           654:                                env->Upper = atoi (ptr);        /* how to test error ? */
        !           655:                } else
        !           656:                        env->Upper = 0;
        !           657:                
        !           658:                p = SkipSpace(p);
        !           659: 
        !           660:                env->Lower = atoi (p);          /* how to test error ? */
        !           661: 
        !           662:                if ( ! env->Upper)
        !           663:                        env->Upper = env->Lower;
        !           664: 
        !           665:        }
        !           666: 
        !           667:        (void) fclose (file);
        !           668: 
        !           669:        return top;
        !           670: }
        !           671: 
        !           672: 
        !           673: ufn_match (c,v,interact,result,el)
        !           674: int c;
        !           675: char ** v;
        !           676: DNS (* interact) ();
        !           677: DNS * result;
        !           678: envlist el;
        !           679: {
        !           680: static int inited = FALSE;
        !           681: 
        !           682:        if ( (!ufnas) && !(inited = ufn_init()))
        !           683:                return inited;
        !           684:        
        !           685:        PY_pepy[0] = NULL;
        !           686:        if (el == NULLEL) {
        !           687:                if ((el = read_envlist ()) == NULLEL) {
        !           688:                        (void) sprintf (PY_pepy,"Can't read environment");
        !           689:                        return 0;
        !           690:                }
        !           691:        }
        !           692: 
        !           693:        return (friendlyMatch_aux (c,v,el,interact,result));
        !           694: }
        !           695: 
        !           696: ufn_init ()
        !           697: {
        !           698: Attr_Sequence as;
        !           699: int result = TRUE;
        !           700: 
        !           701:        if (ufnas)
        !           702:            return result;
        !           703: 
        !           704:        if ((at_ObjectClass = AttrT_new ("ObjectClass")) == NULLAttrT) {
        !           705:                result = FALSE;
        !           706:                LLOG (log_dsap,LLOG_EXCEPTIONS,("ObjectClass attribute unknown"));
        !           707:        }
        !           708: 
        !           709:        if ((at_OrgUnit = AttrT_new ("ou")) == NULLAttrT) {
        !           710:                result = FALSE;
        !           711:                LLOG (log_dsap,LLOG_EXCEPTIONS,("ou attribute unknown"));
        !           712:        }
        !           713:        if ((at_Organisation = AttrT_new ("o")) == NULLAttrT) {
        !           714:                result = FALSE;
        !           715:                LLOG (log_dsap,LLOG_EXCEPTIONS,("o attribute unknown"));
        !           716:        }
        !           717:        if ((at_Locality = AttrT_new ("l")) == NULLAttrT) {
        !           718:                result = FALSE;
        !           719:                LLOG (log_dsap,LLOG_EXCEPTIONS,("l attribute unknown"));
        !           720:        }
        !           721:        if ((at_CountryName = AttrT_new ("c")) == NULLAttrT) {
        !           722:                result = FALSE;
        !           723:                LLOG (log_dsap,LLOG_EXCEPTIONS,("c attribute unknown"));
        !           724:        }
        !           725:        if ((at_FriendlyCountryName = AttrT_new ("FriendlyCountryName")) == NULLAttrT) {
        !           726:                result = FALSE;
        !           727:                LLOG (log_dsap,LLOG_EXCEPTIONS,("FriendlyCountryName attribute unknown"));
        !           728:        }
        !           729:        if ((at_CommonName = AttrT_new (CN_OID)) == NULLAttrT) {
        !           730:                result = FALSE;
        !           731:                LLOG (log_dsap,LLOG_EXCEPTIONS,("cn attribute unknown"));
        !           732:        }
        !           733:        if ((at_Surname = AttrT_new ("sn")) == NULLAttrT) {
        !           734:                result = FALSE;
        !           735:                LLOG (log_dsap,LLOG_EXCEPTIONS,("sn attribute unknown"));
        !           736:        }
        !           737:        if ((at_Userid = AttrT_new ("uid")) == NULLAttrT) {
        !           738:                result = FALSE;
        !           739:                LLOG (log_dsap,LLOG_EXCEPTIONS,("uid attribute unknown"));
        !           740:        }
        !           741: 
        !           742:        ufnas = as_comp_new (at_OrgUnit,NULLAV,NULLACL_INFO);
        !           743:        as = as_comp_new (at_Organisation,NULLAV,NULLACL_INFO);
        !           744:        ufnas = as_merge (ufnas,as);
        !           745:        as = as_comp_new (at_Locality,NULLAV,NULLACL_INFO);
        !           746:        ufnas = as_merge (ufnas,as);
        !           747:        as = as_comp_new (at_CountryName,NULLAV,NULLACL_INFO);
        !           748:        ufnas = as_merge (ufnas,as);
        !           749:        as = as_comp_new (at_FriendlyCountryName,NULLAV,NULLACL_INFO);
        !           750:        ufnas = as_merge (ufnas,as);
        !           751:        as = as_comp_new (at_CommonName,NULLAV,NULLACL_INFO);
        !           752:        ufnas = as_merge (ufnas,as);
        !           753:        as = as_comp_new (at_Surname,NULLAV,NULLACL_INFO);
        !           754:        ufnas = as_merge (ufnas,as);
        !           755:        as = as_comp_new (at_Userid,NULLAV,NULLACL_INFO);
        !           756:        ufnas = as_merge (ufnas,as);
        !           757: 
        !           758:        return result;
        !           759: }
        !           760: 
        !           761: #ifdef DEBUG
        !           762: 
        !           763: static print_search (dn, subtree, fi)
        !           764: DN     dn;
        !           765: char   subtree;
        !           766: Filter fi;
        !           767: {
        !           768: static PS      nps = NULLPS;
        !           769: 
        !           770:     if (nps == NULLPS) {
        !           771:        if ((nps = ps_alloc (std_open)) == NULL) {
        !           772:            (void) fprintf (stderr, "ps_alloc(std_open): you lose\n");
        !           773:            return;
        !           774:        }
        !           775:        if (std_setup (nps, stdout) == NOTOK) {
        !           776:            (void) fprintf (stderr, "std_setup(stdout): you lose\n");
        !           777:            ps_free (nps);
        !           778:            nps = NULL;
        !           779:            return;
        !           780:        }
        !           781:     }
        !           782:     
        !           783:     ps_printf (nps, "search starting at @");
        !           784:     dn_print (nps, dn, EDBOUT);
        !           785:     ps_printf (nps, "(%s) for ", subtree ? "subtree" : "singlelevel");
        !           786: 
        !           787:     print_filter (nps, fi, 0);
        !           788: 
        !           789:     ps_print (nps, "\n\n");
        !           790:     (void) ps_flush (nps);
        !           791: }
        !           792: #endif

unix.superglobalmegacorp.com

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