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

📄 errcall.c

📁 sco unix下c语言开发工具库
💻 C
字号:
#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	"new_monitor.h"



ERRMSG	err_msg;



static	errstd ( errinfo )
char	* errinfo;
{
	fprintf ( stderr, "%s", errinfo );
}




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

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


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

	return ( 0 );

}


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 );

	filesz = ftell(fp);
	fclose ( fp );
	if (ulimit(UL_GETFSIZE) - filesz/512 < 2000000) {
		/*
		 * 当日志文件大小离最大大小值只剩10MB时
		 * 警告信息给监控模块,提醒管理员予以清除
		 */
		/* WWWW用于告知监控模块须beep */
		sprintf(buf, "WWWW警告:日志文件%s已相当大,请尽快予以清理!!!", flname);
		//jgdelete. new_repos ( MSG_OTHER, (char *)buf, strlen(buf));
		
	}
	return(0);
}




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];

	if( (etype == E_DEBUG) && !debug_ok() )		return;

	va_start ( args );

	err_msg.msgtype = TO_ERR;
	err_msg.errtype = etype;

	getdatef(mdate, "-");
	milltime(mtime, ":");
	sprintf ( err_msg.errinfo, "%s %s (pid:%d) %s(%d) : ", mdate, mtime, getpid(), efile, eline );
	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;
	}

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

	va_end ( args );
	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);
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -