|
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: 4154 (0x103a) Types: TextFile Names: »dsp_cache.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/quipu/dsp_cache.c«
/* dsp_cache.c - */ #ifndef lint static char *rcsid = "$Header: /f/osi/quipu/RCS/dsp_cache.c,v 7.0 89/11/23 22:17:27 mrose Rel $"; #endif /* * $Header: /f/osi/quipu/RCS/dsp_cache.c,v 7.0 89/11/23 22:17:27 mrose Rel $ * * * $Log: dsp_cache.c,v $ * Revision 7.0 89/11/23 22:17:27 mrose * Release 6.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/dua.h" #include "quipu/list.h" #include "quipu/entry.h" #include "quipu/common.h" #include "quipu/dsargument.h" extern time_t time(); extern LLog * log_dsap; extern int local_cache_size; Entry cache_dsp_entry (ptr) EntryInfo *ptr; { /* assumes entry passed is complete */ Entry make_path (); Entry eptr; Attr_Sequence asptr; extern oid_table_attr * tab_acl; struct DSError error; DN dnptr; char aclfound = FALSE; if (dn_decode (ptr->ent_dn) == NOTOK) { LLOG (log_dsap,LLOG_NOTICE,("dn_decode failed in dsp_cache")); return NULLENTRY; } if (as_decode (ptr->ent_attr) == NOTOK) { LLOG (log_dsap,LLOG_NOTICE,("as_decode failed in dsp_cache")); return NULLENTRY; } for (asptr = ptr->ent_attr; asptr != NULLATTR; asptr = asptr->attr_link) { if (asptr->attr_type.at_table == tab_acl) { aclfound = TRUE; break; } } if (!aclfound) { LLOG (log_dsap,LLOG_NOTICE,("No ACL in dsp_cache")); return NULLENTRY; /* don't cache if no acl */ } for (dnptr = ptr->ent_dn; dnptr->dn_parent != NULLDN; dnptr = dnptr->dn_parent) ; if ((eptr = local_find_entry (ptr->ent_dn, FALSE)) != NULLENTRY) { if ((eptr->e_data == E_TYPE_CACHE_FROM_MASTER) || (eptr->e_data == E_TYPE_CONSTRUCTOR)) { as_free (eptr->e_attributes); eptr->e_attributes = as_cpy(ptr->ent_attr); eptr->e_complete = TRUE; eptr->e_data = E_TYPE_CACHE_FROM_MASTER; eptr->e_age = time((time_t *)0); } } else { local_cache_size++; eptr = make_path (ptr->ent_dn); eptr->e_name = rdn_cpy (dnptr->dn_rdn); eptr->e_complete = TRUE; eptr->e_data = E_TYPE_CACHE_FROM_MASTER; eptr->e_attributes = as_cpy(ptr->ent_attr); eptr->e_age = time((time_t *)0); } if (unravel_attribute (eptr,&error,FALSE) == NOTOK) { /* Keep name, but throw away attributes */ local_cache_size--; eptr->e_data = E_TYPE_CONSTRUCTOR; eptr->e_complete = FALSE; as_free (eptr->e_attributes); eptr->e_attributes = NULLATTR; log_ds_error (&error); ds_error_free (&error); return NULLENTRY; } return (eptr); } dsp_cache (arg,res,ctx,binddn) struct DSArgument *arg; struct DSResult *res; char ctx; DN binddn; { EntryInfo *ptr; Entry entryptr; Attr_Sequence eis_select (); switch(arg->arg_type) { case OP_READ: if (((entryptr = cache_dsp_entry (&res->res_rd.rdr_entry)) != NULLENTRY) && ctx == CN_CTX_X500_DAP) { /* remove acl if DAP user not allowed it */ as_free (res->res_rd.rdr_entry.ent_attr); res->res_rd.rdr_entry.ent_attr = eis_select (arg->arg_rd.rda_eis,entryptr,binddn,FALSE); } break; case OP_SEARCH: if ((arg->arg_sr.sra_eis.eis_allattributes == TRUE) && (arg->arg_sr.sra_eis.eis_infotypes == EIS_ATTRIBUTESANDVALUES)) { for (ptr = res->res_sr.CSR_entries; ptr != NULLENTRYINFO; ptr = ptr->ent_next) (void) cache_dsp_entry (ptr); } break; case OP_LIST: if (ctx == CN_CTX_QUIPU_DSP) cache_list (res->res_ls.lsr_subordinates, res->res_ls.lsr_limitproblem, arg->arg_ls.lsa_object, arg->arg_ls.lsa_common.ca_servicecontrol.svc_sizelimit); break; /* the following change an entry - the easiest thing is to deleted the cached entry and start again */ case OP_ADDENTRY: delete_cache (arg->arg_ad.ada_object); break; case OP_REMOVEENTRY: delete_cache (arg->arg_rm.rma_object); break; case OP_MODIFYENTRY: delete_cache (arg->arg_me.mea_object); break; case OP_MODIFYRDN: delete_cache (arg->arg_mr.mra_object); break; default: break; } }