⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 errcall.c

📁 API
💻 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 + -