/**************************************************************************** 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); }
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; }