|
|
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: 3094 (0xc16)
Types: TextFile
Names: »ds_remove.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/quipu/ds_remove.c«
/* ds_remove.c - */
#ifndef lint
static char *rcsid = "$Header: /f/osi/quipu/RCS/ds_remove.c,v 6.0 89/03/18 23:41:23 mrose Rel $";
#endif
/*
* $Header: /f/osi/quipu/RCS/ds_remove.c,v 6.0 89/03/18 23:41:23 mrose Rel $
*
*
* $Log: ds_remove.c,v $
* Revision 6.0 89/03/18 23:41:23 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/remove.h"
extern LLog * log_dsap;
#ifndef NO_STATS
extern LLog * log_stat;
extern int dn_print ();
#endif
do_ds_removeentry (arg, error, binddn, target)
struct ds_removeentry_arg *arg;
struct DSError *error;
DN binddn;
DN target;
{
Entry entryptr;
Entry parent;
char * new_version ();
DLOG (log_dsap,LLOG_TRACE,("ds remove entry"));
if (target == NULLDN)
target = arg->rma_object;
#ifndef NO_STATS
dn_decode (target);
pslog (log_stat,LLOG_NOTICE,"remove",dn_print,(caddr_t)target);
#endif
if ((entryptr = find_master_entry (target,&arg->rma_common,error,binddn)) != NULLENTRY) {
/* entry found, so remove it */
if ((entryptr->e_parent != NULL) && (entryptr->e_parent->e_lock)) {
error->dse_type = DSE_SERVICEERROR;
error->ERR_SERVICE.DSE_sv_problem = DSE_SV_UNAVAILABLE;
return (DS_ERROR_REMOTE);
}
if ( ! (entryptr->e_leaf)) {
error->dse_type = DSE_UPDATEERROR;
error->ERR_UPDATE.DSE_up_problem = DSE_UP_NOTONNONLEAF;
return (DS_ERROR_REMOTE);
}
/* we can assume entryptr will be the first sibling */
if ((parent = 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);
}
if (check_acl (binddn, ACL_WRITE, parent->e_acl->ac_child, target) == NOTOK) {
error->dse_type = DSE_SECURITYERROR;
error->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS;
return (DS_ERROR_REMOTE);
}
if (entryptr->e_sibling == NULLENTRY) {
/* This is a complex situation.
We have been asked to remove the last node at one level,
This means the parent has become a leaf. The parent however may be
held in another DSA - which will need updating.
Also the edbinfo attribute will need modifing.
Leave till later...
*/
error->dse_type = DSE_UPDATEERROR;
error->ERR_UPDATE.DSE_up_problem = DSE_UP_AFFECTSMULTIPLEDSAS;
return (DS_ERROR_REMOTE);
}
/* unlink the removed node it */
parent->e_child = entryptr->e_sibling;
parent->e_edbversion = new_version();
if (journal (entryptr->e_sibling) != OK) {
fatal (-35,"remove rewrite fail - check database");
return (DS_ERROR_REMOTE);
}
entry_free (entryptr);
return (DS_OK);
} else if (error->dse_type == DSE_REFERRAL)
return (DS_ERROR_CONNECT);
return (DS_ERROR_REMOTE);
}