|
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