ufn_parse.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 907 行 · 第 1/2 页
C
907 行
/* ufn_parse.c - user-friendly name resolution */#ifndef lintstatic char *rcsid = "$Header: /xtel/isode/isode/dsap/common/RCS/ufn_parse.c,v 9.0 1992/06/16 12:12:39 isode Rel $";#endif/* * $Header: /xtel/isode/isode/dsap/common/RCS/ufn_parse.c,v 9.0 1992/06/16 12:12:39 isode Rel $ * * * $Log: ufn_parse.c,v $ * Revision 9.0 1992/06/16 12:12:39 isode * Release 8.0 * *//* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */#include "quipu/ufn.h"#include "tailor.h"#include "quipu/list.h"#include "quipu/ds_search.h"#include "quipu/connection.h" /* ds_search uses di_block - include this for lint !!! */#include "quipu/dua.h"char ufn_notify = FALSE;int ufn_flags = UFN_ALL;extern char PY_pepy[];#define NOTIFY(x) if (ufn_notify) (void) printf x, (void) putchar('\n'); else ;AttributeType at_OrgUnit;AttributeType at_Organisation;AttributeType at_Locality;AttributeType at_CountryName;AttributeType at_FriendlyCountryName;AttributeType at_CommonName;AttributeType at_Surname;AttributeType at_Userid;AttributeType at_ObjectClass;Attr_Sequence ufnas = NULL;extern LLog * log_dsap;extern Filter strfilter ();extern Filter ocfilter ();extern Filter joinfilter ();extern struct dn_seq *dn_seq_push ();char ufn_abort = FALSE; /* external to force UFN to abort */#ifdef DEBUGstatic print_search ();#endif DNS DNS_append (a,b)DNS a, b;{ DNS c; if (a == NULLDNS) return b; for (c=a; c->dns_next != NULLDNS; c=c->dns_next) ; /* Nothing */ c->dns_next = b; return a;}static Attr_Sequence read_cache (base)DN base;{Entry ptr; if ((ptr = local_find_entry (base,FALSE)) != NULLENTRY) return (ptr->e_attributes); return NULLATTR;}static char exact_match (dn,s) DN dn;char * s;{RDN rdn; for (; dn->dn_parent != NULLDN; dn=dn->dn_parent) ; /* Nothing */ for (rdn = dn->dn_rdn; rdn != NULLRDN; rdn=rdn->rdn_next) { if (sub_string (rdn->rdn_av.av_syntax) && (lexequ((char *)rdn->rdn_av.av_struct,s) == 0)) return TRUE; } return FALSE;}static char good_match (dn,s) DN dn;char * s;{Attr_Sequence as;AV_Sequence avs; for (as = read_cache(dn); as != NULLATTR; as=as->attr_link) for (avs=as->attr_value; avs!= NULLAV; avs=avs->avseq_next) if (sub_string (avs->avseq_av.av_syntax) && (lexequ((char *)avs->avseq_av.av_struct,s) == 0)) return TRUE; return FALSE;}dnSelect (s,dlist,interact,el)char * s;DNS *dlist;DNS (* interact) ();DNS el;{DNS exact = NULLDNS;DNS good = NULLDNS;DNS bad = NULLDNS;DNS tmp, next = NULLDNS; if ((dlist == (DNS *)NULL) || (*dlist == NULLDNS)) return 2; for (tmp= *dlist; tmp != NULLDNS; tmp=next) { next = tmp->dns_next; if (exact_match(tmp->dns_dn,s)) { tmp->dns_next = exact; exact = tmp; } else if (good_match(tmp->dns_dn,s)) { tmp->dns_next = good; good = tmp; } else { tmp->dns_next = bad; bad = tmp; } } if (exact) { NOTIFY (("Found exact match(es) for '%s'",s)); *dlist = exact; dn_seq_free (good); dn_seq_free (bad); return TRUE; } if (good) { NOTIFY (("Found good match(es) for '%s'",s)); *dlist = good; dn_seq_free (bad); return TRUE; } good = (*interact)(bad,el->dns_dn,s); *dlist = good; if (good != NULLDNS) return TRUE; else return 2; /* back track allowed ! */}DN ufn_bad_dsa = NULLDN;DNS ufn_partials = NULLDNS;static char present (d,t)DN d;AttributeType t;{RDN rdn;DN p, q; if (!d) return FALSE; for (p = d; p -> dn_parent; p = p -> dn_parent) continue; for (;;) { for (rdn = p -> dn_rdn; rdn; rdn = rdn -> rdn_next) if (AttrT_cmp (rdn->rdn_at,t) == 0) return TRUE; if (p == d) return FALSE; /* more work ... */ for (q = d; p != q -> dn_parent; q = q -> dn_parent) continue; p = q; }}ufn_search (base, subtree, filt, res, s, interact, el)DN base;char subtree;Filter filt;DNS * res;char * s;DNS (* interact) ();DNS el;{struct ds_search_arg search_arg;static struct ds_search_result result;struct DSError err;static CommonArgs ca = default_common_args;EntryInfo * ptr;DNS newdns, r = NULLDNS; if (ufn_abort) { (*res) = NULLDNS; return FALSE; } search_arg.sra_baseobject = base; search_arg.sra_filter = filt; if (subtree) search_arg.sra_subset = SRA_WHOLESUBTREE; else search_arg.sra_subset = SRA_ONELEVEL; search_arg.sra_searchaliases = TRUE; search_arg.sra_common = ca; /* struct copy */ search_arg.sra_eis.eis_infotypes = TRUE; search_arg.sra_eis.eis_allattributes = FALSE; search_arg.sra_eis.eis_select = ufnas;#ifdef DEBUG if (ufn_notify == 2) print_search (base, subtree, filt);#endif if (ds_search (&search_arg, &err, &result) != DS_OK) { log_ds_error (&err); NOTIFY (("DAP Search returned an error")) if (!ufn_bad_dsa) { switch (err.dse_type) { case DSE_REFERRAL: if (err.ERR_REFERRAL.DSE_ref_candidates && err.ERR_REFERRAL.DSE_ref_candidates -> cr_reftype != RT_NONSPECIFICSUBORDINATE) goto set_bad_dsa; break; case DSE_DSAREFERRAL: if (err.ERR_REFERRAL.DSE_ref_candidates) {set_bad_dsa: ; ufn_bad_dsa = dn_cpy (err.ERR_REFERRAL.DSE_ref_candidates -> cr_accesspoints -> ap_name); } break; default: break; } } ds_error_free (&err); filter_free (filt); return FALSE; } filter_free (filt); correlate_search_results (&result); dn_free (result.CSR_object); if ( (result.CSR_limitproblem != LSR_NOLIMITPROBLEM) || (result.CSR_cr != NULLCONTINUATIONREF)) { if (!ufn_bad_dsa && result.CSR_cr) ufn_bad_dsa = dn_cpy (result.CSR_cr -> cr_accesspoints -> ap_name); crefs_free (result.CSR_cr); if ( ! result.CSR_entries) { NOTIFY (("Search returned partial results")) return FALSE; } NOTIFY (("Continuing with partial results !")); } if (!result.CSR_entries && check_dnseq (ufn_partials, base) == NOTOK && present (base, at_Organisation)) ufn_partials = dn_seq_push (base, ufn_partials); for (ptr = result.CSR_entries; ptr != NULLENTRYINFO; ptr=ptr->ent_next) { cache_entry (ptr, search_arg.sra_eis.eis_allattributes, search_arg.sra_eis.eis_infotypes); newdns = dn_seq_alloc(); newdns->dns_next = r; newdns->dns_dn = dn_cpy (ptr->ent_dn); r = newdns; } entryinfo_free (result.CSR_entries,0); *res = r; return dnSelect (s,res,interact,el);}#define SUBSTRINGS() ((ufn_flags & UFN_WILDHEAD) ? FILTERITEM_SUBSTRINGS \ : -FILTERITEM_SUBSTRINGS)static rootSearch (s,interact,el,result)char * s;DNS (* interact) ();DNS el;DNS * result;{ Filter filt, filta, filtb, filtc, filtd, filte, filtf; if (check_3166 (s)) { if ((filta = strfilter (at_CountryName,s,FILTERITEM_EQUALITY)) == NULLFILTER) return 0; if ((filtb = strfilter (at_FriendlyCountryName,s,FILTERITEM_EQUALITY)) == NULLFILTER) return 0; filtb -> flt_next = filta; if ((filtc = strfilter (at_Organisation,s,FILTERITEM_EQUALITY)) == NULLFILTER) return 0; filtc -> flt_next = filtb; filt = joinfilter (filtc, FILTER_OR); } else { if ((filta = strfilter (at_FriendlyCountryName,s,SUBSTRINGS ())) == NULLFILTER) return 0; if ((filtc = strfilter (at_Organisation,s,SUBSTRINGS ())) == NULLFILTER) return 0; filtc -> flt_next = filta; if ((filte = strfilter (at_Locality,s,SUBSTRINGS ())) == NULLFILTER) return 0; filte -> flt_next = filtc; if ((ufn_flags & UFN_APPROX) && !index (s, '*')) { if ((filtb = strfilter (at_FriendlyCountryName,s,FILTERITEM_APPROX)) == NULLFILTER) return 0; filtb -> flt_next = filte; if ((filtd = strfilter (at_Organisation,s,FILTERITEM_APPROX)) == NULLFILTER) return 0; filtd -> flt_next = filtb; if ((filtf = strfilter (at_Locality,s,FILTERITEM_APPROX)) == NULLFILTER) return 0; filtf -> flt_next = filtd; filt = joinfilter (filtf, FILTER_OR); } else filt = joinfilter (filte, FILTER_OR); } return ufn_search (NULLDN,FALSE,filt,result,s,interact,el);}static intSearch (base,s,interact,el,result)DN base;char * s;DNS (* interact) ();DNS el;DNS * result;{Filter filt, filta, filtb, filtc, filtd, filte, filtf, filtg, filth; if ( present (base,at_OrgUnit) ) { if ((filte = ocfilter ("OrganizationalUnit")) == NULLFILTER) return FALSE; if ((filta = strfilter (at_OrgUnit,s,SUBSTRINGS ())) == NULLFILTER) return 0; if ((ufn_flags & UFN_APPROX) && !index (s, '*')) { if ((filtb = strfilter (at_OrgUnit,s,FILTERITEM_APPROX)) == NULLFILTER) return 0; filtb->flt_next = filta; filt = joinfilter (filtb, FILTER_OR); } else filt = filta; filte->flt_next = filt; filtf = joinfilter (filte, FILTER_AND); } else if ( present (base,at_Organisation) ) { if ((filte = ocfilter ("OrganizationalUnit")) == NULLFILTER) return FALSE; if ((filth = ocfilter ("Locality")) == NULLFILTER) { filter_free (filte); return FALSE; } filth->flt_next = filte; filtg = joinfilter (filth, FILTER_OR); if ((filta = strfilter (at_OrgUnit,s,SUBSTRINGS ())) == NULLFILTER) return 0; if ((filtc = strfilter (at_Locality,s,SUBSTRINGS ())) == NULLFILTER) return 0; filtc -> flt_next = filta; if ((ufn_flags & UFN_APPROX) && !index (s, '*')) { if ((filtb = strfilter (at_OrgUnit,s,FILTERITEM_APPROX)) == NULLFILTER) return 0; filtb -> flt_next = filtc; if ((filtd = strfilter (at_Locality,s,FILTERITEM_APPROX)) == NULLFILTER) return 0; filtd -> flt_next = filtb; filt = joinfilter (filtd, FILTER_OR); } else filt = joinfilter (filtc, FILTER_OR); filtg->flt_next = filt; filtf = joinfilter (filtg, FILTER_AND); } else if ( present (base,at_Locality) ) { if ((filte = ocfilter ("Organization")) == NULLFILTER) return FALSE; if ((filta = strfilter (at_Organisation,s,SUBSTRINGS ())) == NULLFILTER) return 0; if ((ufn_flags & UFN_APPROX) && !index (s, '*')) { if ((filtb = strfilter (at_Organisation,s,FILTERITEM_APPROX)) == NULLFILTER) return 0; filtb->flt_next = filta; filt = joinfilter (filtb, FILTER_OR); } else filt = filta; filte->flt_next = filt; filtf = joinfilter (filte, FILTER_AND); } else { if ((filte = ocfilter ("Organization")) == NULLFILTER) return FALSE; if ((filth = ocfilter ("Locality")) == NULLFILTER) { filter_free (filte); return FALSE; } filth -> flt_next = filte; filtg = joinfilter (filth, FILTER_OR); if ((filta = strfilter (at_Organisation,s,SUBSTRINGS ())) == NULLFILTER) return 0; if ((filtc = strfilter (at_Locality,s,SUBSTRINGS ())) == NULLFILTER) return 0; filtc -> flt_next = filta; if ((ufn_flags & UFN_APPROX) && !index (s, '*')) { if ((filtb = strfilter (at_Organisation,s,FILTERITEM_APPROX)) == NULLFILTER) return 0; filtb -> flt_next = filtc; if ((filtd = strfilter (at_Locality,s,FILTERITEM_APPROX)) == NULLFILTER)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?