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 + -
显示快捷键?