ou.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 386 行

C
386
字号
/* ou.c - search for an org unit */#ifndef	lintstatic char *rcsid = "$Header: /xtel/isode/isode/others/quipu/uips/de/RCS/ou.c,v 9.0 1992/06/16 12:45:59 isode Rel $";#endif/*  * $Header: /xtel/isode/isode/others/quipu/uips/de/RCS/ou.c,v 9.0 1992/06/16 12:45:59 isode Rel $ * * * $Log: ou.c,v $ * Revision 9.0  1992/06/16  12:45:59  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 <signal.h>#include "quipu/util.h"#include "quipu/ds_search.h"#include "quipu/dua.h"#include "demanifest.h"#include "namelist.h"#include "filter.h"#include "destrings.h"extern struct ds_search_arg sarg;extern struct ds_search_result sresult;extern struct DSError serror;extern int abandoned;extern int highNumber;extern int exactMatch;extern char exactString[];struct namelist * ouatts;struct ds_search_arg *fillMostOUSearchArgs();void makeExplicitOUFilter();void ouFilter1(), ouFilter2(), ouFilter3(), ouFilter4();VFP explicitOU[] = {makeExplicitOUFilter, NULLVFP};VFP normalOU[] = {ouFilter1, ouFilter2, ouFilter3, ouFilter4, NULLVFP};intlistOUs(parentstr, thisstr, listp)char * parentstr, * thisstr;struct namelist ** listp;{	clearProblemFlags();	initAlarm();	if (exactMatch == ORGUNIT)	  return (listExactOUs(exactString, listp));        if (strcmp(thisstr, "*") == 0)          return (listAllOUs(parentstr, listp));        else          return (listMatchingOUs(parentstr, thisstr, listp));}voidprintListOUs(str, listp)char * str;struct namelist * listp;{struct namelist * x;int i;	if (listp == NULLLIST)		if (strcmp(str, "*") == 0)			pageprint("    No organisational units found\n");		else			pageprint("    No organisational units match entered string\n");	else	{		for (i =1, x = listp; x != NULLLIST; i++, x = x->next)			printLastComponent(INDENTON, x->name, ORGUNIT, i);		showAnyProblems(str);	}}voidfreeOUs(listpp)struct namelist ** listpp;{struct namelist * x, * y;	x = *listpp;	while (x != NULLLIST)	{		if (x->name != NULLCP)			free(x->name);		as_free(x->ats);		y = x->next;		free((char *)x);		x = y;	}	*listpp = NULLLIST;}voidfreeOUSearchArgs(){	dn_free(sarg.sra_baseobject);	as_free(sarg.sra_eis.eis_select);}intlistAllOUs(parentstr, listp)char * parentstr;struct namelist ** listp;{int ret;	        sarg = * fillMostOUSearchArgs(parentstr, SRA_ONELEVEL);        makeAllOUFilter(&sarg.sra_filter);        ret = makeListOUs(listp);        if (ret != OK)		logListSuccess(LIST_ERROR, "ou", 0);        else		logListSuccess(LIST_OK, "ou", listlen(*listp));	freeOUSearchArgs();	alarmCleanUp();	return ret;}intlistMatchingOUs(parentstr, thisstr, listp)char * parentstr, * thisstr;struct namelist ** listp;{VFP * filtarray;VFP filterfunc;int filtnumber;        if (index(thisstr, '*') != NULLCP) /* contains at least one asterisk */	{                filtarray = explicitOU;		filtnumber = -1;	}        else	{                filtarray = normalOU;		filtnumber = 0;	}	sarg = * fillMostOUSearchArgs(parentstr, SRA_ONELEVEL);        while ((filterfunc = *filtarray++) != NULLVFP)	{		filtnumber++;                filterfunc(thisstr, &sarg.sra_filter);                if (makeListOUs(listp) != OK)		{			freeOUSearchArgs();			logSearchSuccess(SEARCH_ERROR, "ou", thisstr, filtnumber, 0);			alarmCleanUp();			return NOTOK;		}                if (*listp != NULLLIST)		{			freeOUSearchArgs();			logSearchSuccess(SEARCH_OK, "ou", thisstr, filtnumber, listlen(*listp));			alarmCleanUp();                        return OK;		}	}	logSearchSuccess(SEARCH_FAIL, "ou", thisstr, filtnumber, 0);	/* nothing found by single level searches - let's try subtree searching */        if (index(thisstr, '*') != NULLCP) /* contains at least one asterisk */	{                filtarray = explicitOU;		filtnumber = -1;	}        else	{                filtarray = normalOU;		filtnumber = 0;	}	sarg = * fillMostOUSearchArgs(parentstr, SRA_WHOLESUBTREE);        while ((filterfunc = *filtarray++) != NULLVFP)	{		filtnumber++;                filterfunc(thisstr, &sarg.sra_filter);                if (makeListOUs(listp) != OK)		{			freeOUSearchArgs();			alarmCleanUp();			return NOTOK;		}                if (*listp != NULLLIST)		{			freeOUSearchArgs();			logSearchSuccess(SEARCH_OK, "ou", thisstr, filtnumber, listlen(*listp));			alarmCleanUp();                        return OK;		}	}	logSearchSuccess(SEARCH_FAIL, "ou", thisstr, filtnumber, 0);	freeOUSearchArgs();	alarmCleanUp();	return OK;}intlistExactOUs(objectstr, listp)char * objectstr;struct namelist ** listp;{int ret;        sarg = * fillMostOUSearchArgs(objectstr, SRA_BASEOBJECT);        makeAllOUFilter(&sarg.sra_filter);        ret = makeListOUs(listp);	freeOUSearchArgs();	alarmCleanUp();	return ret;}intmakeListOUs(listp)struct namelist ** listp;{entrystruct * x;int retval;	if (rebind() != OK)		return NOTOK;	retval = ds_search(&sarg, &serror, &sresult);        if ((retval == DSE_INTR_ABANDONED) &&	    (serror.dse_type == DSE_ABANDONED))		abandoned = TRUE;	if (retval != OK)		return NOTOK;	correlate_search_results (&sresult);	setProblemFlags(sresult);	highNumber = 0;	for (x = sresult.CSR_entries; x != NULLENTRYINFO; x = x->ent_next) {		*listp = list_alloc();		(*listp)->name = dn2pstr(x->ent_dn);                (*listp)->ats = as_cpy(x->ent_attr);		listp = &(*listp)->next;		highNumber++;	}	*listp = NULLLIST;	entryinfo_free(sresult.CSR_entries,0);	dn_free (sresult.CSR_object);	crefs_free (sresult.CSR_cr);	filter_free(sarg.sra_filter);	return OK;}struct ds_search_arg *fillMostOUSearchArgs(parentstr, searchdepth)char * parentstr;int searchdepth;{static struct ds_search_arg arg;Attr_Sequence * atl;AttributeType at;struct namelist * x;static CommonArgs sca = default_common_args;	arg.sra_common = sca; /* struct copy */        arg.sra_common.ca_servicecontrol.svc_timelimit = SVC_NOTIMELIMIT;        arg.sra_common.ca_servicecontrol.svc_sizelimit= SVC_NOSIZELIMIT;	arg.sra_subset = searchdepth;	arg.sra_baseobject = str2dn(parentstr);	arg.sra_searchaliases = TRUE;	/* specify attributes of interest */	arg.sra_eis.eis_allattributes = FALSE;	atl = &(arg.sra_eis.eis_select);        for (x = ouatts; x != NULLLIST; x = x->next)        {		if ((at = str2AttrT(x->name)) == NULLAttrT)			continue;                *atl = as_comp_alloc();                (*atl)->attr_type = at;		(*atl)->attr_value = NULLAV;                atl = &(*atl)->attr_link;        }        *atl = NULLATTR;	arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;	return (&arg);}makeAllOUFilter(fpp)struct s_filter ** fpp;{	*fpp = eqfilter(FILTERITEM_EQUALITY, DE_OBJECT_CLASS, DE_ORGANISATIONAL_UNIT);}voidmakeExplicitOUFilter(oustr, fpp)char * oustr;struct s_filter ** fpp;{struct s_filter * fp;int wildcardtype;char * ostr1, * ostr2;	wildcardtype = starstring(oustr, &ostr1, &ostr2);	*fpp = andfilter();	fp = (*fpp)->FUFILT = eqfilter(FILTERITEM_EQUALITY, DE_OBJECT_CLASS, DE_ORGANISATIONAL_UNIT);	switch (wildcardtype) {		case LEADSUBSTR: /* fall through */		case TRAILSUBSTR: /* fall through */		case ANYSUBSTR:			fp = fp->flt_next = subsfilter(wildcardtype, 					DE_ORGANISATIONAL_UNIT_NAME, ostr1);			break;		case LEADANDTRAIL:			fp = fp->flt_next = subsfilter(LEADSUBSTR, 					DE_ORGANISATIONAL_UNIT_NAME, ostr1);			fp = fp->flt_next = subsfilter(TRAILSUBSTR,					DE_ORGANISATIONAL_UNIT_NAME, ostr2);                        break;	}	fp->flt_next = NULLFILTER;}voidouFilter1(oustr, fpp)char * oustr;struct s_filter ** fpp;{struct s_filter * fp;	*fpp = andfilter();	fp = (*fpp)->FUFILT = eqfilter(FILTERITEM_EQUALITY, DE_OBJECT_CLASS, DE_ORGANISATIONAL_UNIT);	fp = fp->flt_next = eqfilter(FILTERITEM_EQUALITY, DE_ORGANISATIONAL_UNIT_NAME, oustr);	fp->flt_next = NULLFILTER;}voidouFilter2(oustr, fpp)char * oustr;struct s_filter ** fpp;{struct s_filter * fp;	*fpp = andfilter();	fp = (*fpp)->FUFILT = eqfilter(FILTERITEM_EQUALITY, DE_OBJECT_CLASS, DE_ORGANISATIONAL_UNIT);	fp = fp->flt_next = subsfilter(LEADSUBSTR, DE_ORGANISATIONAL_UNIT_NAME, oustr);	fp->flt_next = NULLFILTER;}voidouFilter3(oustr, fpp)char * oustr;struct s_filter ** fpp;{struct s_filter * fp;	*fpp = andfilter();	fp = (*fpp)->FUFILT = eqfilter(FILTERITEM_EQUALITY, DE_OBJECT_CLASS, DE_ORGANISATIONAL_UNIT);	fp = fp->flt_next = subsfilter(ANYSUBSTR, DE_ORGANISATIONAL_UNIT_NAME, oustr);	fp->flt_next = NULLFILTER;}voidouFilter4(oustr, fpp)char * oustr;struct s_filter ** fpp;{struct s_filter * fp;	*fpp = andfilter();	fp = (*fpp)->FUFILT = eqfilter(FILTERITEM_EQUALITY, DE_OBJECT_CLASS, DE_ORGANISATIONAL_UNIT);	fp = fp->flt_next = eqfilter(FILTERITEM_APPROX, DE_ORGANISATIONAL_UNIT_NAME, oustr);	fp->flt_next = NULLFILTER;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?