Esempio n. 1
0
bool
gcd_put_i4p( GCD_RCB **rcb_ptr, u_i1 *val )
{
    GCD_RCB	*rcb = *rcb_ptr;
    STATUS	status;

    if ( ! rcb )  return( FALSE );

    if ( CV_N_I4_SZ > RCB_AVAIL( rcb ) )  
	if ( ! gcd_msg_split( rcb_ptr ) )  
	    return( FALSE );
	else
	    rcb = *rcb_ptr;

    CV2N_I4_MACRO( val, &rcb->buf_ptr[ rcb->buf_len ], &status );
    rcb->buf_len += CV_N_I4_SZ;

    return( TRUE );
}
Esempio n. 2
0
static void
build_hdr( GCD_RCB *rcb, DAM_TL_HDR *hdr )
{
    STATUS	status;

    /*
    ** Caller is required to provide room prior to
    ** data for TL header, so reserve that space.
    */
    rcb->buf_ptr -= DAM_TL_HDR_SZ;
    rcb->buf_len += DAM_TL_HDR_SZ;

    /*
    ** Now build the header in space reserved.
    */
    CV2N_I4_MACRO( &hdr->tl_id, rcb->buf_ptr, &status );
    CV2N_I2_MACRO( &hdr->msg_id, &rcb->buf_ptr[ CV_N_I4_SZ ], &status );

    return;
}
Esempio n. 3
0
static void
send_dr( GCD_CCB *ccb, GCD_RCB *rcb, STATUS error )
{
    DAM_TL_HDR	hdr;

    if ( ! ccb->tl.gcc_service )	/* Already shutdown? */
    {
	/*
	** Consume RCB if provided.
	*/
	if ( rcb )  gcd_del_rcb( rcb );
	return;
    }

    if ( GCD_global.gcd_trace_level >= 3 )
	TRdisplay( "%4d    GCD DMTL aborting connection: 0x%x\n", 
		    ccb->id, error );

    /*
    ** If RCB provided, initialize since it may 
    ** have contained data.  Allocate otherwise.
    ** Allow room for error parameter.
    */
    if ( rcb )
	gcd_init_rcb( rcb );
    else  if ( ! (rcb = gcd_new_rcb( ccb, (CV_N_I1_SZ * 2) + CV_N_I4_SZ )) )  
	return;

    /*
    ** Return error code to client when provided.
    */
    if ( error != OK  &&  error != FAIL )
    {
	DAM_TL_PARAM	param;
	STATUS		status;

	param.param_id = DAM_TL_DP_ERR;
	CV2N_I1_MACRO( &param.param_id,
		       &rcb->buf_ptr[ rcb->buf_len ], &status );
	rcb->buf_len += CV_N_I1_SZ;
	    
	param.pl1 = CV_N_I4_SZ;
	CV2N_I1_MACRO( &param.pl1,
		       &rcb->buf_ptr[ rcb->buf_len ], &status );
	rcb->buf_len += CV_N_I1_SZ;
		
	CV2N_I4_MACRO( &error, 
		       &rcb->buf_ptr[ rcb->buf_len ], &status );
	rcb->buf_len += CV_N_I4_SZ;
    }

    /*
    ** Add TL packet header and send packet.
    */
    hdr.tl_id = ccb->tl.packet_id;
    hdr.msg_id = DAM_TL_DR;
    build_hdr( rcb, &hdr );
    (*ccb->tl.gcc_service->send)( rcb );

    return;
}
Esempio n. 4
0
static void
build_cc_parms( GCD_RCB *rcb, u_i1 size, u_i1 *msg_param, u_i2 msg_len )
{
    GCD_CCB		*ccb = rcb->ccb;
    DAM_TL_PARAM	param;
    STATUS		status;

    /*
    ** TL Protocol Level
    */
    param.param_id = DAM_TL_CP_PROTO;
    CV2N_I1_MACRO( &param.param_id, &rcb->buf_ptr[ rcb->buf_len ], &status );
    rcb->buf_len += CV_N_I1_SZ;

    param.pl1 = 1;
    CV2N_I1_MACRO( &param.pl1, &rcb->buf_ptr[ rcb->buf_len ], &status );
    rcb->buf_len += CV_N_I1_SZ;

    CV2N_I1_MACRO( &ccb->tl.proto_lvl, &rcb->buf_ptr[rcb->buf_len], &status );
    rcb->buf_len += CV_N_I1_SZ;

    /*
    ** Packet Buffer Size
    */
    param.param_id = DAM_TL_CP_SIZE;
    CV2N_I1_MACRO( &param.param_id, &rcb->buf_ptr[ rcb->buf_len ], &status );
    rcb->buf_len += CV_N_I1_SZ;

    param.pl1 = 1;
    CV2N_I1_MACRO( &param.pl1, &rcb->buf_ptr[ rcb->buf_len ], &status );
    rcb->buf_len += CV_N_I1_SZ;

    CV2N_I1_MACRO( &size, &rcb->buf_ptr[ rcb->buf_len ], &status );
    rcb->buf_len += CV_N_I1_SZ;

    /*
    ** Character Set
    */
    if ( GCD_global.charset_id  &&  ccb->tl.proto_lvl >= DAM_TL_PROTO_2 )
    {
	param.param_id = DAM_TL_CP_CHRSET_ID;
	CV2N_I1_MACRO( &param.param_id, &rcb->buf_ptr[rcb->buf_len], &status );
	rcb->buf_len += CV_N_I1_SZ;

	param.pl1 = 4;
	CV2N_I1_MACRO( &param.pl1, &rcb->buf_ptr[ rcb->buf_len ], &status );
	rcb->buf_len += CV_N_I1_SZ;

	CV2N_I4_MACRO( &GCD_global.charset_id,
			&rcb->buf_ptr[ rcb->buf_len ], &status );
	rcb->buf_len += CV_N_I4_SZ;
    }

    if ( GCD_global.charset  &&  *GCD_global.charset )
    {
	param.param_id = DAM_TL_CP_CHRSET;
	CV2N_I1_MACRO( &param.param_id, &rcb->buf_ptr[rcb->buf_len], &status );
	rcb->buf_len += CV_N_I1_SZ;

	param.pl1 = STlength( GCD_global.charset );
	CV2N_I1_MACRO( &param.pl1, &rcb->buf_ptr[ rcb->buf_len ], &status );
	rcb->buf_len += CV_N_I1_SZ;

	MEcopy( (PTR)GCD_global.charset, param.pl1,
		(PTR)&rcb->buf_ptr[ rcb->buf_len ] );
	rcb->buf_len += param.pl1;
    }

    /*
    ** Message Layer Info
    */
    if ( msg_len > 0  &&  msg_param )
    {
	/*
	** Send our MSG layer ID to identify the
	** parameters info to follow.
	*/
	if ( ccb->tl.proto_lvl >= DAM_TL_PROTO_2 )
	{
	    u_i4 ml_id = DAM_TL_DMML_ID;

	    param.param_id = DAM_TL_CP_MSG_ID;
	    CV2N_I1_MACRO(&param.param_id,&rcb->buf_ptr[rcb->buf_len],&status);
	    rcb->buf_len += CV_N_I1_SZ;

	    param.pl1 = 4;
	    CV2N_I1_MACRO( &param.pl1, &rcb->buf_ptr[ rcb->buf_len ], &status );
	    rcb->buf_len += CV_N_I1_SZ;

	    CV2N_I4_MACRO( &ml_id, &rcb->buf_ptr[ rcb->buf_len ], &status );
	    rcb->buf_len += CV_N_I4_SZ;
	}

	param.param_id = DAM_TL_CP_MSG;
	CV2N_I1_MACRO( &param.param_id, &rcb->buf_ptr[rcb->buf_len], &status );
	rcb->buf_len += CV_N_I1_SZ;

	if ( msg_len < 255 )
	{
	    param.pl1 = msg_len;
	    CV2N_I1_MACRO( &param.pl1, &rcb->buf_ptr[rcb->buf_len], &status );
	    rcb->buf_len += CV_N_I1_SZ;
	}
	else
	{
	    param.pl1 = 255;
	    CV2N_I1_MACRO( &param.pl1, &rcb->buf_ptr[rcb->buf_len], &status );
	    rcb->buf_len += CV_N_I1_SZ;

	    param.pl2 = msg_len;
	    CV2N_I2_MACRO( &param.pl1, &rcb->buf_ptr[rcb->buf_len], &status );
	    rcb->buf_len += CV_N_I2_SZ;
	}

	MEcopy( (PTR)msg_param, msg_len, (PTR)&rcb->buf_ptr[ rcb->buf_len ] );
	rcb->buf_len += msg_len;
    }

    return;
}