Net2/usr/src/contrib/isode/dsap/net/dsapinvoke.c

/* dsapinvoke.c - DSAP : Invoke DAP operations */

#ifndef	lint
static char *rcsid = "$Header: /f/osi/dsap/net/RCS/dsapinvoke.c,v 7.1 91/02/22 09:21:20 mrose Interim $";
#endif

/* 
 * $Header: /f/osi/dsap/net/RCS/dsapinvoke.c,v 7.1 91/02/22 09:21:20 mrose Interim $
 *
 *
 * $Log:	dsapinvoke.c,v $
 * Revision 7.1  91/02/22  09:21:20  mrose
 * Interim 6.8
 * 
 * Revision 7.0  90/07/26  14:45:54  mrose
 * *** empty log message ***
 * 
 */

/*
 *                                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 <stdio.h>
#include "logger.h"
#include "quipu/dsap.h"
#include "../x500as/DAS-types.h"
#include "../x500as/Quipu-types.h"

extern  LLog    * log_dsap;

int	  DapInvokeRequest (sd, id, arg, di)
int			  sd;
int			  id;
struct DSArgument	* arg;
struct DSAPindication	* di;
{
    int				  result;
    PE				  arg_pe;
    struct RoSAPindication	  roi_s;
    struct RoSAPindication	* roi = &(roi_s);
    struct RoSAPpreject		* rop = &(roi->roi_preject);

    if (DapEncodeInvoke (&(arg_pe), arg) != OK)
    {
	LLOG (log_dsap, LLOG_EXCEPTIONS, ("DapInvokeRequest: Encoding failed"));
	return (dsapreject (di, DP_INVOKE, id, NULLCP, "Failed to encode operation argument"));
    }

    result = RoInvokeRequest (sd, arg->arg_type, ROS_ASYNC, arg_pe,
		id, NULLIP, ROS_NOPRIO, roi);

    if (result != OK)
    {
	if (ROS_FATAL (rop->rop_reason) || (rop->rop_reason == ROS_PARAMETER))
	{
	    LLOG (log_dsap, LLOG_EXCEPTIONS, ("DapInvokeRequest(): Fatal rejection"));
	    return (dsaplose (di, DP_INVOKE, NULLCP, "RoInvokeRequest failed"));
	}
	else
	{
	    LLOG (log_dsap, LLOG_EXCEPTIONS, ("DapInvokeRequest(): Non-Fatal rejection"));
	    return (dsapreject (di, DP_INVOKE, id, NULLCP, "RoInvokeRequest failed"));
	}
    }

    if (arg_pe != NULLPE)
	pe_free (arg_pe);
    return (OK);
}

int	  DapEncodeInvoke (pep, arg)
PE			* pep;
struct DSArgument	* arg;
{
    int		success;

    switch(arg->arg_type)
    {
    case    OP_READ :
	success = encode_DAS_ReadArgument(pep,1,0,NULLCP,&(arg->arg_rd));
	break;
    case    OP_COMPARE :
	success = encode_DAS_CompareArgument(pep,1,0,NULLCP,&(arg->arg_cm));
	break;
    case    OP_ABANDON :
	success = encode_DAS_AbandonArgument(pep,1,0,NULLCP,&(arg->arg_ab));
	break;
    case    OP_LIST :
	success = encode_DAS_ListArgument(pep,1,0,NULLCP,&(arg->arg_ls));
	break;
    case    OP_SEARCH :
	success = encode_DAS_SearchArgument(pep,1,0,NULLCP,&(arg->arg_sr));
	break;
    case    OP_ADDENTRY :
	success = encode_DAS_AddEntryArgument(pep,1,0,NULLCP,&(arg->arg_ad));
	break;
    case    OP_REMOVEENTRY :
	success = encode_DAS_RemoveEntryArgument(pep,1,0,NULLCP,&(arg->arg_rm));
	break;
    case    OP_MODIFYENTRY :
	success = encode_DAS_ModifyEntryArgument(pep,1,0,NULLCP,&(arg->arg_me));
	break;
    case    OP_MODIFYRDN :
	success = encode_DAS_ModifyRDNArgument(pep,1,0,NULLCP,&(arg->arg_mr));
	break;
    default :
	success = NOTOK;
	LLOG(log_dsap, LLOG_EXCEPTIONS, ("DapEncodeInvoke(): unknown op type %d", arg->arg_type));
	break;
    }

    return(success);
}

int	  DspInvokeRequest (sd, id, arg, di)
int	  sd;
int	  id;
struct ds_op_arg	* arg;
struct DSAPindication	* di;
{
    int				  result;
    PE				  arg_pe;
    struct RoSAPindication	  roi_s;
    struct RoSAPindication	* roi = &(roi_s);
    struct RoSAPpreject		* rop = &(roi->roi_preject);

    if (DspEncodeInvoke (&(arg_pe), arg) != OK)
    {
	LLOG (log_dsap, LLOG_EXCEPTIONS, ("DspInvokeRequest: Encoding failed"));
	return (dsapreject (di, DP_INVOKE, id, NULLCP, "Failed to encode operation argument"));
    }

    watch_dog("RoInvokeRequest (DSP)");
    result = RoInvokeRequest (sd, arg->dca_dsarg.arg_type, ROS_ASYNC, arg_pe,
		id, NULLIP, ROS_NOPRIO, roi);
    watch_dog_reset();

    if (result != OK)
    {
	if (ROS_FATAL (rop->rop_reason) || (rop->rop_reason == ROS_PARAMETER))
	{
	    LLOG (log_dsap, LLOG_EXCEPTIONS, ("DspInvokeRequest(): Fatal rejection"));
	    return (dsaplose (di, DP_INVOKE, NULLCP, "RoInvokeRequest failed"));
	}
	else
	{
	    LLOG (log_dsap, LLOG_EXCEPTIONS, ("DspInvokeRequest(): Non-Fatal rejection"));
	    return (dsapreject (di, DP_INVOKE, id, NULLCP, "RoInvokeRequest failed"));
	}
    }

    if (arg_pe != NULLPE)
	pe_free (arg_pe);
    return (OK);
}

int	  DspEncodeInvoke (pep, arg)
PE			* pep;
struct ds_op_arg	* arg;
{
    int		success;

    switch(arg->dca_dsarg.arg_type)
    {
    case    OP_READ :
	success = encode_DO_ChainedReadArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_COMPARE :
	success = encode_DO_ChainedCompareArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_ABANDON :
	success = encode_DAS_AbandonArgument(pep,1,0,NULLCP,&(arg->dca_dsarg.arg_ab));
	break;
    case    OP_LIST :
	success = encode_DO_ChainedListArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_SEARCH :
	success = encode_DO_ChainedSearchArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_ADDENTRY :
	success = encode_DO_ChainedAddEntryArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_REMOVEENTRY :
	success = encode_DO_ChainedRemoveEntryArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_MODIFYENTRY :
	success = encode_DO_ChainedModifyEntryArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_MODIFYRDN :
	success = encode_DO_ChainedModifyRDNArgument(pep,1,0,NULLCP,arg);
	break;
    default :
	success = NOTOK;
	LLOG(log_dsap, LLOG_EXCEPTIONS, ("DspEncodeInvoke(): unknown op type %d", arg->dca_dsarg.arg_type));
	break;
    }

    return(success);
}

int	  QspInvokeRequest (sd, id, arg, di)
int	  sd;
int	  id;
struct ds_op_arg	* arg;
struct DSAPindication	* di;
{
    int				  result;
    PE				  arg_pe;
    struct RoSAPindication	  roi_s;
    struct RoSAPindication	* roi = &(roi_s);
    struct RoSAPpreject		* rop = &(roi->roi_preject);

    if (QspEncodeInvoke (&(arg_pe), arg) != OK)
    {
	LLOG (log_dsap, LLOG_EXCEPTIONS, ("QspInvokeRequest: Encoding failed"));
	return (dsapreject (di, DP_INVOKE, id, NULLCP, "Failed to encode operation argument"));
    }

    watch_dog("RoInvokeRequest (QSP)");
    result = RoInvokeRequest (sd, arg->dca_dsarg.arg_type, ROS_ASYNC, arg_pe,
		id, NULLIP, ROS_NOPRIO, roi);
    watch_dog_reset();

    if (result != OK)
    {
	if (ROS_FATAL (rop->rop_reason) || (rop->rop_reason == ROS_PARAMETER))
	{
	    LLOG (log_dsap, LLOG_EXCEPTIONS, ("QspInvokeRequest(): Fatal rejection"));
	    return (dsaplose (di, DP_INVOKE, NULLCP, "RoInvokeRequest failed"));
	}
	else
	{
	    LLOG (log_dsap, LLOG_EXCEPTIONS, ("QspInvokeRequest(): Non-Fatal rejection"));
	    return (dsapreject (di, DP_INVOKE, id, NULLCP, "RoInvokeRequest failed"));
	}
    }

    if (arg_pe != NULLPE)
	pe_free (arg_pe);
    return (OK);
}

int	  QspEncodeInvoke (pep, arg)
PE			* pep;
struct ds_op_arg	* arg;
{
    int		success;

    switch(arg->dca_dsarg.arg_type)
    {
    case    OP_READ :
	success = encode_DO_ChainedReadArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_COMPARE :
	success = encode_DO_ChainedCompareArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_ABANDON :
	success = encode_DAS_AbandonArgument(pep,1,0,NULLCP,&(arg->dca_dsarg.arg_ab));
	break;
    case    OP_LIST :
	success = encode_DO_ChainedListArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_SEARCH :
	success = encode_DO_ChainedSearchArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_ADDENTRY :
	success = encode_DO_ChainedAddEntryArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_REMOVEENTRY :
	success = encode_DO_ChainedRemoveEntryArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_MODIFYENTRY :
	success = encode_DO_ChainedModifyEntryArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_MODIFYRDN :
	success = encode_DO_ChainedModifyRDNArgument(pep,1,0,NULLCP,arg);
	break;
    case    OP_GETEDB :
        success = encode_Quipu_GetEntryDataBlockArgument(pep,1,0,NULLCP,&(arg->dca_dsarg.arg_ge));
        break;
    default :
	success = NOTOK;
	LLOG(log_dsap, LLOG_EXCEPTIONS, ("QspEncodeInvoke(): unknown op type %d", arg->dca_dsarg.arg_type));
	break;
    }

    return(success);
}