Esempio n. 1
0
void 
gcadm_resume( GCADM_RCB * rcb )
{
     STATUS status; 
    GCADM_SCB * scb=rcb->scb;
     
	if ( GCADM_global.gcadm_trace_level >= 4 )
	    TRdisplay( "%4d   GCADM resume: entry\n", scb->aid  );
	/*
	** resume GCA services 
	*/

	MEfill(sizeof(scb->parms.gca_all_parm), 0, &scb->parms.gca_all_parm);
	scb->parms.gca_all_parm.gca_assoc_id = scb->aid;
	scb->parms.gca_all_parm.gca_completion = gcadm_complete; 
	scb->parms.gca_all_parm.gca_closure = (PTR)rcb;

	gca_call( &scb->gca_cb, rcb->operation,
		    (GCA_PARMLIST *)&scb->parms,
		    GCA_ASYNC_FLAG | GCA_ALT_EXIT | GCA_RESUME,
		    (PTR)rcb, -1, &status);
		    
	  
	if ( status != OK )  
	{
	    if ( GCADM_global.gcadm_trace_level >= 1 )
		TRdisplay( "%4d   GCADM resume: disassociate error: 0x%x\n",
		       scb->aid, status );
	    if ( rcb ) 
		rcb->status = status; 
	}
	return; 
}
Esempio n. 2
0
STATUS
gcn_testaddr( char *target, i4  direct, char *username )
{
    GCA_RQ_PARMS	request;
    i4		count = 0;
    STATUS		status;
    STATUS		req_status;

    MEfill( sizeof( request ), '\0', (PTR)&request );
    request.gca_partner_name = target;
    request.gca_modifiers = direct ? GCA_NO_XLATE : 0;
    request.gca_user_name = username;

    gca_call( &gcn_gca_cb, GCA_REQUEST, (GCA_PARMLIST *)&request,
	      GCA_SYNC_FLAG, NULL, -1, &status );

    gcn_checkerr( "GCA_REQUEST", &status, 
	          request.gca_status, &request.gca_os_status );

    /*
    ** If we connected successfully, release the connection.
    */
    if ( status == OK )
	gcn_send( request.gca_assoc_id, GCA_RELEASE, 
		  (char *)&count, sizeof( count ), TRUE );

    /*
    ** Even failed GCA_REQUEST calls need to call GCA_DISASSOC.
    */
    gcn_release( request.gca_assoc_id );

    return( status );
}
Esempio n. 3
0
STATUS
gcn_recv( i4 assoc_id, char *buff, i4 buff_len, bool formatted,
          i4  *msg_type, i4 *msg_size, bool *eod, bool *eog )
{
    GCA_RV_PARMS	recv;
    STATUS		status;

    MEfill( sizeof( recv ), 0, (PTR)&recv );
    recv.gca_association_id = assoc_id;
    recv.gca_flow_type_indicator = GCA_NORMAL;
    recv.gca_modifiers = formatted ? GCA_FORMATTED : 0;
    recv.gca_buffer = buff;
    recv.gca_b_length = buff_len;

    gca_call( &gcn_gca_cb, GCA_RECEIVE, (GCA_PARMLIST *)&recv, 
	      GCA_SYNC_FLAG, NULL, GCN_RCV_TIMEOUT, &status );

    gcn_checkerr("GCA_RECEIVE", &status, recv.gca_status, &recv.gca_os_status);
    if ( status != OK )  return( status );

    *msg_type = recv.gca_message_type;
    *msg_size = recv.gca_d_length;
    *eod = recv.gca_end_of_data;
    *eog = recv.gca_end_of_group;

    return( OK );
}
Esempio n. 4
0
STATUS
gcn_fastselect( u_i4 oper_code, char *target )
{
    GCA_RQ_PARMS	request;
    i4	    	assoc_no;
    STATUS		status;
    STATUS		tmp_stat;

    MEfill( sizeof( request ), '\0', (PTR)&request );
    request.gca_partner_name = target;
    request.gca_modifiers = oper_code;

    gca_call( &gcn_gca_cb, GCA_REQUEST, (GCA_PARMLIST *)&request, 
	      GCA_SYNC_FLAG, NULL, (i4)(-1), &status );
    if ( status == OK )  status = request.gca_status;

    if ( status != E_GC0040_CS_OK )
    {
	gcn_checkerr( "GCA_REQUEST", &status, 
		      request.gca_status, &request.gca_os_status);
    }

    gcn_release( request.gca_assoc_id );

    return( status );
}
Esempio n. 5
0
STATUS
gcn_request( char *gcn_host, i4  *assoc_no, i4 *protocol )
{
    GCA_RQ_PARMS	request;
    STATUS		status = OK;
    char		tbuff[ GC_HOSTNAME_MAX + 12 ];
    char		*target;
    i4			len;

    /* 
    ** Prepare for GCA_REQUEST service call 
    */
    len = (gcn_host ? STlength( gcn_host ) + 2 : 0) + 10;
    target = (len <= sizeof( tbuff )) 
    	     ? tbuff : (char *)MEreqmem( 0, len, FALSE, NULL );

    if ( ! target )  return( E_GC0013_ASSFL_MEM );

    STprintf( target, "%s%s/IINMSVR", 
	      gcn_host ? gcn_host : "", gcn_host ? "::" : "" );

    MEfill( sizeof( request ), '\0', (PTR)&request );
    request.gca_peer_protocol = GCA_PROTOCOL_LEVEL_63;
    request.gca_partner_name = target;

    /* 
    ** Make GCA_REQUEST service call 
    */
    gca_call( &gcn_gca_cb, GCA_REQUEST, (GCA_PARMLIST *)&request,
	      GCA_SYNC_FLAG, NULL, GCN_RCV_TIMEOUT, &status );

    gcn_checkerr( "GCA_REQUEST", 
		  &status, request.gca_status, &request.gca_os_status );

    if ( status != OK )  goto done;

    if ( gcn_host  &&  request.gca_peer_protocol < GCA_PROTOCOL_LEVEL_50 )
    {
        gcn_release( request.gca_assoc_id );
	CL_CLEAR_ERR( &request.gca_os_status );
	gcn_checkerr( "GCA_REQUEST", 
		      &status, E_GC000A_INT_PROT_LVL, &request.gca_os_status );
	goto done;
    }

    *assoc_no = request.gca_assoc_id;
    *protocol = request.gca_peer_protocol;

  done :

    if ( target != tbuff )  MEfree( (PTR)target );
    return( status );
}
Esempio n. 6
0
STATUS
gcn_release( i4 assoc_no )
{
    GCA_DA_PARMS	disc;
    STATUS		status;

    MEfill( sizeof( disc ), '\0', (PTR)&disc );
    disc.gca_association_id = assoc_no;

    gca_call( &gcn_gca_cb, GCA_DISASSOC, (GCA_PARMLIST *)&disc,
	      GCA_SYNC_FLAG, NULL, -1, &status );

    gcn_checkerr("GCA_DISASSOC", &status, disc.gca_status, &disc.gca_os_status);

    return( status );
}
Esempio n. 7
0
STATUS
gcn_term( VOID )
{
    GCA_TE_PARMS	term;
    STATUS		status;

    /*
    ** Make GCA_TERMINATE call.
    */
    MEfill( sizeof( term ), 0, (PTR)&term );

    gca_call( &gcn_gca_cb, GCA_TERMINATE, (GCA_PARMLIST *)&term, 
	      GCA_SYNC_FLAG, NULL, -1, &status );

    gcn_checkerr( "GCA_TERMINATE",
		  &status, term.gca_status, &term.gca_os_status);

    return( status );
}
Esempio n. 8
0
STATUS
gcn_init( VOID )
{
    GCA_IN_PARMS	init;
    STATUS		status;

    MEfill( sizeof( init ), '\0', (PTR)&init );
    init.gca_modifiers = GCA_API_VERSION_SPECD;
    init.gca_api_version = GCA_API_LEVEL_5;
    init.gca_local_protocol = GCA_PROTOCOL_LEVEL_63;

    gca_call( &gcn_gca_cb, GCA_INITIATE, (GCA_PARMLIST *)&init, 
	      GCA_SYNC_FLAG, NULL, -1, &status );

    gcn_checkerr( "GCA_INITIATE",
		  &status, init.gca_status, &init.gca_os_status );

    return( status );
}
Esempio n. 9
0
STATUS
gcn_send( i4 assoc_id, 
	  i4  msg_type, char *msg_buf, i4 msg_size, bool eod )
{
    GCA_SD_PARMS	send;
    STATUS		status;

    MEfill( sizeof( send ), '\0', (PTR)&send );
    send.gca_association_id = assoc_id;
    send.gca_message_type = msg_type;
    send.gca_modifiers = GCA_FORMATTED;
    send.gca_buffer = msg_buf;
    send.gca_msg_length = msg_size;
    send.gca_end_of_data = eod;

    gca_call( &gcn_gca_cb, GCA_SEND, (GCA_PARMLIST *)&send,
	      GCA_SYNC_FLAG, NULL, -1, &status );

    gcn_checkerr( "GCA_SEND", &status, send.gca_status, &send.gca_os_status );

    return( status );
}
Esempio n. 10
0
void
gcadm_sm( GCADM_RCB *rcb )
{
           
    u_i1	i, action;
    GCADM_SCB   *scb = rcb->scb; 
    STATUS      status; 
    i4		save_aid;

    if ( scb->sequence >= ADMS_CNT  ||  rcb->event >= ADMI_CNT ) 
    {
	if ( GCADM_global.gcadm_trace_level >= 1 )
	    TRdisplay( "%4d   GCADM sm: invalid %d %d \n",
		    scb->aid, scb->sequence, rcb->event);
	scb->status = E_GC5005_INTERNAL_ERROR;  
	return;
    }


    gcadm_eval( rcb );

    if ( scb->sequence >= ADMS_CNT  ||  rcb->event >= ADMI_CNT  ||
	 smt[ scb->sequence ][ rcb->event ].next >= ADMS_CNT  ||
	 smt[ scb->sequence ][ rcb->event ].action >= ADMAS_CNT )
    {
	if ( GCADM_global.gcadm_trace_level >= 1 )
	    TRdisplay( "%4d   GCADM sm: invalid %d %d \n",
		    scb->aid, scb->sequence, rcb->event);
	gcadm_errlog ( E_GC5003_FSM_STATE );
	return;
    }

    if ( GCADM_global.gcadm_trace_level >= 4 )
	TRdisplay( "%4d   GCADM sm: entry\n",scb->aid ); 

    if ( GCADM_global.gcadm_trace_level >= 5 )
	TRdisplay( "%4d   GCADM sm: state %s event %s => %s\n", scb->aid, 
		   states[ scb->sequence ], events[ rcb->event ],
		   states[ smt[ scb->sequence ][ rcb->event ].next ] );

    action = smt[ scb->sequence ][ rcb->event ].action;

    /*
    ** Make the state transition now 
    */

    scb->sequence = smt[ scb->sequence ][ rcb->event ].next;
    save_aid = scb->aid; 

    for( i = 0; i < ADMA_MAX; i++ )
    {
	if ( GCADM_global.gcadm_trace_level >= 5  &&  
	     act_seq[action][i] != ADMA_NOOP )
	    TRdisplay( "%4d   GCADM sm: action %s, %p\n", save_aid, 
		       actions[ act_seq[ action ][ i ] ], rcb );


	switch( act_seq[ action ][ i ] )
	{
	case ADMA_NOOP :		/* Do nothing, end of action sequence */
	    i = ADMA_MAX;
	    break;
	
	case ADMA_SEND :		/* issue GCA_SEND request  */
	    MEfill(sizeof(scb->parms), 0, &scb->parms);
	
	    rcb->operation = GCA_SEND; 
	    scb->parms.gca_sd_parm.gca_message_type = scb->msg_type;
	    scb->parms.gca_sd_parm.gca_end_of_data = TRUE;
	    scb->parms.gca_sd_parm.gca_buffer = scb->buffer;
	    scb->parms.gca_sd_parm.gca_msg_length = scb->buf_len; 
	    scb->parms.gca_sd_parm.gca_association_id = scb->aid;
	    scb->parms.gca_sd_parm.gca_completion = gcadm_complete;
	    scb->parms.gca_sd_parm.gca_closure = (PTR)rcb;
	    if ( scb->msg_type == GCA_TUPLES )
		scb->parms.gca_sd_parm.gca_descriptor = (PTR)(&scb->tdesc_buf); 

	    gca_call( &scb->gca_cb, GCA_SEND,
		    (GCA_PARMLIST *)&scb->parms,
		    GCA_ASYNC_FLAG | GCA_ALT_EXIT,
		    (PTR)rcb, -1, &status);

	    if ( status != OK )  
	    {
		if ( GCADM_global.gcadm_trace_level >= 1 )
		    TRdisplay( "%4d   GCADM sm: send error: 0x%x\n",
		       save_aid, status );
		rcb->status = status; 
		rcb->event = ADMI_RQST_FAIL;
		gcadm_event ( rcb );
	    }
	    break;	

	case ADMA_RECV :		/* Issue GCA_RECEIVE request */
	    MEfill(sizeof(scb->parms), 0, &scb->parms);

	    rcb->operation = GCA_RECEIVE;	
	    scb->parms.gca_rv_parm.gca_buffer = scb->buffer;  
	    scb->parms.gca_rv_parm.gca_assoc_id = scb->aid;
	    scb->parms.gca_rv_parm.gca_b_length = GCADM_global.gcadm_buff_len;
	    scb->parms.gca_rv_parm.gca_flow_type_indicator = GCA_NORMAL;
	    scb->parms.gca_rv_parm.gca_completion = gcadm_complete; 
	    scb->parms.gca_rv_parm.gca_closure = (PTR)rcb; 
		    
	    gca_call( &scb->gca_cb, GCA_RECEIVE,
		    (GCA_PARMLIST *)&scb->parms,
		    GCA_ASYNC_FLAG | GCA_ALT_EXIT,
		    (PTR)rcb, -1, &status);
		    
	    if ( status != OK )  
	    {
		if ( GCADM_global.gcadm_trace_level >= 1 )
		    TRdisplay( "%4d   GCADM sm: receive error: 0x%x\n",
		       save_aid, status );
		rcb->status = status; 
		rcb->event = ADMI_RQST_FAIL;
		gcadm_event ( rcb );
	    }
	    break;

	case ADMA_DISA :		/* Issue GCA_DISASSOC request */
	    /*
	    ** Disassociate the client connection.
	    */
	    rcb->operation = GCA_DISASSOC; 
	    scb->admin_flag |= GCADM_DISC; 
	    MEfill(sizeof(scb->parms.gca_da_parm), 0, &scb->parms.gca_da_parm);
	    scb->parms.gca_da_parm.gca_association_id = scb->aid;
	    scb->parms.gca_da_parm.gca_completion = gcadm_complete; 
	    scb->parms.gca_da_parm.gca_closure = (PTR)rcb;

	    gca_call( &scb->gca_cb, GCA_DISASSOC,
			(GCA_PARMLIST *)&scb->parms.gca_da_parm,
			GCA_ASYNC_FLAG | GCA_ALT_EXIT,
			(PTR)rcb, -1, &status);
		    
	  
	    if ( status != OK )  
	    {
		if ( GCADM_global.gcadm_trace_level >= 1 )
		    TRdisplay( "%4d   GCADM sm: disassociate error: 0x%x\n",
			   save_aid, status );
		rcb->status = status; 
		rcb->event = ADMI_RQST_FAIL;
		gcadm_event ( rcb );
	    }
	    break; 

	case ADMA_ACPT :		/* build gca_accept msg  */

	    scb->msg_type = GCA_ACCEPT;
	    scb->buf_len  = 0;
	    break;  

	case ADMA_QUERY : 		/* process query */
				
	    {
		char   *q_data; 
		i4     lang_id, q_modifier, gca_type, gca_prec;

		/* parse received data to get query text */
		/* save query len and text in scb       */
		q_data = (char *) scb->parms.gca_rv_parm.gca_data_area;
		q_data += GCA_GETI4_MACRO( q_data, &lang_id );
		q_data += GCA_GETI4_MACRO( q_data, &q_modifier );
		q_data += GCA_GETI4_MACRO( q_data, &gca_type );
		q_data += GCA_GETI4_MACRO( q_data, &gca_prec );

		if ( gca_type == DB_QTXT_TYPE)  
		{	 
		    if ( q_modifier & GCA_COMP_MASK )
        		scb->admin_flag |= GCADM_COMP_MASK;
		    q_data += GCA_GETI4_MACRO( q_data, &scb->buf_len );
		    q_data += GCA_GETBUF_MACRO( q_data, scb->buf_len, 
						scb->buffer );
		    scb->status = OK;
		}
		break;  
	    }	

	case ADMA_TUPL :		/* build GCA_TUPLES msg  */
	    {
	    GCADM_RSLT *rslt;
	    i4 	fill_len, zero=0;
	    i2 	i2_len;
	    GCA_TU_DATA *tu_data;

	    rslt = (GCADM_RSLT *) scb->rsltlst_entry;
	    scb->rsltlst_entry = (GCADM_RSLT *) rslt->rslt_q.q_next;

	    scb->msg_type = GCA_TUPLES; 

	    tu_data = (GCA_TU_DATA *)scb->buffer;
	    if ( scb->admin_flag & GCADM_COMP_MASK )
		scb->buf_len = rslt->rslt_len +2 ;
	    else 
		scb->buf_len = scb->row_len; 

	    i2_len = (i2)rslt->rslt_len; 
	    tu_data += GCA_PUTI2_MACRO( &i2_len, tu_data);

	    tu_data += GCA_PUTBUF_MACRO( rslt->rslt_text, rslt->rslt_len, 
					tu_data);
	    if ( ! ( scb->admin_flag & GCADM_COMP_MASK ))
	    {
		fill_len = scb->row_len - rslt->rslt_len;
		MEfill ( fill_len, 0, tu_data );
	    }

	    scb->row_count++;
	    break; 
	    }


	case ADMA_RESP :		/* build gca_response msg  */

	    scb->msg_type = GCA_RESPONSE;
	    scb->buf_len  = gcadm_format_re_data( scb );
	    break;  

	case ADMA_RLSE :		/* build gca_relese msg   */

	    scb->msg_type = GCA_RELEASE;
	    scb->buf_len  = gcadm_format_err_data 
			( scb->buffer, NULL, scb->status, 0, NULL );
	    break;

	case ADMA_CALLBACK : 		/* request result call back 	*/
	{
	    GCADM_RQST_PARMS rqst_parms; 
	    GCADM_CMPL_PARMS cmpl_parms; 

	    scb->admin_flag |= GCADM_CALLBACK;

	    if ( scb->rqst_cb )
	    {
		GCADM_RQST_FUNC	rqst_cb = scb->rqst_cb;

		rqst_parms.gcadm_scb = (PTR)scb;	
		rqst_parms.rqst_cb_parms = scb->rqst_cb_parms;
		rqst_parms.length = scb->buf_len;
		rqst_parms.request = scb->buffer;
		rqst_parms.sess_status = scb->status;
		scb->rqst_cb = NULL;
		(rqst_cb)( &rqst_parms ); 
	    }
	    else  if ( scb->rslt_cb )
	    {	
		GCADM_CMPL_FUNC	rslt_cb = scb->rslt_cb;

		cmpl_parms.gcadm_scb = (PTR)scb;	
		cmpl_parms.rslt_cb_parms = scb->rslt_cb_parms;
		cmpl_parms.rslt_status = scb->status;
		scb->rslt_cb = NULL;
		(rslt_cb)( &cmpl_parms ); 
	    }
	    break;  
	}
		
	case ADMA_FAIL : 		/* set failed status  	*/
				
		if ( rcb->status )
		    scb->status = rcb->status; 
		else
		    scb->status = FAIL; 

		break;  

	case ADMA_BAD_STAT :		/* set status error  */

		scb->status = E_GC5008_INVALID_MSG_STATE;
		break;

		
	case ADMA_FREE_RCB :		/* Free RCB */
		gcadm_free_rcb( rcb  );   
		rcb = NULL; 
		break;

	case ADMA_FREE :		/* Free SCB */
		gcadm_free_rcb( rcb  );   
		gcadm_free_scb( scb  );   
		rcb = NULL; 
		scb = NULL; 
		break;
	
	}	
    }

    return;
}
Esempio n. 11
0
STATUS
gcn_bedcheck( VOID )
{
    GCA_FS_PARMS	fast;
    STATUS		status;
    CL_ERR_DESC		sys_err;
    char		gcn_addr[ GCA_SERVER_ID_LNG + 1 ];
    static char		msg_buff[ GCA_FS_MAX_DATA ];
    char		obj_buffer [ 32 ]; 
    char		*p, *var;
    i4			len, server_flags;
    char		gca_partner_name[] = "/IINMSVR";
 
    /*
    ** We can bail out early if Name Server
    ** ID has not been globally registered.
    */
    status = GCnsid( GC_FIND_NSID, gcn_addr, sizeof( gcn_addr ), &sys_err );
    if ( status == GC_NM_SRVR_ID_ERR )  return( E_GC0126_GCN_NO_GCN );

    /* 
    ** Roll up GCM_GET message.
    */
    p = msg_buff;		/* point to start of message data */
    p += sizeof( i4 );          /* bump past error_status */
    p += sizeof( i4 );          /* bump past error_index */
    p += sizeof( i4 );          /* bump past future[0] */
    p += sizeof( i4 );          /* bump past future[1] */
    p += gcm_put_int( p, -1 );  /* set client_perms */
    p += gcm_put_int( p, 1 );   /* set row_count */
    p += gcm_put_int( p, 1 );   /* set element_count */
    p += gcm_put_str( p, GCA_MIB_CLIENT_FLAGS );	/* classid */
    p += gcm_put_str( p, "" );		/* instance */
    p += gcm_put_str( p, "" );		/* value */
    p += gcm_put_int( p, 0 );		/* perms */

    /* 
    ** Issue GCA_FASTSELECT.
    */
    MEfill( sizeof( fast ), '\0', (PTR)&fast );
    fast.gca_partner_name = gca_partner_name;
    fast.gca_modifiers = GCA_RQ_GCM;
    fast.gca_peer_protocol = GCA_PROTOCOL_LEVEL_62;
    fast.gca_buffer = msg_buff;
    fast.gca_b_length = sizeof( msg_buff );
    fast.gca_message_type = GCM_GETNEXT;
    fast.gca_msg_length = p - msg_buff;

    gca_call( &gcn_gca_cb, GCA_FASTSELECT, (GCA_PARMLIST *)&fast, 
	      GCA_SYNC_FLAG, NULL, -1, &status );

    if ( status == OK  &&  fast.gca_status != OK )  status = fast.gca_status;

    /* 
    ** If we can't probe it, we'll just 
    ** have to assume it is a GCN. 
    */
    if ( status == E_GC003F_PM_NOPERM )  
	status = OK;
    else  if ( status == OK )
    {
	/* 
	** Unroll GCM msg.
	*/
        p = msg_buff;
        p += gcm_get_int( p, &status );

        /* 
        ** if GCM GET succeeded, test server flags.
        */
        if ( status == OK )
        {
	    p += sizeof( i4 );		/* bump past element_count */
	    p += sizeof( i4 );		/* bump past error_index */
	    p += sizeof( i4 );		/* bump past future[0] */
	    p += sizeof( i4 );		/* bump past future[1] */
	    p += sizeof( i4 );		/* bump past client_perms */
	    p += sizeof( i4 );		/* bump past row_count */
            p += gcm_get_str( p, &var, &len );  /* skip classid */
            p += gcm_get_str( p, &var, &len );  /* skip instance */
            p += gcm_get_str( p, &var, &len );  /* get value */
            MEcopy( var, len, obj_buffer );
            obj_buffer[ len ] = '\0';
            CVan( obj_buffer,  &server_flags );

	    if ( ! (server_flags & GCA_RG_IINMSVR) )
    	        status = E_GC0126_GCN_NO_GCN;
        }
    }
 
    return( status );
}