|
|
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: 8875 (0x22ab)
Types: TextFile
Names: »dsa_work.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.0/quipu/dsa_work.c«
/* dsa_work.c - do some work on an active task. */
#ifndef lint
static char *rcsid = "$Header: /f/osi/quipu/RCS/dsa_work.c,v 7.1 89/12/19 16:20:32 mrose Exp $";
#endif
/*
* $Header: /f/osi/quipu/RCS/dsa_work.c,v 7.1 89/12/19 16:20:32 mrose Exp $
*
*
* $Log: dsa_work.c,v $
* Revision 7.1 89/12/19 16:20:32 mrose
* sync
*
* Revision 7.0 89/11/23 22:17:26 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 "acsap.h"
#include "quipu/util.h"
#include "quipu/common.h"
#include "quipu/connection.h"
extern LLog * log_dsap;
dsa_work(tk)
register struct task_act * tk;
{
struct DSArgument *arg;
struct DSError *err;
struct DSResult *res;
DN orig;
DN base;
struct ds_search_task **local;
struct ds_search_task **refer;
int dsa_ret;
struct di_block * di;
char dsp;
if(tk->tk_conn->cn_ctx == CN_CTX_X500_DAP)
{
orig = dn_cpy(tk->tk_conn->cn_who);
base = NULLDN;
dsp = FALSE;
}
else
{
/* Need to take GetEDB into account !! */
orig = dn_cpy(tk->tk_req.dca_charg.cha_originator);
base = dn_cpy(tk->tk_req.dca_charg.cha_target);
dsp = TRUE;
}
DLOG (log_dsap,LLOG_TRACE,( "Apply operation"));
arg = &(tk->tk_req.dca_dsarg);
res = &(tk->tk_resp.resp_res.dcr_dsres);
err = &(tk->tk_resp.resp_err);
local = &(tk->local_st);
refer = &(tk->refer_st);
#ifndef NO_STATS
if (*local == NULL_ST)
log_x500_event (arg,tk->tk_conn->cn_ctx,orig,base,tk->tk_conn->cn_ad);
#endif
if (!dsp && (tk->tk_conn->cn_authen == DBA_AUTH_NONE)) {
dn_free (orig);
orig = NULLDN;
}
switch(arg->arg_type)
{
case OP_READ:
dsa_ret = do_ds_read(&(arg->arg_rd), err, &(res->res_rd), orig, base, &(di), dsp,
tk->tk_conn->cn_ctx == CN_CTX_QUIPU_DSP);
break;
case OP_COMPARE:
dsa_ret = do_ds_compare(&(arg->arg_cm), err, &(res->res_cm), orig, base, &(di),dsp);
break;
case OP_ABANDON:
LLOG(log_dsap, LLOG_FATAL, ("Abandon being applied!"));
dsa_ret = do_ds_abandon(&(arg->arg_ab), err);
break;
case OP_LIST:
dsa_ret = do_ds_list(&(arg->arg_ls), err, &(res->res_ls), orig, base, &(di),dsp);
break;
case OP_SEARCH:
dsa_ret = do_ds_search(&(arg->arg_sr), err, &(res->res_sr), orig, base,
local, refer, &(di), dsp,
tk->tk_conn->cn_ctx == CN_CTX_QUIPU_DSP,
tk->tk_timed ? tk->tk_timeout : (time_t) 0);
search_continue (tk);
break;
case OP_ADDENTRY:
dsa_ret = do_ds_addentry(&(arg->arg_ad), err, orig, base, &(di),dsp);
break;
case OP_REMOVEENTRY:
dsa_ret = do_ds_removeentry(&(arg->arg_rm), err, orig, base, &(di),dsp);
break;
case OP_MODIFYENTRY:
dsa_ret = do_ds_modifyentry(&(arg->arg_me), err, orig, base, &(di),dsp);
break;
case OP_MODIFYRDN:
dsa_ret = do_ds_modifyrdn(&(arg->arg_mr), err, orig, base, &(di),dsp);
break;
case OP_GETEDB:
dn_free(orig);
if (tk->tk_conn->cn_initiator == INITIATED_BY_THIS)
orig = dn_cpy(tk->tk_conn->cn_what);
else
orig = dn_cpy(tk->tk_conn->cn_who);
dsa_ret = do_get_edb (&(arg->arg_ge), err, &(res->res_ge), orig);
break;
default:
LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unknown operation type!"));
break;
}
DLOG (log_dsap,LLOG_TRACE,( "Activity applied"));
switch(dsa_ret)
{
case DS_OK:
DLOG (log_dsap,LLOG_DEBUG,( "dsa_work - DS_OK"));
/* Task completed successfully: send result */
tk->tk_result = &(tk->tk_resp.resp_res);
tk->tk_result->dcr_dsres.result_type = tk->tk_req.dca_dsarg.arg_type;
tk->tk_resp.resp_type = RESP_TYPE_RET;
tk->tk_resp.ret_type = RET_TYPE_RES;
if((tk->referred_st != NULL_ST) || (tk->tk_operlist != NULLOPER))
{
tk->tk_state = TK_PASSIVE;
break; /* Go wait for operations to return */
}
tk->tk_resp.resp_type = RESP_TYPE_RET;
tk->tk_resp.ret_type = RET_TYPE_RES;
task_conn_extract(tk);
task_result(tk);
task_extract(tk);
break;
case DS_X500_ERROR:
DLOG (log_dsap,LLOG_DEBUG,( "dsa_work - DS_X500_ERROR"));
/* Task produced error: send error */
tk->tk_type = ACT_TYPE_RESP;
tk->tk_resp.resp_type = RESP_TYPE_RET;
tk->tk_resp.ret_type = RET_TYPE_ERR;
tk->tk_error = &(tk->tk_resp.resp_err);
task_conn_extract(tk);
task_error(tk);
if (tk->tk_req.dca_dsarg.arg_type == OP_SEARCH) {
free ((char *)tk->tk_resp.resp_res.dcr_dsres.res_sr.srr_un.srr_unit);
free ((char *)tk->tk_resp.resp_res.dcr_dsres.res_sr.srr_next->srr_un.srr_unit);
free ((char *)tk->tk_resp.resp_res.dcr_dsres.res_sr.srr_next);
}
task_extract(tk);
break;
case DS_CONTINUE:
DLOG (log_dsap,LLOG_DEBUG,( "dsa_work - DS_CONTINUE"));
#ifdef DEBUG
di_list_log(di);
#endif
/* Task produced list of dsas: chain operation or send referral */
if(task_chain(tk, di) != OK)
{
task_conn_extract(tk);
task_error(tk);
if (tk->tk_req.dca_dsarg.arg_type == OP_SEARCH) {
free ((char *)tk->tk_resp.resp_res.dcr_dsres.res_sr.srr_un.srr_unit);
free ((char *)tk->tk_resp.resp_res.dcr_dsres.res_sr.srr_next->srr_un.srr_unit);
free ((char *)tk->tk_resp.resp_res.dcr_dsres.res_sr.srr_next);
}
task_extract(tk);
}
else
{
tk->tk_state = TK_PASSIVE;
}
break;
case DS_SUSPEND:
DLOG (log_dsap,LLOG_DEBUG,( "dsa_work - DS_SUSPEND"));
/* Task has suspended itself to check network and other tasks */
if((tk->referred_st != NULL_ST) || (tk->tk_operlist != NULLOPER))
/* doing things over the net - no need to hurry !!! */
tk->tk_prio = DSA_PRIO_LOW;
tk->tk_state = TK_SUSPEND;
break;
default:
/* Local error */
LLOG(log_dsap, LLOG_EXCEPTIONS, ("dsa_work - do_ds_OP() failed"));
tk->tk_resp.resp_err.dse_type = DSE_SERVICEERROR;
tk->tk_resp.resp_err.ERR_SERVICE.DSE_sv_problem = DSE_SV_DITERROR;
task_conn_extract(tk);
task_error(tk);
if (tk->tk_req.dca_dsarg.arg_type == OP_SEARCH) {
free ((char *)tk->tk_resp.resp_res.dcr_dsres.res_sr.srr_un.srr_unit);
free ((char *)tk->tk_resp.resp_res.dcr_dsres.res_sr.srr_next->srr_un.srr_unit);
free ((char *)tk->tk_resp.resp_res.dcr_dsres.res_sr.srr_next);
}
task_extract(tk);
break;
}
dn_free(orig);
dn_free(base);
}
search_continue (tk)
struct task_act * tk;
{
struct ds_search_result * tk_sr = &(tk->tk_resp.resp_res.dcr_dsres.res_sr);
/* Set up next part of search result to collate remote sub-searches */
if(tk_sr->srr_next == NULLSRR)
{
DLOG(log_dsap, LLOG_DEBUG, ("Allocating a search result"));
tk_sr->srr_next = (struct ds_search_result *) calloc(1, sizeof(struct ds_search_result));
tk_sr->srr_next->srr_correlated = TRUE;
tk_sr->srr_next->srr_un.srr_unit = (struct ds_search_unit *) calloc(1, sizeof(struct ds_search_unit));
tk_sr->srr_next->CSR_limitproblem = LSR_NOLIMITPROBLEM;
}
/* Map any new elements in the refer list onto opers */
subtask_chain(tk);
if((tk->local_st != NULL_ST) && (tk->tk_state == TK_PASSIVE))
{
tk->tk_state = TK_ACTIVE;
}
}
#ifndef NO_STATS
log_x500_event (arg,context,orig,dsptarget,ad)
struct DSArgument *arg;
int context;
DN dsptarget,orig;
int ad;
{
extern LLog * log_stat;
char * op;
int dn_print ();
DN daptarget = NULLDN;
char buf [LINESIZE];
switch (arg->arg_type) {
case OP_READ: op = "Read";
daptarget = arg->arg_rd.rda_object;
break;
case OP_COMPARE: op = "Compare";
daptarget = arg->arg_cm.cma_object;
break;
case OP_ABANDON: op = "Abandon"; break;
case OP_LIST: op = "List";
daptarget = arg->arg_ls.lsa_object;
break;
case OP_SEARCH: op = "Search";
daptarget = arg->arg_sr.sra_baseobject;
break;
case OP_ADDENTRY: op = "Add";
daptarget = arg->arg_ad.ada_object;
break;
case OP_REMOVEENTRY: op = "Remove";
daptarget = arg->arg_rm.rma_object;
break;
case OP_MODIFYENTRY: op = "Modify";
daptarget = arg->arg_me.mea_object;
break;
case OP_MODIFYRDN: op = "Modifyrdn";
daptarget = arg->arg_mr.mra_object;
break;
case OP_GETEDB: op = "Getedb";
if (dsptarget == NULLDN) {
dsptarget = arg->arg_ge.ga_entry;
#ifdef REMOVE_FOR_6_0
daptarget = arg->arg_ge.ga_entry;
#endif
}
break;
default: op = "Unknown op"; break;
}
if (context == CN_CTX_X500_DAP) {
(void) sprintf (buf,"%s (%d)",op,ad);
(void) dn_decode (daptarget);
pslog (log_stat,LLOG_NOTICE,buf,dn_print,(caddr_t)daptarget);
} else {
(void) sprintf (buf,"%s (%d)",op,ad);
(void) dn_decode (dsptarget);
pslog (log_stat,LLOG_NOTICE,buf,dn_print,(caddr_t)dsptarget);
if (arg->arg_type != OP_GETEDB) {
(void) dn_decode (orig);
pslog (log_stat,LLOG_TRACE,"DAP Originator",dn_print,(caddr_t)orig);
}
}
}
#endif