DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T n

⟦a2161e5de⟧ TextFile

    Length: 9715 (0x25f3)
    Types: TextFile
    Names: »nw_ac_in_req.c«

Derivation

└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
    └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« 
        └─⟦d3ac74d73⟧ 
            └─⟦this⟧ »isode-5.0/quipu/nw_ac_in_req.c« 

TextFile

/* nw_ac_in_req.c - */

#ifndef lint
static char *rcsid = "$Header: /f/osi/quipu/RCS/nw_ac_in_req.c,v 6.0 89/03/18 23:41:45 mrose Rel $";
#endif

/*
 * $Header: /f/osi/quipu/RCS/nw_ac_in_req.c,v 6.0 89/03/18 23:41:45 mrose Rel $
 *
 *
 * $Log:	nw_ac_in_req.c,v $
 * Revision 6.0  89/03/18  23:41:45  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 "acsap.h"
#include "rosap.h"
#include "quipu/util.h"
#include "quipu/connection.h"

extern LLog * log_dsap;
#ifndef NO_STATS
extern LLog * log_stat;
#endif


Conn    conn_alloc();
void    acs_log();

extern	OID	acse_pci;
extern	OID	x500_da_ac;
extern	OID	x500_ds_ac;
extern	struct PSAPctxlist	* x500_da_pcdl;
extern	struct PSAPctxlist	* x500_ds_pcdl;

int     net_wait_init_request(vecp, vec)
int             vecp;
char            *vec[4];
{
    Conn                          cn;
    struct AcSAPstart           * acs;
    struct AcSAPindication        aci_s;
    struct AcSAPindication      * aci = &aci_s;
    struct AcSAPabort           * aca = &(aci->aci_abort);
    struct ds_bind_arg          * bind_arg;
    PE	pe;

    DLOG (log_dsap,LLOG_TRACE,( "net_wait_init_request()"));

    acs = (struct AcSAPstart *) malloc(sizeof(struct AcSAPstart));

    if(AcInit(vecp, vec, acs, aci) == OK) {
	DLOG (log_dsap,LLOG_TRACE,( "net_wait_init_request() : AcInit() OK"));
	/*
	* Examine the argument vector.
	*/
	for(vec++; *vec; vec++)
	{
	    LLOG (log_dsap,LLOG_EXCEPTIONS,( "unknown argument \"%s\"", *vec));
	}

	/*
	* Log the arrival of a connection request.
	*/
	LLOG (log_dsap,LLOG_NOTICE,
		("A-ASSOCIATE.INDICATION: <%d, %s, %s, %s, %d> <%s>",
		acs->acs_sd, oid2ode(acs->acs_context),
		sprintaei (&acs->acs_callingtitle),
		sprintaei (&acs->acs_calledtitle), acs->acs_ninfo,
		paddr2str (&(acs->acs_start.ps_calling), NULLNA)));

	if(SetROPS(acs->acs_sd) == OK) {
	    cn = conn_alloc();

	    cn->cn_next = id_st.connlist;
	    id_st.connlist = cn;

	    cn->cn_ad = acs->acs_sd;
	    cn->cn_initiator = INITIATED_BY_THAT;
	    cn->cn_state = CN_STATE_INIT;
	    cn->cn_init_act.ia_acs = acs;
	    LLOG (log_dsap,LLOG_EXCEPTIONS,( "New association with ad %d", cn->cn_ad));

	    if(acs->acs_sd >= id_st.nads)
		id_st.nads = acs->acs_sd + 1;
	    FD_SET (acs->acs_sd, &id_st.iads);

	    /*
		Peel off the remote operations BIND tag. For the time being we continue
		if it is not present even though this is in error
	    */
	    if (acs->acs_info[0] != NULLPE) {
		pe = pe_cpy (acs->acs_info[0]);
		if (parse_Remote__Operations__Notation_BindArgumentValue (pe, 
			1, NULL, NULLCP, &acs->acs_info[0]) != OK) {
		    /* We continue here since we will fail later if this is bad */
		    LLOG (log_dsap, LLOG_EXCEPTIONS, ("parse_Remote__Operations__Notation_BindArgumentValue failed - continuing"));
		} else
		    DLOG (log_dsap, LLOG_DEBUG, ("parse_Remote__Operations__Notation_BindArgumentValue OK"));
		pe_free (pe);
	    } else {
		LLOG (log_dsap, LLOG_EXCEPTIONS, ("No DirectoryBindArgument"));
		cn->cn_init_act.ia_type = ACT_TYPE_RESP;
		cn->cn_init_act.ia_resp.init_resp_type = RESP_TYPE_REJ;
		cn->cn_init_act.ia_status = ACS_PERMANENT;
		cn->cn_init_act.ia_reason = ACS_USER_NOREASON;
		cn->cn_init_act.ia_class = ACTIVITY_NET_SEND;
		return(OK);
	    }

	    /*
	    * Check contexts.
	    */
	    if(oid_cmp(acs->acs_context, x500_da_ac) == 0)
	    {
#ifndef NO_STATS
		LLOG (log_stat,LLOG_NOTICE,("DAP association: %s",paddr2str(&(acs->acs_start.ps_calling),NULLNA)));
#endif
		cn->cn_dsa = 0;
		if(judge_ctxlist(&(acs->acs_start.ps_ctxlist), x500_da_pcdl) == 0)
		{
		    cn->cn_context_id = find_ctx(&(acs->acs_start.ps_ctxlist), DIR_ACCESS_AS);
		    /*
		    * Check that the bind parameter is decodable.
		    */
		    bind_arg = &(cn->cn_init_act.ia_req);
		    if(decode_DAS_DirectoryBindArgument(
		      acs->acs_info[0], 1, NULLCP, NULLIP, bind_arg) == OK)
		    {
		        DLOG(log_dsap,LLOG_DEBUG, ("DAP Bind decoded"));
			cn->cn_init_act.ia_type = ACT_TYPE_REQ;
			cn->cn_init_act.ia_status = ACS_ACCEPT;
			cn->cn_init_act.ia_reason = ACS_USER_NULL;
			cn->cn_init_act.ia_class = ACTIVITY_DSA_WORK;
			cn->cn_what = NULLDN;
			dn_decode(bind_arg->dba_dn);
			cn->cn_who = bind_arg->dba_dn;
		    }
		    else
		    {
			LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unable to parse DBA"));
			cn->cn_init_act.ia_type = ACT_TYPE_RESP;
			cn->cn_init_act.ia_resp.init_resp_type = RESP_TYPE_REJ;
			cn->cn_init_act.ia_status = ACS_TRANSIENT;
			cn->cn_init_act.ia_reason = ACS_PARAMETER;
			cn->cn_init_act.ia_class = ACTIVITY_NET_SEND;
		    }
		}
		else
		{
		    LLOG(log_dsap,LLOG_EXCEPTIONS, ("Unacceptable Abstract Syntaxes for DAP"));
		    cn->cn_init_act.ia_type = ACT_TYPE_RESP;
		    cn->cn_init_act.ia_resp.init_resp_type = RESP_TYPE_REJ;
		    cn->cn_init_act.ia_status = ACS_TRANSIENT;
		    cn->cn_init_act.ia_reason = ACS_USER_NOREASON;
		    cn->cn_init_act.ia_class = ACTIVITY_NET_SEND;
		}
	    }
	    else if(oid_cmp(acs->acs_context, x500_ds_ac) == 0)
	    {
#ifndef NO_STATS
		LLOG (log_stat,LLOG_NOTICE,("DSP association: %s",paddr2str(&(acs->acs_start.ps_calling),NULLNA)));
#endif
		cn->cn_dsa = 1;
		if(judge_ctxlist(&(acs->acs_start.ps_ctxlist), x500_ds_pcdl) == 0)
		{
		    cn->cn_context_id = find_ctx(&(acs->acs_start.ps_ctxlist), DIR_SYSTEM_AS);
		    /*
		    * Check that the bind parameter is decodable.
		    */
		    bind_arg = &(cn->cn_init_act.ia_req);
		    if(decode_DAS_DirectoryBindArgument(
		      acs->acs_info[0], 1, NULLCP, NULLIP, bind_arg) == OK)
		    {
		        DLOG(log_dsap,LLOG_DEBUG, ("DSP Bind decoded"));
			cn->cn_init_act.ia_type = ACT_TYPE_REQ;
			cn->cn_init_act.ia_status = ACS_ACCEPT;
			cn->cn_init_act.ia_reason = ACS_USER_NULL;
			cn->cn_init_act.ia_class = ACTIVITY_DSA_WORK;
			cn->cn_what = NULLDN;
			dn_decode(bind_arg->dba_dn);
			cn->cn_who = bind_arg->dba_dn;
		    }
		    else
		    {
			LLOG (log_dsap,LLOG_EXCEPTIONS,( "Unable to parse DBA"));
			cn->cn_init_act.ia_type = ACT_TYPE_RESP;
			cn->cn_init_act.ia_resp.init_resp_type = RESP_TYPE_REJ;
			cn->cn_init_act.ia_status = ACS_TRANSIENT;
			cn->cn_init_act.ia_reason = ACS_PARAMETER;
			cn->cn_init_act.ia_class = ACTIVITY_NET_SEND;
		    }
		}
		else
		{
		    LLOG(log_dsap,LLOG_EXCEPTIONS, ("Unacceptable Abstract Syntaxes for DSP"));
		    cn->cn_init_act.ia_type = ACT_TYPE_RESP;
		    cn->cn_init_act.ia_resp.init_resp_type = RESP_TYPE_REJ;
		    cn->cn_init_act.ia_status = ACS_TRANSIENT;
		    cn->cn_init_act.ia_reason = ACS_USER_NOREASON;
		    cn->cn_init_act.ia_class = ACTIVITY_NET_SEND;
		}
	    }
	    else
	    {
		LLOG(log_dsap, LLOG_EXCEPTIONS, ("Unrecognised application context"));
		cn->cn_init_act.ia_type = ACT_TYPE_RESP;
		cn->cn_init_act.ia_resp.init_resp_type = RESP_TYPE_REJ;
		cn->cn_init_act.ia_status = ACS_TRANSIENT;
		cn->cn_init_act.ia_reason = ACS_CONTEXT;
		cn->cn_init_act.ia_class = ACTIVITY_NET_SEND;
	    }
	    return(OK);
	}
	else
	{
	    LLOG (log_dsap,LLOG_EXCEPTIONS,( "Not sure what to do when SetROPS fails"));
	    DLOG (log_dsap,LLOG_NOTICE,( "Calling AcUAbort directly (no conn)"));
#ifndef NO_STATS
	    LLOG (log_stat,LLOG_NOTICE,("failed association: %s",paddr2str(&(acs->acs_start.ps_calling),NULLNA)));
#endif
	    (void) AcUAbortRequest(acs->acs_sd, NULLPEP, 0, aci);
	    ACSFREE(acs);
	    return(NOTOK);
	}
    }
    else
    {
	LLOG (log_dsap,LLOG_EXCEPTIONS,( "net_wait_init_request() : AcInit() NOTOK"));
	acs_log(aca, "initialization fails");
	ACAFREE(aca);
	return(NOTOK);
    }
}


