|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.