|
|
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: 8660 (0x21d4)
Types: TextFile
Names: »ds_abandon.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.0/dsap/net/ds_abandon.c«
/* ds_abandon.c - */
#ifndef lint
static char *rcsid = "$Header: /f/osi/dsap/net/RCS/ds_abandon.c,v 7.0 89/11/23 21:48:09 mrose Rel $";
#endif
/*
* $Header: /f/osi/dsap/net/RCS/ds_abandon.c,v 7.0 89/11/23 21:48:09 mrose Rel $
*
*
* $Log: ds_abandon.c,v $
* Revision 7.0 89/11/23 21:48:09 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.
*
*/
/* LINTLIBRARY */
#include "rosap.h"
#include "quipu/util.h"
#include "quipu/connection.h"
extern LLog * log_dsap;
void ros_log ();
#ifdef PDU_DUMP
#define DUMP_ARG "arg"
#define DUMP_RES "res"
#define DUMP_ERR "err"
#endif
dap_abandon (ad, id, arg, error)
int ad;
int * id;
struct ds_abandon_arg *arg;
struct DSError *error;
{
PE rda_pe;
PE resp_pe;
int resp_type;
int inv_ret;
if(encode_DAS_AbandonArgument(&rda_pe,1,NULLIP,NULLVP,arg) != OK)
{
error->dse_type = DSE_LOCALERROR;
return(DS_ERROR_LOCAL);
}
switch(inv_ret = dap_invoke(ad, id, OP_ABANDON, rda_pe, &resp_type, &resp_pe))
{
case DS_OK:
if(decode_DAS_AbandonResult(resp_pe,1,NULLIP,NULLCP,NULLCP) == OK) {
pe_free (resp_pe);
error->dse_type = DSE_NOERROR;
return(DS_OK);
} else {
if(resp_pe != NULLPE)
pe_free (resp_pe);
error->dse_type = DSE_REMOTEERROR;
return(DS_ERROR_PROVIDER);
}
case DS_ERROR_REMOTE:
if(decode_OPError(resp_pe, resp_type, error) == OK)
{
if(resp_pe != NULLPE)
pe_free(resp_pe);
return(DS_ERROR_REMOTE);
}
else
{
if(resp_pe != NULLPE)
pe_free(resp_pe);
error->dse_type = DSE_REMOTEERROR;
return(DS_ERROR_PROVIDER);
}
case DS_ERROR_PROVIDER:
if (resp_type == ROS_INTERRUPTED) {
error->dse_type = DSE_INTRERROR;
return (inv_ret);
}
/* fall */
default:
error->dse_type = DSE_REMOTEERROR;
return(inv_ret);
}
}
int attempt_abandon(ad, id, op, resp_pe, resp_type)
int ad;
int * id;
int op;
PE * resp_pe;
int * resp_type;
{
/*
* Abandoning. Trickier than it looks!
* Need to RoInvoke an abandon op, which will receive
* One of the following:
* Result/Error for op being abandoned sent before
* this abandon arrived at the DSA;
* Abandoned error for op being abandoned;
* Result for abandon op which has overtaken the
* abandoned error for previous op between DSA and DUA
* Error for abandon because DSA has screwed up.
*
* Basically there will be either one or two Ro events to
* collect before returning. 1 in the case that abandon
* receives the error "NoSuchOperation" 2 otherwise.
*/
/* abandon operation */
struct ds_abandon_arg ab_arg;
struct DSError ab_err;
PE ab_req_pe;
PE ab_resp_pe;
int old_id;
int result;
int ret1;
int ret2;
struct RoSAPindication roi1_s;
struct RoSAPindication * roi1 = &(roi1_s);
struct RoSAPpreject * rop1 = &(roi1->roi_preject);
struct RoSAPindication roi2_s;
struct RoSAPindication * roi2 = &(roi2_s);
struct RoSAPpreject * rop2 = &(roi2->roi_preject);
ab_arg.aba_invokeid = old_id = (*id);
++(*id);
if(encode_DAS_AbandonArgument(&ab_req_pe,1,NULLIP,NULLVP,&ab_arg) != OK)
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Failed to encode an abandon operation"));
/* Go on listening for result or dump out ?? */
return(DS_ERROR_PROVIDER);
}
else
{
DLOG(log_dsap, LLOG_DEBUG, ("Abandon invoke request"));
ret1 = RoInvokeRequest(ad,OP_ABANDON,ROS_SYNC,ab_req_pe,(old_id + 1),NULLIP,ROS_NOPRIO,roi1);
DLOG(log_dsap, LLOG_DEBUG, ("Abandon RoInvoke returns: %d", ret1));
pe_free(ab_req_pe);
switch(ret1)
{
case OK:
/* What have we got? */
switch(roi1->roi_type)
{
case ROI_RESULT:
#ifdef PDU_DUMP
pdu_dump (*resp_pe,DUMP_RES,op);
#endif
if(roi1->roi_result.ror_id == old_id)
{
/* Ferret result away for later */
*resp_type = op;
*resp_pe = roi1->roi_result.ror_result;
result = DS_OK;
}
else if(roi1->roi_result.ror_id == (old_id + 1))
{
ab_resp_pe = roi1->roi_result.ror_result;
/* Should check this really !! */
}
else
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("ARRGH! Abandon sent: event for neither op nor abandon op returned!!"));
return(DS_ERROR_PROVIDER);
}
break;
case ROI_ERROR:
#ifdef PDU_DUMP
pdu_dump (*resp_pe,DUMP_ERR,op);
#endif
if(roi1->roi_error.roe_id == old_id)
{
/* Ferret error away for later */
*resp_type = roi1->roi_error.roe_error;
*resp_pe = roi1->roi_error.roe_param;
result = DS_ERROR_REMOTE;
}
else if(roi1->roi_error.roe_id == (old_id + 1))
{
ab_resp_pe = roi1->roi_error.roe_param;
if(decode_OPError(ab_resp_pe, roi1->roi_error.roe_error, &(ab_err)) != OK)
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Failed to decode abandonFailed"));
return(DS_ERROR_PROVIDER);
}
else
{
if(ab_err.dse_type != DSE_ABANDON_FAILED)
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Failed to abandon correctly"));
return(DS_ERROR_PROVIDER);
}
else
{
LLOG(log_dsap, LLOG_NOTICE, ("Abandon failed error!!!"));
log_ds_error(&ab_err);
ds_error_free(&ab_err);
}
}
}
else
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Abandon sent : event for neither op nor abandon op returned!!"));
return(DS_ERROR_PROVIDER);
}
break;
default:
LLOG(log_dsap, LLOG_FATAL, ("Unknown roi_type : %d", roi1->roi_type));
return(DS_ERROR_PROVIDER);
}
break;
case NOTOK:
ros_log(rop1, "RO-INVOKE.REQUEST");
return(DS_ERROR_PROVIDER);
case DONE:
/*
* Assume A-RELEASE.INDICATION since RO-END.INDICATION is obsolete.
*/
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Responder has sent Finish!"));
return(DS_ERROR_PROVIDER);
default:
LLOG(log_dsap, LLOG_FATAL, ("Unknown return from RoInvokeRequest : %d", ret1));
return(DS_ERROR_PROVIDER);
}
ret2 = RoWaitRequest(ad, NOTOK, roi2);
DLOG(log_dsap, LLOG_DEBUG, ("Abandon RoInvoke returns: %d", ret1));
switch(ret2)
{
case OK:
/* What have we got? */
switch(roi2->roi_type)
{
case ROI_RESULT:
#ifdef PDU_DUMP
pdu_dump (*resp_pe,DUMP_RES,op);
#endif
if(roi2->roi_result.ror_id == old_id)
{
/* Ferret result away for later */
*resp_type = op;
*resp_pe = roi2->roi_result.ror_result;
result = DS_OK;
}
else if(roi2->roi_result.ror_id == (old_id + 1))
{
ab_resp_pe = roi2->roi_result.ror_result;
/* Should check this really !! */
}
else
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("ARRGH! Abandon sent and event for neither op nor abandon op returned!!"));
return(DS_ERROR_PROVIDER);
}
break;
case ROI_ERROR:
#ifdef PDU_DUMP
pdu_dump (*resp_pe,DUMP_ERR,op);
#endif
if(roi2->roi_error.roe_id == old_id)
{
/* Ferret error away for later */
*resp_type = roi2->roi_error.roe_error;
*resp_pe = roi2->roi_error.roe_param;
result = DS_ERROR_REMOTE;
}
else if(roi2->roi_error.roe_id == (old_id + 1))
{
ab_resp_pe = roi2->roi_error.roe_param;
if(decode_OPError(ab_resp_pe, roi2->roi_error.roe_error, &(ab_err)) != OK)
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Failed to decode abandonFailed"));
return(DS_ERROR_PROVIDER);
}
else
{
if(ab_err.dse_type != DSE_ABANDON_FAILED)
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Failed to abandon correctly"));
return(DS_ERROR_PROVIDER);
}
else
{
LLOG(log_dsap, LLOG_NOTICE, ("Abandon failed error!!!"));
log_ds_error(&ab_err);
ds_error_free(&ab_err);
}
}
}
else
{
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Abandon sent : event for neither op nor abandon op returned!!"));
return(DS_ERROR_PROVIDER);
}
break;
default:
LLOG(log_dsap, LLOG_FATAL, ("Unknown roi_type : %d", roi2->roi_type));
return(DS_ERROR_PROVIDER);
}
break;
case NOTOK:
ros_log(rop2, "RO-WAIT.REQUEST (Abandon)");
return(DS_ERROR_PROVIDER);
case DONE:
/*
* Assume A-RELEASE.INDICATION since RO-END.INDICATION is obsolete.
*/
LLOG(log_dsap, LLOG_EXCEPTIONS, ("Responder has sent Finish!"));
return(DS_ERROR_PROVIDER);
default:
LLOG(log_dsap, LLOG_FATAL, ("Unknown return from RoInvokeRequest : %d", ret2));
return(DS_ERROR_PROVIDER);
}
}
return(result);
}