Пример #1
0
/****************************************************************************
Desc:
****************************************************************************/
RCODE F_Db::maintBlockChainFree(
	FLMUINT64		ui64MaintRowId,
	FLMUINT			uiStartBlkAddr,
	FLMUINT 			uiBlocksToFree,
	FLMUINT			uiExpectedEndBlkAddr,
	FLMUINT *		puiBlocksFreed)
{
	RCODE			rc = NE_SFLM_OK;
	FLMUINT		uiBlocksFreed = 0;
	FLMUINT		uiEndBlkAddr = 0;
	F_Row *		pRow = NULL;
	FLMUINT		uiRflToken = 0;

	// Make sure an update transaction is going and that a
	// non-zero number of blocks was specified

	if( getTransType() != SFLM_UPDATE_TRANS || !uiBlocksToFree)
	{
		rc = RC_SET_AND_ASSERT( NE_SFLM_ILLEGAL_OP);
		goto Exit;
	}

	m_pDatabase->m_pRfl->disableLogging( &uiRflToken);
	
	if( RC_BAD( rc = btFreeBlockChain( 
		this, NULL, uiStartBlkAddr, uiBlocksToFree, 
		&uiBlocksFreed, &uiEndBlkAddr, NULL)))
	{
		goto Exit;
	}

	flmAssert( uiBlocksFreed <= uiBlocksToFree);

	if (!uiEndBlkAddr)
	{
		if (RC_BAD( rc = deleteRow( SFLM_TBLNUM_BLOCK_CHAINS, ui64MaintRowId,
									FALSE)))
		{
			goto Exit;
		}
	}
	else
	{
		if (RC_BAD( rc = gv_SFlmSysData.pRowCacheMgr->retrieveRow( this,
										SFLM_TBLNUM_BLOCK_CHAINS, ui64MaintRowId,
										&pRow)))
		{
			goto Exit;
		}
		if (RC_BAD( rc = pRow->setUINT( this,
					SFLM_COLNUM_BLOCK_CHAINS_BLOCK_ADDRESS, uiEndBlkAddr)))
		{
			goto Exit;
		}
	}

	if (uiExpectedEndBlkAddr)
	{
		if (uiBlocksToFree != uiBlocksFreed ||
			 uiEndBlkAddr != uiExpectedEndBlkAddr)
		{
			rc = RC_SET_AND_ASSERT( NE_SFLM_DATA_ERROR);
			goto Exit;
		}
	}

	if (uiRflToken)
	{
		m_pDatabase->m_pRfl->enableLogging( &uiRflToken);
	}
	
	if( RC_BAD( rc = m_pDatabase->m_pRfl->logBlockChainFree( 
		this, ui64MaintRowId, uiStartBlkAddr, uiEndBlkAddr, uiBlocksFreed)))
	{
		goto Exit;
	}

	if (puiBlocksFreed)
	{
		*puiBlocksFreed = uiBlocksFreed;
	}

Exit:

	if (uiRflToken)
	{
		m_pDatabase->m_pRfl->enableLogging( &uiRflToken);
	}
	
	if (pRow)
	{
		pRow->ReleaseRow();
	}

	return( rc);
}
Пример #2
0
int procReq( unsigned char *ReqBuf, int ReqLen, int RspSock )
{
    struct application    req_stru;
    char                  tmp_buf[BUFFSIZE];
    unsigned char         tmp_mac[16+1];

    /* 
     * 将收到的8583包解到请求结构req_stru中
     */
    memset(&req_stru, 0, sizeof(req_stru));
    if ( unpack8583( &req_stru, ReqBuf, ReqLen ) == INVALID_PACK )
    {
        ErrorLog(ERROR, "invalid pack or get channel fail");
        return FAIL;
    }

    /*
     * 获取交易类型定义 
     */
    if ( getTransType(&req_stru) != SUCC )
    {
        ErrorLog(TRACE,"获取交易类型定义失败!!");
        strcpy( req_stru.return_code, ERR_NOT_SUPPORTED );
        rspError(&req_stru, RspSock);

        DispMoni( &req_stru, NULL );
        WebDispMoni( &req_stru, NULL, gszWebIp, gnWebPort );

        return FAIL;
    }

    /* 
     * 获取终端对应信息 (包括密钥等信息)
     */
    if ( getTermInfo(&req_stru) != SUCC )
    {
        ErrorLog(TRACE,"获取终端对应信息失败!!");
        strcpy( req_stru.return_code, ERR_INVALID_TERM );
        rspError(&req_stru, RspSock);

        DispMoni( &req_stru, NULL );
        WebDispMoni( &req_stru, NULL, gszWebIp, gnWebPort );

        return FAIL;
    }

    /*
     * 检查报文MAC,签到、结算、批上送、参数下载、等交易不检查
     */
    if( req_stru.trans_type != LOGIN  && req_stru.trans_type != LOGOUT && 
        req_stru.trans_type != SETTLE && req_stru.trans_type != SETTLE2 && 
        req_stru.trans_type != BATCHUP && req_stru.trans_type != DOWNLOAD )
    {
        ErrorLog(TRACE,"开始校验MAC...");
        /* 计算报文MAC */
        memset(tmp_mac, 0, sizeof(tmp_mac));
        if( SUCC != unionpay_calc_mac( ReqBuf+11, ReqLen-11-8,
                                       req_stru.MacKey, tmp_mac ) )
        {
            ErrorLog(TRACE,"校验MAC失败!");
            strcpy( req_stru.return_code, ERR_MAC );
            rspError(&req_stru, RspSock);

            return FAIL;
        }

        /* 比较计算结果和上送MAC */
        if ( memcmp( tmp_mac, req_stru.mac, 8 ) != 0 )
        {
            ErrorLog(TRACE,"校验MAC失败!");
            strcpy( req_stru.return_code, ERR_MAC );
            rspError(&req_stru, RspSock);

            memset(tmp_buf, 0, sizeof(tmp_buf) );
            sprintf( tmp_buf, "[%s]POSP数据包MAC校验错,怀疑非法攻击!",
                     req_stru.terminal_id );
            SendWarningMsg( TENPAY_ERR_MAC, tmp_buf, gszWarnIp, gnWarnPort );

            DispMoni( &req_stru, NULL );
            WebDispMoni( &req_stru, NULL, gszWebIp, gnWebPort );

            return FAIL;
        }
    }

    /*
     * 用进程号作为消息类型将请求结构发送到路由进程skernel
     */
    req_stru.source_msgtype = getpid();
    if( SUCC != SendRoute(req_stru.source_msgtype, &req_stru) )
    {
        ErrorLog(ERROR, "send to skernel error");
        strcpy(req_stru.return_code, ERR_SYSTEM_ERROR);
        rspError(&req_stru, RspSock);

        DispMoni( &req_stru, NULL );
        WebDispMoni( &req_stru, NULL, gszWebIp, gnWebPort );

        return FAIL;
    }

    ErrorLog(TRACE, "SendRouter OK...................");

    return SUCC;
}