Exemple #1
0
int util_logfile_test(int argc, char *argv[])
{
    CLogFile logfile;

    logfile.InitLogFile(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4]);


    for (int i =0 ; i <  atoi(argv[5]); ++i)
    {
        struct tm stTm;
        time_t tNow = time(NULL);
        localtime_r(&tNow, &stTm);

        char strTime[128];
        strftime(strTime, sizeof(strTime), "%Y%m%d %T", &stTm);

        char str [4096];
        snprintf(str,sizeof(str),"%s (%s:%d [%s]): %s\n", strTime, basename(__FILE__),__LINE__,__FUNCTION__, "lalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
        logfile.Write(str, strlen(str));
        sleep(1);
    }
    
    logfile.Close();
    
    return 0;
}
Exemple #2
0
void TestLogFile()
{

    CLogFile LogFile;
    Assert(!LogFile.IsOpen());
    Assert(!LogLine(LogFile, LE_INFOLOW,  "InfoLow"));

    const char* LogfileName = "./Test.log";
    DeleteFile(LogfileName);
    time_t CreationTime = time(NULL);
    Assert(LogFile.Open(LogfileName));
    LogFile.MarkCurrentTimeAsCreationTime();

    time_t FileCreationTime = LogFile.GetCreationTime();
    Assert(FileCreationTime == CreationTime);

    Assert(LogFile.GetFileSize() == 0);

    Assert(LogLine(LogFile, LE_INFOLOW,  "InfoLow"));
    Assert(LogLine(LogFile, LE_INFO,     "Info"));
    Assert(LogLine(LogFile, LE_INFOHIGH, "InfoHigh"));
    Assert(LogLine(LogFile, LE_NOTICE,   "Notice"));
    Assert(LogLine(LogFile, LE_WARNING,  "Warning"));
    Assert(LogLine(LogFile, LE_ERROR,    "Error"));
    DWORD Size = LogFile.GetFileSize();
    Assert(Size > 0);
    Assert(LogLine(LogFile, LE_FATAL,    "Fatal"));
    LogFile.Flush();
    DWORD Size2 = LogFile.GetFileSize();
    Assert(Size2 > Size);

    Assert(LogFile.IsOpen());
    LogFile.Close();
    Assert(!LogFile.IsOpen());
    Assert(LogFile.Open("./Test.log"));
    Assert(LogLine(LogFile, LE_INFOLOW,  "InfoLow"));

    Sleep(2000);
    FileCreationTime = LogFile.GetCreationTime();
    Assert(FileCreationTime == CreationTime);
}
int main(int argc,char *argv[])
{
   int rtn;
   openlog("yktbu",LOG_PID|LOG_CONS|LOG_NDELAY,LOG_LOCAL0);
   g_pSvrLink = BUPubInitialize(g_XBDefines,CallBDFunc,WriteAppInfo,&g_LogFile);
   SetLogShowLevel(0);   
   sprintf(g_szVerNo,"%s %s (%s)",argv[0],YKT_VERSION,__DATE__);
   if(argc==2)
   {
	   if(strncmp(argv[1],"-v",2)==0||strncmp(argv[1],"-V",2)==0)
	   {
		  printf("%s\n",g_szVerNo);
		  closelog();
		  return 0;
	   }
   }
   if (argc<2)
      ReadIni("ksbu.ini");
   else
      ReadIni(argv[1]);

   ResetBPFunctions();
   if (argc>2)
   {
      ListBPFunctions(argv[2]);
   }

   // 初始化数据库连接:
   SQLInitialize();
   if (SQLConnectToServer()!=0)
   {
      DEBUG_RUNTIME_MSGOUT("不能正常建立数据库连接, 检查配置和数据库服务器!\n");
      return(-100);
   }
	 DEBUG_RUNTIME_MSGOUT("连接数据库成功!\n");
   CAccTrans& ats=CAccTrans::GetInst();
   if(ats.LoadCfg()!=0)
   {
	 	
			DEBUG_RUNTIME_MSGOUT("加载系统参数失败!\n");
	   //RAISE_RUNTIME_ERROR("加载数据库账务配置参数失败!\n");
			return(-200);
   }
	 DEBUG_RUNTIME_MSGOUT("加载系统参数成功!\n");
   // 初始化与BCC连接:
   do 
   {
      rtn = g_pSvrLink->ToLink(&g_BUnit);
      if (rtn==1)
      {
         DEBUG_RUNTIME_MSGOUT("与业务调度中心(BCC)的连接成功!\n");
         break;
      }
      else if (rtn==-100)
      {
         DEBUG_RUNTIME_MSGOUT("估计业务调度中心(BCC)尚未正式启动,或者检查配置中的[SERVER]项参数\n");
         mysleep(g_BUnit.iHBInterval);
      }
      else
      {
         // 应该属于故障,或对方并不是BCC
         return(rtn);
      }
   } while (1);
#ifdef WIN32
   setnoblockgetch();
#endif

   while (g_pSvrLink->LinkOK())
   {
#ifdef WIN32
      switch (mygetch())
      {
      case '?':
      case 'h':
      case 'H':
         printf("\nCommand List:\n");
         printf("\t ? or h: display this Help informations!\n");
         printf("\t x: To eXit this business unit.\n");
         printf("\t d: Display functions status.\n");
         printf("\t l: List functions status into <function.lst>.\n");
         printf("Enter command to select:");
         break;
      case 'x':
      case 'X':
         g_pSvrLink->bExit = true;
         continue;
         break;
      case 'd':
      case 'D':
         ListBPFunctions(NULL);
         break;
      case 'l':
      case 'L':
         ListBPFunctions("function.lst");
         break;
      }
#endif
      if (!SQLIsConnectOK())
      {
         mysleep(1000);
         if (!g_pSvrLink->CheckLink()) 
            break;  // BCC exit (可能用户发现数据库连接断开,需要维护系统,导致手工将BCC退出同时也需要BU退出)
         if (SQLConnectToServer()!=0)
         {
            // SQL Link error:
            DEBUG_RUNTIME_MSGOUT("不能正常建立数据库连接, 检查配置和数据库服务器!\n");
         }
         else
         {
            DEBUG_RUNTIME_MSGOUT("与数据库连接成功!\n");
         }
         continue;
      }
      else 
         g_pSvrLink->Processing(&g_BUnit);
      if (g_pSvrLink->bExit) break;
   }


/* ****** Updated by CHENYH at 2004-4-14 11:07:19 ****** 
   经过测试后,CheckLink()工作正常,测试环境为:BCC(WIN)+BU(WIN),BCC(LINUX)+BU(WIN),BCC(LINUX)+BU(LINUX)
   while (1)
   {
      mysleep(1000);
      if (!g_SvrLink.CheckLink())
      {
         printf("TEST CHECK LINK return <false>!\n");
         break;
      }
   }
*/
   g_pSvrLink->Close();
   SQLExit();
   DEBUG_RUNTIME_MSGOUT("业务处理单元BU系统正常退出!\n");
   g_LogFile.Close();
   closelog();
   return(0);
}
Exemple #4
0
int main(int argc,char *argv[])
{
   int rtn;
   openlog("yktbank",LOG_PID|LOG_CONS|LOG_NDELAY,LOG_LOCAL3);
   g_pSvrLink = BUPubInitialize(g_XBDefines,CallBDFunc,WriteAppInfo,&g_LogFile);
   SetLogShowLevel(0);   
   if (argc<2)
      ReadIni("ksbu.ini");
   else
      ReadIni(argv[1]);

   ResetBPFunctions();
   if (argc>2)
   {
      ListBPFunctions(argv[2]);
   }

   // 初始化与BCC连接:
   do 
   {
      rtn = g_pSvrLink->ToLink(&g_BUnit);
      if (rtn==1)
      {
         //DEBUG_RUNTIME_MSGOUT("与业务调度中心(BCC)的连接成功!\n");
         break;
      }
      else if (rtn==-100)
      {
         //DEBUG_RUNTIME_MSGOUT("估计业务调度中心(BCC)尚未正式启动,或者检查配置中的[SERVER]项参数\n");
         //mysleep(g_BUnit.iHBInterval);
	sleep(10);
      }
      else
      {
         // 应该属于故障,或对方并不是BCC
         return(rtn);
      }
   } while (1);
#ifdef WIN32
   setnoblockgetch();
#endif

	key_t key;
	struct shmid_ds buf;


// Update by lq at 2005-03-10
// 将创建共享内存和设备签到移到bankguard中去
// 必须先运行bankguard此处操作才能完成

	key=ftok("bankguard",9);
	shmid=shmget(key,SEGSIZE,0666);
	if(-1==shmid)
	{
		printf("errno=%s\n",strerror(errno));
		return 	100021;	
	}
	shm=(char*)shmat(shmid,0,0);
	if((int)shm==-1)
	{
		return 	100515;	
	}
	semid=semget(key,1,0);
	if(semid==-1)
	{
		return 100515;
	}
	
   while (g_pSvrLink->LinkOK())
   {
#ifdef WIN32
      switch (mygetch())
      {
      case '?':
      case 'h':
      case 'H':
         printf("\nCommand List:\n");
         printf("\t ? or h: display this Help informations!\n");
         printf("\t x: To eXit this business unit.\n");
         printf("\t d: Display functions status.\n");
         printf("\t l: List functions status into <function.lst>.\n");
         printf("Enter command to select:");
         break;
      case 'x':
      case 'X':
         g_pSvrLink->bExit = true;
         continue;
         break;
      case 'd':
      case 'D':
         ListBPFunctions(NULL);
         break;
      case 'l':
      case 'L':
         ListBPFunctions("function.lst");
         break;
      }
#endif
      g_pSvrLink->Processing(&g_BUnit);
      if (g_pSvrLink->bExit) break;
   }
   g_pSvrLink->Close();
   //SQLExit();
   //DEBUG_RUNTIME_MSGOUT("业务处理单元BU系统正常退出!\n");
   g_LogFile.Close();
   closelog();
   return(0);
}
int main(int argc,char *argv[])
{
    int rtn;
    openlog("buencsvr",LOG_PID|LOG_CONS|LOG_NDELAY,LOG_LOCAL0);
    g_pSvrLink = BUPubInitialize(g_XBDefines,CallBDFunc,WriteAppInfo,&g_LogFile);
    SetLogShowLevel(0);   
    sprintf(g_szVerNo,"%s %s (%s)",argv[0],YKT_VERSION,__DATE__);
    if(argc==2)
    {
        if(strncmp(argv[1],"-v",2)==0||strncmp(argv[1],"-V",2)==0)
        {
            printf("%s\n",g_szVerNo);
            closelog();
            return 0;
        }
    }
    BKConfiguration::instance()->load_config();
    
    if (argc<2)
        ReadIni("ksbu.ini");
    else
        ReadIni(argv[1]);

    ResetBPFunctions();
    if (argc>2)
    {
        ListBPFunctions(argv[2]);
    }

    

    DEBUG_RUNTIME_MSGOUT("加载系统参数成功!\n");
    // 初始化与BCC连接:
    do 
    {
        rtn = g_pSvrLink->ToLink(&g_BUnit);
        if (rtn==1)
        {
            DEBUG_RUNTIME_MSGOUT("与业务调度中心(BCC)的连接成功!\n");
            break;
        }
        else if (rtn==-100)
        {
            DEBUG_RUNTIME_MSGOUT("估计业务调度中心(BCC)尚未正式启动,或者检查配置中的[SERVER]项参数\n");
            mysleep(g_BUnit.iHBInterval);
        }
        else
        {
            // 应该属于故障,或对方并不是BCC
            return(rtn);
        }
    } while (1);
#ifdef WIN32
    setnoblockgetch();
#endif

    while (g_pSvrLink->LinkOK())
    {
#ifdef WIN32
        switch (mygetch())
        {
        case '?':
        case 'h':
        case 'H':
            printf("\nCommand List:\n");
            printf("\t ? or h: display this Help informations!\n");
            printf("\t x: To eXit this business unit.\n");
            printf("\t d: Display functions status.\n");
            printf("\t l: List functions status into <function.lst>.\n");
            printf("Enter command to select:");
            break;
        case 'x':
        case 'X':
            g_pSvrLink->bExit = true;
            continue;
            break;
        case 'd':
        case 'D':
            ListBPFunctions(NULL);
            break;
        case 'l':
        case 'L':
            ListBPFunctions("function.lst");
            break;
        }
#endif
        g_pSvrLink->Processing(&g_BUnit);
        if (g_pSvrLink->bExit) break;
    }

    g_pSvrLink->Close();
    DEBUG_RUNTIME_MSGOUT("业务处理单元BU系统正常退出!\n");
    g_LogFile.Close();
    closelog();
    return(0);
}
Exemple #6
0
int main(int argc,char *argv[])
{
	int rtn;
	int ret=0;
	openlog("yktbank",LOG_PID|LOG_CONS|LOG_NDELAY,LOG_LOCAL3);
	g_pSvrLink = BUPubInitialize(g_XBDefines,CallBDFunc,WriteAppInfo,&g_LogFile);
	SetLogShowLevel(0);
	if (argc<2)      ReadIni("ksbu.ini");
	else		     ReadIni(argv[1]);

	struct sigaction act,oldact;
	act.sa_handler = handler_alarm;
	if(-1==sigaction(SIGALRM,&act,&oldact))
	{
		writelog(LOG_ERR,"sigaction error,errcode=[%d]",-1);
		return -1;
	}


	ret=ReadIni_bank(&g_Bank);
	if(ret)
	{
		writelog(LOG_ERR,"ReadIni_bank error,errcode=[%d]",ret);
		return -1;
	}

	ResetBPFunctions();
	if (argc>2)
	{
	  ListBPFunctions(argv[2]);
	}

	// 初始化数据库连接:
	/*
	SQLInitialize();
	if (SQLConnectToServer()!=0)
	{
	  RAISE_RUNTIME_ERROR("不能正常建立数据库连接, 检查配置和数据库服务器!\n");
	  return(-100);
	}
	*/
	// 初始化与BCC连接:
	do 
	{
		rtn = g_pSvrLink->ToLink(&g_BUnit);
		if (rtn==1)
		{
			 DEBUG_RUNTIME_MSGOUT("与业务调度中心(BCC)的连接成功!\n");
			 break;
		}
		else if (rtn==-100)
		{
			 DEBUG_RUNTIME_MSGOUT("估计业务调度中心(BCC)尚未正式启动,或者检查配置中的[SERVER]项参数\n");
			 mysleep(g_BUnit.iHBInterval);
		}
		else
		{
			 // 应该属于故障,或对方并不是BCC
			  DEBUG_RUNTIME_MSGOUT("未知错误\n");
			 return(rtn);
		}
	} while (1);
#ifdef WIN32
   setnoblockgetch();
#endif

/**********************************************************************
 Added by hhd at 2004-09-16
 为了增加签到处理,达到共享内存的处理
 增加共享内存和信号量
 共享内存一共1024个字节,其中使用前18个字节
 shm[0]:代表是否进行过签到的标志,如果为1,已经签过到但不知道是否成功
 		,后续业务将不能进行签到处理,如果为其他值,系统将进行签到
 shm[1]:代表签到是否成功的标志,如果为1,则标识签到成功,后续16个字节为
 		银行正常返回数据,可以使用
 shm[2~17]:前8个字节为加密的PIN密钥,后8个字节为加密的MAC密钥
***********************************************************************/
/**********************************************************************
 Update by hhd at 2004-10-27
 为了增加签到处理,达到共享内存的处理
 增加共享内存和信号量
 为了反映每个终端的当前工作状态,在共享内存中设置一个状态标志
 共享内存一共1024个字节,其中使用前26个字节
 shm[0]:代表是否进行过签到的标志,如果为1,已经签过到但不知道是否成功
 		,后续业务将不能进行签到处理,如果为其他值,系统将进行签到
 shm[1]:代表签到是否成功的标志,如果为1,则标识签到成功,后续16个字节为
 		银行正常返回数据,可以使用
 shm[2]:代表系统重新启动标志,如果不为1,系统进行初始化操作(进行设备
 		注册表中设备的状态的清空操作),然后系统将改标志置为1,其他BU启动
 		跳过该项操作
 shm[10~25]:前8个字节为加密的PIN密钥,后8个字节为加密的MAC密钥
***********************************************************************/
/*
	key_t key;
	struct shmid_ds buf;


// Update by lq at 2005-03-10
// 将创建共享内存和设备签到移到bankguard中去
// 必须先运行bankguard此处操作才能完成

	key=ftok("bankguard",9);
	shmid=shmget(key,SEGSIZE,0666);
	if(-1==shmid)
	{
		printf("errno=%s\n",strerror(errno));
		DEBUG_RUNTIME_MSGOUT("获取共享内存失败,请确保bankguard已经启动\n");
		return 	E_CREATE_SHARE_MEMORY;	
	}
	shm=(char*)shmat(shmid,0,0);
	if((int)shm==-1)
	{
		DEBUG_RUNTIME_MSGOUT("映射共享内存失败");
		return 	E_JOIN_SHARE_MEMORY;	
	}
	semid=semget(key,1,0);
	if(semid==-1)
	{
		DEBUG_RUNTIME_MSGOUT("获取共享锁id失败");
		return E_JOIN_SHARE_MEMORY;
	}
	*/
// Added by hhd end here
   while (g_pSvrLink->LinkOK())
   {
#ifdef WIN32
      switch (mygetch())
      {
      case '?':
      case 'h':
      case 'H':
         printf("\nCommand List:\n");
         printf("\t ? or h: display this Help informations!\n");
         printf("\t x: To eXit this business unit.\n");
         printf("\t d: Display functions status.\n");
         printf("\t l: List functions status into <function.lst>.\n");
         printf("Enter command to select:");
         break;
      case 'x':
      case 'X':
         g_pSvrLink->bExit = true;
         continue;
         break;
      case 'd':
      case 'D':
         ListBPFunctions(NULL);
         break;
      case 'l':
      case 'L':
         ListBPFunctions("function.lst");
         break;
      }
#endif
     // if (!SQLIsConnectOK())
     if(0)
      {
         mysleep(1000);
         if (!g_pSvrLink->CheckLink()) 
            break;  // BCC exit (可能用户发现数据库连接断开,需要维护系统,导致手工将BCC退出同时也需要BU退出)
         //if (SQLConnectToServer()!=0)
	if(0)
         {
            // SQL Link error:
            DEBUG_RUNTIME_MSGOUT("不能正常建立数据库连接, 检查配置和数据库服务器!\n");
         }
         else
         {
            DEBUG_RUNTIME_MSGOUT("与数据库连接成功!\n");
         }
         continue;
      }
      else 
      {   
  	//DEBUG_RUNTIME_MSGOUT("处理bu业务!\n");
         g_pSvrLink->Processing(&g_BUnit);
      }
      //if (g_pSvrLink->bExit) break;
   }


/* ****** Updated by CHENYH at 2004-4-14 11:07:19 ****** 
   经过测试后,CheckLink()工作正常,测试环境为:BCC(WIN)+BU(WIN),BCC(LINUX)+BU(WIN),BCC(LINUX)+BU(LINUX)
   while (1)
   {
      mysleep(1000);
      if (!g_SvrLink.CheckLink())
      {
         printf("TEST CHECK LINK return <false>!\n");
         break;
      }
   }
*/
/*
	shmdt(shm);
	shmctl(shmid,IPC_RMID,&buf);
	d_sem(semid);
*/
	g_pSvrLink->Close();
	// SQLExit();
	DEBUG_RUNTIME_MSGOUT("业务处理单元BU系统正常退出!\n");
	g_LogFile.Close();
	closelog();
	return(0);
}
void TestLogFileMultipleReadsAfterOpens(void)
{
	CLogFile*		pcLogFile;
	CDiskFile*		pcDiskFile;
	CFileBasic		cFile;
	CFileUtil		cFileUtil;
	char			szSource[] = {"The Name of the Wise Man"};
	int				iSourcelen;
	char			szResult[50];
	char			szWrite[] = {"Cat Catt ct... "};
	int				iWriteLen;
	char			szA[] = {"A"};

	cFileUtil.RemoveDir("Output/LogFile2");
	cFileUtil.MakeDir("Output/LogFile2");
	pcDiskFile = DiskFile("Output/LogFile2/OpenClose.txt");
	pcDiskFile->Open(EFM_ReadWrite_Create);
	iSourcelen = (int)strlen(szSource);
	pcDiskFile->Write(szSource, iSourcelen + 1, 1);
	pcDiskFile->Close();
	AssertTrue(cFileUtil.Exists("Output/LogFile2/OpenClose.txt"));

	pcLogFile = LogFile(pcDiskFile);
	cFile.Init(pcLogFile);
	pcLogFile->Begin();

	AssertTrue(cFile.Open(EFM_Read));
	AssertInt(iSourcelen + 1, (int)cFile.GetFileSize());
	cFile.ReadData(szResult, iSourcelen + 1);
	AssertString(szSource, szResult);
	cFile.Close();

	cFile.Open(EFM_ReadWrite_Create);
	iWriteLen = (int)strlen(szWrite);
	cFile.WriteData(szWrite, iWriteLen);
	AssertInt(iSourcelen + 1, (int)cFile.GetFileSize());
	pcLogFile->Close();

	cFile.Delete();
	AssertTrue(cFileUtil.Exists("Output/LogFile2/OpenClose.txt"));
	AssertInt(0, (int)cFile.GetFileSize());

	cFile.Open(EFM_ReadWrite_Create);
	cFile.Write(szA, 2, 1);
	AssertInt(2, (int)cFile.GetFileSize());

	cFile.Close();

	pcLogFile->Commit();
	cFile.Kill();

	AssertTrue(cFileUtil.Exists("Output/LogFile2/OpenClose.txt"));
	AssertInt(2, cFileUtil.Size("Output/LogFile2/OpenClose.txt"));

	pcDiskFile = DiskFile("Output/LogFile2/OpenClose.txt");
	pcLogFile = LogFile(pcDiskFile);
	cFile.Init(pcLogFile);
	pcLogFile->Begin();

	AssertTrue(cFile.Open(EFM_Read));
	cFile.ReadData(szResult, 2);
	AssertString("A", szResult);

	cFile.Seek(0);
	cFile.ReadData(szResult, 2);
	AssertString("A", szResult);

	cFile.Close();

	cFile.Delete();
	pcLogFile->Commit();
	cFile.Kill();

	AssertFalse(cFileUtil.Exists("Output/LogFile2/OpenClose.txt"));
}
Exemple #8
0
int main(int argc,char *argv[])
{
   int rtn;
   pSqlDB = &(g_BUnit.m_SqlDB); // 供外部方便检查,主要用于DEBUGSQLERROR(msg)
   g_BUnit.pSvrLink = &g_SvrLink;
   g_LogFile.SetFlushDelay(0);
   g_LogFile.Open("bulog");
   memset(pSqlDB,0,sizeof(ST_SQLDB));
   openlog("fdykt_hhd",LOG_PID|LOG_CONS|LOG_NDELAY,LOG_LOCAL4);
   puts("Before Reading ini...");
   if (argc<2)
      ReadIni("fdsvrall.ini");
   else
      ReadIni(argv[1]);
   puts("读配置文件end!\n");
   DEBUG_RUNTIME_MSGOUT("读配置文件end");
   ResetBPFunctions();
   if (argc>2)
   {
      ListBPFunctions(argv[2]);
   }

   pSqlDB->bConnected = 0;   

   // 初始化数据库连接:
   SQLInitialize();
   if (SQLConnectToServer()!=0)
   {
      DEBUG_RUNTIME_MSGOUT("不能正常建立数据库连接, 检查配置和数据库服务器!\n");
      return(-100);
   }
   // 初始化与BCC连接:
   DEBUG_RUNTIME_MSGOUT("连接数据库成功!\n");
   do 
   {
      rtn = g_SvrLink.ToLink(&g_BUnit);
      if (rtn==1)
      {
         DEBUG_RUNTIME_MSGOUT("与业务调度中心(BCC)的连接成功!\n");
         break;
      }
      else if (rtn==-100)
      {
         DEBUG_RUNTIME_MSGOUT("估计业务调度中心(BCC)尚未正式启动,或者检查配置中的[SERVER]项参数\n");
	 puts("sleep waiting for connect  BCC!");
         mysleep(g_BUnit.iHBInterval);
      }
      else
      {
         // 应该属于故障,或对方并不是BCC
         DEBUG_RUNTIME_MSGOUT("未知错误\n");
         return(rtn);
      }
   } while (1);
   setnoblockgetch();

/**********************************************************************
 Added by hhd at 2004-09-16
 为了增加签到处理,达到共享内存的处理
 增加共享内存和信号量
 共享内存一共1024个字节,其中使用前18个字节
 shm[0]:代表是否进行过签到的标志,如果为1,已经签过到但不知道是否成功
 		,后续业务将不能进行签到处理,如果为其他值,系统将进行签到
 shm[1]:代表签到是否成功的标志,如果为1,则标识签到成功,后续16个字节为
 		银行正常返回数据,可以使用
 shm[2~17]:前8个字节为加密的PIN密钥,后8个字节为加密的MAC密钥
***********************************************************************/
/**********************************************************************
 Update by hhd at 2004-10-27
 为了增加签到处理,达到共享内存的处理
 增加共享内存和信号量
 为了反映每个终端的当前工作状态,在共享内存中设置一个状态标志
 共享内存一共1024个字节,其中使用前26个字节
 shm[0]:代表是否进行过签到的标志,如果为1,已经签过到但不知道是否成功
 		,后续业务将不能进行签到处理,如果为其他值,系统将进行签到
 shm[1]:代表签到是否成功的标志,如果为1,则标识签到成功,后续16个字节为
 		银行正常返回数据,可以使用
 shm[2]:代表系统重新启动标志,如果不为1,系统进行初始化操作(进行设备
 		注册表中设备的状态的清空操作),然后系统将改标志置为1,其他BU启动
 		跳过该项操作
 shm[10~25]:前8个字节为加密的PIN密钥,后8个字节为加密的MAC密钥
***********************************************************************/

	key_t key;
	int ret=0;
	struct shmid_ds buf;


// Update by lq at 2005-03-10
// 将创建共享内存和设备签到移到bankguard中去
// 必须先运行bankguard此处操作才能完成

	key=ftok(".",0);
	shmid=shmget(key,SEGSIZE,0666);
	if(-1==shmid)
	{
		DEBUG_RUNTIME_MSGOUT("获取共享内存失败,请确保bankguard已经启动\n");
		return 	E_CREATE_SHARE_MEMORY;	
	}
	shm=(char*)shmat(shmid,0,0);
	if((int)shm==-1)
	{
		DEBUG_RUNTIME_MSGOUT("映射共享内存失败");
		return 	E_JOIN_SHARE_MEMORY;	
	}
	semid=semget(key,1,0);
	if(semid==-1)
	{
		DEBUG_RUNTIME_MSGOUT("获取共享锁id失败");
		return E_JOIN_SHARE_MEMORY;
	}

   while (g_SvrLink.LinkOK())
   {
      switch (mygetch())
      {
      case '?':
      case 'h':
      case 'H':
         printf("\nCommand List:\n");
         printf("\t ? or h: display this Help informations!\n");
         printf("\t x: To eXit this business unit.\n");
         printf("\t d: Display functions status.\n");
         printf("\t l: List functions status into <function.lst>.\n");
         printf("Enter command to select:\n");
         break;
      case 'x':
      case 'X':
         g_SvrLink.bExit = true;
         continue;
         break;
      case 'd':
      case 'D':
         ListBPFunctions(NULL);
         break;
      case 'l':
      case 'L':
         ListBPFunctions("function.lst");
         break;
      }
      
      TestSQLConnect();
      if (pSqlDB->bConnected==0)	//这个变量有人维护吗?
      {
         mysleep(1000);
         if (!g_SvrLink.CheckLink()) 
            break;  // BCC exit (可能用户发现数据库连接断开,需要维护系统,导致手工将BCC退出同时也需要BU退出)
         if (SQLConnectToServer()!=0)
         {
            // SQL Link error:
            DEBUG_RUNTIME_MSGOUT("不能正常建立数据库连接, 检查配置和数据库服务器!\n");
         }
         else
         {
            DEBUG_RUNTIME_MSGOUT("与数据库连接成功!\n");
         }
         continue;
      }
      else 
         g_SvrLink.Processing(&g_BUnit);
      if (g_SvrLink.bExit) break;
   }


/* ****** Updated by CHENYH at 2004-4-14 11:07:19 ****** 
   经过测试后,CheckLink()工作正常,测试环境为:BCC(WIN)+BU(WIN),BCC(LINUX)+BU(WIN),BCC(LINUX)+BU(LINUX)
   while (1)
   {
      mysleep(1000);
      if (!g_SvrLink.CheckLink())
      {
         printf("TEST CHECK LINK return <false>!\n");
         break;
      }
   }
*/

	shmdt(shm);
	shmctl(shmid,IPC_RMID,&buf);
	d_sem(semid);

	closelog();
	g_SvrLink.Close();
	SQLExit();
	DEBUG_RUNTIME_MSGOUT("业务处理单元BU系统正常退出!\n");
	g_LogFile.Close();
	return(0);
}
Exemple #9
0
int main(int argc,char *argv[])
{
   int rtn;
   pSqlDB = &(g_BUnit.m_SqlDB); // 供外部方便检查,主要用于DEBUGSQLERROR(msg)
   g_BUnit.pSvrLink = &g_SvrLink;
   g_LogFile.SetFlushDelay(0);
   g_LogFile.Open("bulog");
   openlog("yktbase",LOG_PID|LOG_CONS|LOG_NDELAY,LOG_LOCAL0);
   memset(pSqlDB,0,sizeof(ST_SQLDB));
   //puts("Before Reading ini...");
   if (argc<2)
      ReadIni("fdsvrall.ini");
   else
      ReadIni(argv[1]);
   DEBUG_RUNTIME_MSGOUT("读配置文件end");
   ResetBPFunctions();
   if (argc>2)
   {
      ListBPFunctions(argv[2]);
   }

   pSqlDB->bConnected = 0;   

   // 初始化数据库连接:
   SQLInitialize();
   if (SQLConnectToServer()!=0)
   {
      	DEBUG_RUNTIME_MSGOUT("不能正常建立数据库连接, 检查配置和数据库服务器!\n");
   	g_LogFile.Close();
	closelog();
      return(-100);
   }
#ifndef WIN32
	struct sigaction sigact;
	memset(&sigact,0,sizeof sigact);
	sigact.sa_handler = sig_alarm_handler;
	
	sigaction(SIGALRM,&sigact,NULL);
#endif
   // 初始化与BCC连接:
   DEBUG_RUNTIME_MSGOUT("连接数据库成功!\n");
   do 
   {
      rtn = g_SvrLink.ToLink(&g_BUnit);
      if (rtn==1)
      {
         puts("与业务调度中心(BCC)的连接成功!\n");
         break;
      }
      else if (rtn==-100)
      {
         DEBUG_RUNTIME_MSGOUT("估计业务调度中心(BCC)尚未正式启动,或者检查配置中的[SERVER]项参数\n");
	 puts("sleep waiting for connect  BCC!");
         mysleep(g_BUnit.iHBInterval);
      }
      else
      {
    			g_LogFile.Close();
			closelog();
         	 	return(rtn);
      }
   } while (1);
   setnoblockgetch();

   while (g_SvrLink.LinkOK())
   {
   /*
      switch (mygetch())
      {
      case '?':
      case 'h':
      case 'H':
         printf("\nCommand List:\n");
         printf("\t ? or h: display this Help informations!\n");
         printf("\t x: To eXit this business unit.\n");
         printf("\t d: Display functions status.\n");
         printf("\t l: List functions status into <function.lst>.\n");
         printf("Enter command to select:\n");
         break;
      case 'x':
      case 'X':
         g_SvrLink.bExit = true;
         continue;
         break;
      case 'd':
      case 'D':
         ListBPFunctions(NULL);
         break;
      case 'l':
      case 'L':
         ListBPFunctions("function.lst");
         break;
      }
      */
      TestSQLConnect();
      if (pSqlDB->bConnected==0)
      {
         mysleep(1000);
         if (!g_SvrLink.CheckLink()) 
            break;  // BCC exit (可能用户发现数据库连接断开,需要维护系统,导致手工将BCC退出同时也需要BU退出)
         if (SQLConnectToServer()!=0)
         {
            // SQL Link error:
            DEBUG_RUNTIME_MSGOUT("不能正常建立数据库连接, 检查配置和数据库服务器!\n");
         }
         else
         {
            DEBUG_RUNTIME_MSGOUT("与数据库连接成功!\n");
         }
         continue;
      }
      else 
         g_SvrLink.Processing(&g_BUnit);
      if (g_SvrLink.bExit) break;
   }


/* ****** Updated by CHENYH at 2004-4-14 11:07:19 ****** 
   经过测试后,CheckLink()工作正常,测试环境为:BCC(WIN)+BU(WIN),BCC(LINUX)+BU(WIN),BCC(LINUX)+BU(LINUX)
   while (1)
   {
      mysleep(1000);
      if (!g_SvrLink.CheckLink())
      {
         printf("TEST CHECK LINK return <false>!\n");
         break;
      }
   }
*/
   g_SvrLink.Close();
   closelog();
   SQLExit();
   DEBUG_RUNTIME_MSGOUT("业务处理单元BU系统正常退出!\n");
   g_LogFile.Close();
   return(0);
}