/* ARGSUSED */
judge_ctxlist(req_ctxlist, ok_ctxlist)
struct PSAPctxlist      * req_ctxlist;
struct PSAPctxlist      * ok_ctxlist;
{
    int			  ctxlist_notok = 0;
    int                   i;
    int                   j;
    OID                   ok_asn;
    OID                   req_asn;

    DLOG (log_dsap, LLOG_TRACE, ("Checking Context List"));

    for(i=0; i<req_ctxlist->pc_nctx; i++)
    {
	DLOG (log_dsap, LLOG_DEBUG, ("Context (%d): id=%d, %s",
		i,
		req_ctxlist->pc_ctx[i].pc_id,
		oid2ode (req_ctxlist->pc_ctx[i].pc_asn)));

	if(req_ctxlist->pc_ctx[i].pc_result == PC_ACCEPT)
	    req_ctxlist->pc_ctx[i].pc_result = PC_REJECTED;
    }

    for(j=0; j<ok_ctxlist->pc_nctx; j++)
    {
	ok_asn = ok_ctxlist->pc_ctx[j].pc_asn;
	for(i=0; i<req_ctxlist->pc_nctx; i++)
	{
	    if((req_asn = req_ctxlist->pc_ctx[i].pc_asn) == NULLOID) {
		LLOG (log_dsap,LLOG_EXCEPTIONS,( "Reject: asn is NULLOID"));
		continue;
	    }

	    if((oid_cmp(req_asn, ok_asn) == 0))
		break;
	}
	if(i < req_ctxlist->pc_nctx) {
	    req_ctxlist->pc_ctx[i].pc_result = PC_ACCEPT;
	} else {
	    LLOG (log_dsap, LLOG_EXCEPTIONS, ("Missing Context: %s", oid2ode (ok_asn)));
	    ctxlist_notok = 1;
	}
    }

#ifdef	DEBUG
    for(i=0; i<req_ctxlist->pc_nctx; i++)
    {
	LLOG(log_dsap, LLOG_DEBUG, ("ctx[%d] id = %d, res = %d.", i,
		req_ctxlist->pc_ctx[i].pc_id,
		req_ctxlist->pc_ctx[i].pc_result));

	if(req_ctxlist->pc_ctx[i].pc_result == PC_REJECTED)
		DLOG (log_dsap, LLOG_DEBUG, ("Context Rejected: id=%d, %s",
			req_ctxlist->pc_ctx[i].pc_id,
			oid2ode (req_ctxlist->pc_ctx[i].pc_asn)));
	    
    }
#endif

    return(ctxlist_notok);
}

int	  find_ctx(pcdl, ctx_oid)
struct PSAPctxlist	* pcdl;
OID			  ctx_oid;
{
    int	  i;

    for(i=0; i<pcdl->pc_nctx; i++)
    {
	if(oid_cmp(ctx_oid, pcdl->pc_ctx[i].pc_asn) == 0)
	    break;
    }

    if(i < pcdl->pc_nctx)
	return(pcdl->pc_ctx[i].pc_id);

    LLOG(log_dsap, LLOG_EXCEPTIONS, ("Couldn't find context identifier"));

    return(NOTOK);
}