📄 errcall.c
字号:
/********************************************************************
* 程序名: errcall.c 错误日志记录
* 功 能: 记录错误信息(ERROR)或调试信息(DEBUG)、
* 警告信息(WARNING)于日志文件log/errlog/errlog.DD中
*
* 修 改:周国祥 2002/04/16 加入标志G_bts_flag用于区分调用程序是否
* 运行在BTS系统上。若是运行在BTS上,则可
* 以使用errmsg()发送信息到MONITOR以及检查
* 日志文件的大小以便太大时予以警告等。
* 否则(G_bts_flag == 0),只是一般的日
* 志记录。
* G_bts_flag 缺省为1,若非BTS系统上运行的程序则须在
* 主程序中用如下形式定义:
* extern int G_bts_flag;
* main(){
* ...
* G_bts_flag = 0;
* ...
* }
********************************************************************/
#include <time.h>
#include <stdio.h>
#include <varargs.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <ulimit.h>
#include "all.h"
#include "db_struct_c.h"
#include "new_monitor.h"
ERRMSG err_msg;
#ifdef zgx020416_added
#else
int G_bts_flag = 1;
int G_debug_flag = 0;
char exec_name[128];
#endif
/*
* 在标准输出显示错误信息
*/
static errstd(errinfo)
char * errinfo;
{
fprintf(stderr, "%s", errinfo);
}
/*
* 将信息发送给MONITOR消息区
*/
static errmsg()
{
int len, i;
char *path;
static int shmf = 0, msgf = 0;
static SHM1 *shmptr;
static int msgid;
len = strlen(err_msg.errinfo);
if (!shmf) {
if ((shmptr = (SHM1 *)ne_get_shm(SHMFILE,
SHMID1, sizeof(SHM1))) == NULL) {
sprintf(err_msg.errinfo + len,
"%s(%d) : get_shm(SHMFILE, SHMID1) return NULL\n",
__FILE__, __LINE__);
return(-1);
}
shmf = 1;
}
if (shmptr->errmsg != '1' && shmptr->errmsg != 1) {
return(1);
}
if (!msgf) {
if ((msgid = ne_get_msg(MSGFILE, MONITOR)) < 0) {
sprintf(err_msg.errinfo + len,
"%s(%d) : get_msg( MSGFILE,MONITOR ) return %d\n",
__FILE__, __LINE__, msgid);
return (-1);
}
msgf = 1;
}
/* i = msgsnd(msgid, &err_msg, L_ERRMSG, IPC_NOWAIT);*/
i = msgsnd(msgid, &err_msg, 1024, IPC_NOWAIT);
if (i < 0) {
sprintf(err_msg.errinfo + len,
"%s(%d) : msgsnd() error!\n",
__FILE__, __LINE__);
return(-1);
}
return(0);
}
/*
* 将信息记入日志文件log/errlog/errlog.DD
*/
static errlog()
{
int len, ret;
char *path;
FILE *fp;
char flname[81];
struct tm *tm;
time_t t;
long filesz;
char buf[256], buff[256];
// create_tmp_file("log/errlog");
len = strlen(err_msg.errinfo);
path = (char *)getfname ("WORKDIR", ERRFILE);
time(&t);
tm = localtime(&t);
sprintf(flname, "%s.%02d", path, tm->tm_mday);
fp = fopen(flname, "a");
if (fp == NULL) {
sprintf(err_msg.errinfo + len,
"%s(%d) : fopen(%s) error!\n",
__FILE__, __LINE__, path);
return(-1);
}
fwrite(err_msg.errinfo, 1, len, fp);
#ifdef zgx020416_modi
#ifdef zgx010523_added_modi
fclose ( fp );
return ( 0 );
#else
filesz = ftell(fp);
fclose ( fp );
/*
* 当日志文件大小离最大大小值只剩10MB时
* 警告信息给监控模块,提醒管理员予以清除
*/
/* WWWW用于告知监控模块须beep */
/**
if (ulimit(UL_GETFSIZE) - filesz/512 < 2000000) {
sprintf(buf, "WWWW警告:日志文件%s已相当大,请尽快予以清理!!!", flname);
new_repos ( MSG_OTHER, (char *)buf, strlen(buf));
}
***/
return(0);
#endif
#else /* zgx020416_modi */
if (G_bts_flag == 0) {
fclose ( fp );
return ( 0 );
} else {
filesz = ftell(fp);
fclose(fp);
/*
* 当日志文件大小离最大大小值只剩10MB时
* 警告信息给监控模块,提醒管理员予以清除
*/
/* WWWW用于告知监控模块须beep */
/*
if (ulimit(UL_GETFSIZE) - filesz/512 < 2000000) {
sprintf(buf, "WWWW警告:日志文件%s已相当大,请尽快予以清理!!!", flname);
new_repos(MSG_OTHER, (char *)buf, strlen(buf));
}
*/
return(0);
}
#endif /* zgx020416_modi */
}
/*
* 日志信息处理的函数,用于其他程序调用
*/
errcall(efile, eline, etype, fmt, va_alist)
char *efile;
int eline;
int etype;
char *fmt;
va_dcl
{
va_list args;
int len, errlog_fail;
char mdate[11], mtime[13];
char *cp;
char execname[128];
char *rindex();
#ifdef zgx020416_modi
if ((etype == E_DEBUG) && !debug_ok())
return;
#else
if (G_bts_flag == 1) {
if ((etype == E_DEBUG) && !debug_ok())
return;
} else {
if ((etype == E_DEBUG) && G_debug_flag == 0)
return;
}
#endif
va_start(args);
err_msg.msgtype = TO_ERR;
err_msg.errtype = etype;
getdatef(mdate, "-");
milltime(mtime, ":");
#ifdef zgx010421_modify
sprintf(err_msg.errinfo, "%s %s %s(%d) : ", mdate, mtime, efile, eline);
#else
cp = rindex(exec_name, '/');
if (cp == NULL) {
strcpy(execname, exec_name);
} else {
strcpy(execname, cp + 1);
}
sprintf(err_msg.errinfo, "%s %s (%s:%d) %s(%d) : ", mdate+5, mtime, execname, getpid(), efile, eline);
#endif
len = strlen(err_msg.errinfo);
vsprintf(err_msg.errinfo + len, fmt, args);
strcat(err_msg.errinfo, "\n");
errlog_fail = 0;
if (errlog() < 0) {
len = strlen(err_msg.errinfo);
sprintf(err_msg.errinfo + len,
"%s(%d) : errlog() error!\n",
__FILE__, __LINE__);
errlog_fail = 1;
}
#ifdef zgx020416_modi
if ((errmsg() != 0) && errlog_fail) {
len = strlen ( err_msg.errinfo );
sprintf(err_msg.errinfo + len,
"%s(%d) : errmsg() error!\n",
__FILE__, __LINE__);
errstd(err_msg.errinfo);
}
#else
if (G_bts_flag == 1) {
if ( (errmsg() != 0) && errlog_fail) {
len = strlen ( err_msg.errinfo );
sprintf(err_msg.errinfo + len,
"%s(%d) : errmsg() error!\n",
__FILE__, __LINE__);
errstd(err_msg.errinfo);
}
} else {
if (errlog_fail) {
errstd(err_msg.errinfo);
}
}
#endif
va_end(args);
return(0);
}
int posls_f(char *file, char *msg, S_tran_ls *pls)
{
char date[11], time[9];
FILE *fp;
fp = fopen(file, "a");
if (fp == NULL) {
errcall(ERROR, "Open file %s for append error!", file);
return(-1);
}
getdatef(date, "/");
gettimef(time, ":");
fprintf(fp, "日期: [%s] 时间: [%s] %s\n", date, time, msg);
rm_tail_space(pls->merchant_id);
rm_tail_space(pls->card_no);
rm_tail_space(pls->acq_bank_id);
rm_tail_space(pls->iss_bank_id);
rm_tail_space(pls->snd_bank_id);
rm_tail_space(pls->snd_host_id);
rm_tail_space(pls->rcv_bank_id);
rm_tail_space(pls->rcv_host_id);
fprintf(fp, "交易日期 [%s] 交易时间 [%s]\n",
pls->local_sys_date, pls->local_sys_time);
fprintf(fp, "商户编号 [%s] 商户类型 [%s] EDC 编号 [%s]\n",
pls->merchant_id, pls->mcc, pls->terminal_id);
fprintf(fp, "EDC 批次号 [%ld] EDC 流水号 [%ld]\n",
pls->batch_no, pls->trace_no);
fprintf(fp, " 主机流水号 [%ld] 授权号码 [%s]\n",
pls->host_ls_no, pls->auth_no);
fprintf(fp, "交易卡号 [%s] \n",
pls->card_no);
fprintf(fp, "交易类型 [%d] 原类型 [%d] 交易金额 [%.2lf]\n",
pls->tran_type, pls->void_tran_type, pls->tran_amt);
fprintf(fp, "交易标志 [%s] 回应信息 [%s]\n",
pls->tran_flag, pls->resp_code);
fprintf(fp, "发送方对帐标志 [%s] 接收方对帐标志 [%s] \n",
pls->snd_settle_flag, pls->rcv_settle_flag);
fprintf(fp, "代收费方对帐标志 [%s] 通知方对帐标志 [%s] 对帐结果 [%s]\n",
pls->agt_settle_flag, pls->adv_settle_flag, pls->edc_err_flag);
fprintf(fp, "发送方逻辑日 [%s] 接收方逻辑日 [%s]\n",
pls->snd_logic_date, pls->rcv_logic_date);
fprintf(fp, "代收费方逻辑日 [%s] 通知方逻辑日 [%s]\n",
pls->agt_logic_date, pls->adv_logic_date);
fprintf(fp, "收单行 [%s] 发卡行 [%s] 发起方 [%s] 接收方 [%s]\n",
pls->acq_bank_id, pls->iss_bank_id, pls->snd_bank_id,
pls->rcv_bank_id);
fprintf(fp, " 发起方主机号 [%s] 接收方主机号 [%s]\n\n",
pls->snd_host_id,pls->rcv_host_id);
fclose(fp);
return(0);
}
int rm_tail_space(char *str)
{
int len, i;
if ((len = strlen(str)) == 0) return(0);
for (i = len - 1; i > -1; i--)
if (str[i] != ' ') break;
str[i + 1] = 0;
return(0);
}
#ifdef zgx020425_added
#else
/* Moved from dbprg/start.ec */
/*---------------------------------------------------
判系统是否已初始化
return: 1 --- NOT INIT
0 --- INIT SUCC
-----------------------------------------------------*/
no_init()
{
key_t key;
int shid;
if ((key = getipckey(SHMFILE, SHMID1)) < 0) {
errcall(ERROR, "SHMFILE err! getipckey err!");
return(1);
}
if ((shid = shmget(key, sizeof(SHM1), IPCGET)) < 0) {
return(1);
}
return(0);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -