|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 4177 (0x1051)
Types: TextFile
Names: »ds_compare.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/quipu/ds_compare.c«
/* ds_compare.c - */
#ifndef lint
static char *rcsid = "$Header: /f/osi/quipu/RCS/ds_compare.c,v 6.0 89/03/18 23:41:16 mrose Rel $";
#endif
/*
* $Header: /f/osi/quipu/RCS/ds_compare.c,v 6.0 89/03/18 23:41:16 mrose Rel $
*
*
* $Log: ds_compare.c,v $
* Revision 6.0 89/03/18 23:41:16 mrose
* Release 5.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/util.h"
#include "quipu/entry.h"
#include "quipu/compare.h"
extern LLog * log_dsap;
#ifndef NO_STATS
extern LLog * log_stat;
extern int dn_print ();
#endif
do_ds_compare (arg, error, result, binddn, target)
struct ds_compare_arg *arg;
struct ds_compare_result *result;
struct DSError *error;
DN binddn;
DN target;
{
register Entry entryptr;
register Attr_Sequence as;
struct acl_info * acl;
register int i;
DLOG (log_dsap,LLOG_TRACE,("ds_compare"));
if (target == NULLDN)
target = arg->cma_object;
#ifndef NO_STATS
dn_decode (target);
pslog (log_stat,LLOG_NOTICE,"compare",dn_print,(caddr_t)target);
#endif
if ((entryptr = find_entry (target,&arg->cma_common,error,binddn)) != NULLENTRY) {
if (entryptr->e_parent == NULLENTRY) {
error->dse_type = DSE_NAMEERROR;
error->ERR_NAME.DSE_na_problem = DSE_NA_NOSUCHOBJECT;
error->ERR_NAME.DSE_na_matched = NULLDN;
return (DS_ERROR_REMOTE);
}
ava_decode (&arg->cma_purported);
if (arg->cma_purported.ava_type->at_table == NULLTABLE_ATTR)
return (invalid_matching (arg->cma_purported.ava_type,error));
switch (arg->cma_purported.ava_type->at_table->oa_syntax) {
case AV_ACL:
case AV_SCHEMA:
case AV_UPDATE:
return (invalid_matching (arg->cma_purported.ava_type,error));
}
if ((as = as_find_type (entryptr->e_attributes, arg->cma_purported.ava_type)) == NULLATTR) {
error->dse_type = DSE_ATTRIBUTEERROR;
error->ERR_ATTRIBUTE.DSE_at_name = get_copy_dn(entryptr);
error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what = DSE_AT_NOSUCHATTRIBUTE;
error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = AttrT_cpy(arg->cma_purported.ava_type);
error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_value = NULLAttrV;
error->ERR_ATTRIBUTE.DSE_at_plist.dse_at_next = DSE_AT_NOPROBLEM;
return (DS_ERROR_REMOTE);
}
acl = as->attr_acl;
if (check_acl (binddn,ACL_COMPARE, acl,target) == NOTOK) {
error->dse_type = DSE_SECURITYERROR;
error->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS;
return (DS_ERROR_REMOTE);
}
result->cmr_iscopy = FALSE;
result->cmr_common.cr_requestor = NULLDN;
/* if no error and NOT SVC_OPT_DONTDEREFERENCEALIASES then */
/* the alias will have been derefeferenced -signified by */
/* NO_ERROR !!! */
if (error->dse_type == DSE_NOERROR) {
result->cmr_common.cr_aliasdereferenced = FALSE;
result->cmr_object = NULLDN;
} else {
result->cmr_common.cr_aliasdereferenced = TRUE;
result->cmr_object = get_copy_dn (entryptr);
}
i = AttrV_cmp (as->attr_value->avseq_av, arg->cma_purported.ava_value,error);
switch (i) {
case 0 :
result->cmr_matched= TRUE;
return (DS_OK);
case 1:
case -1:
result->cmr_matched= FALSE;
return (DS_OK);
default:
error->ERR_ATTRIBUTE.DSE_at_name = get_copy_dn (entryptr);
error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = AttrT_cpy(as->attr_type);
return (NOTOK);
}
} else if (error->dse_type == DSE_REFERRAL)
return (DS_ERROR_CONNECT);
return (DS_ERROR_REMOTE);
}
invalid_matching (at,error)
AttributeType at;
struct DSError *error;
{
error->dse_type = DSE_ATTRIBUTEERROR;
error->ERR_ATTRIBUTE.DSE_at_name = NULLDN;
error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what = DSE_AT_INAPPROPRIATEMATCHING;
error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = AttrT_cpy (at);
error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_value = NULLAttrV;
error->ERR_ATTRIBUTE.DSE_at_plist.dse_at_next = DSE_AT_NOPROBLEM;
return (DS_ERROR_REMOTE);
}