📄 errlog.c
字号:
/*
* BANKING TRANSACTION SWITCHING SYSTEM (version 1.0).
*
* (C) COPYRIGHT International Business Machines Corp. 1997
* All Rights Reserved
* Licensed Materials - Property of IBM
*/
/*
***************************************************************************
* (1) File Name : errlog.c *
* (2) Module ID : *
* (3) Module Name : Error log module. *
* *
* (4) Purpose : 1. Initialize object for error log. *
* 2. Output message to destination. *
* 3. Close object used for error log. *
* *
* (5) Author : Li Feng (IBM China) *
* (6) Date Created : 1997/06/01 *
* (7) Version : 1.0 *
* (8) Environment : AIX 4.x *
* (9) Warnings : *
***************************************************************************
* (10) Changed Logs : *
* Change No. Date Author Reason For Change *
* *
***************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <stdarg.h>
#include <ctype.h>
#include <memory.h>
#include <time.h>
#include <sys/file.h>
#ifdef DOS
#include <io.h>
#include <dos.h>
#include <sys\stat.h>
#endif
#ifdef DOS
#include "remote.h" /* -lsndrmt ipcn.c sem.c -lipcn */
#else
#include "sndremote.h"
#endif
#include "errlog.h"
#define PERM 0700
#define MAX_FN_LEN 256
#define MAX_BUFFER_LEN 20000
#define MAX_REMOTE_LEN 512
#define SEPARATOR_CHAR '-'
#define SCREEN_TRACE 0
#define FILE_TRACE 1
#define REMOTE_TRACE 2
static int NetId;
static char IdStr[50];
static char path[256];
static int TraceFlag[MAX_SECTOR_NUM][MAX_MESSAGE_TYPE_NUM] =
{
{0, 0, 1, 1},
{0, 0, 1, 1},
{0, 0, 1, 1},
};
static char *buffer = NULL;
static char *Sector[MAX_SECTOR_NUM] =
{ "SCREEN TRACE",
"FILE TRACE",
"REMOTE TRACE"
};
static char *Message[MAX_MESSAGE_TYPE_NUM] =
{ "NORMAL",
"DEBUG",
"WARNING",
"ERROR"
};
#ifdef DOS
#define ERRORLOG_FILE_NAME "/log/errorlog.dat"
char ErrorLogFileName[255];
char *ConfigDataFileName = "/etc/trccfg.dat";
#else
#define ERRORLOG_FILE_NAME "/log/errorlog.data"
char ErrorLogFileName[1024];
char *ConfigDataFileName = "/etc/trccfg.data";
#endif
static char RemoteLockFileName[] = "/log/remote.lock";
static int ReadConfigFile(char *fn);
static int ScreenLog(int typ, char *buffer, int len);
static int FileLog(int typ, char *buffer, char *dump_buffer, int len, int fmt);
static int RemoteLog(int typ, char *buffer, int len);
static int RemoteDupLog(int typ, char *error_string, char *dump_buffer, int data_len, int fmt);
#ifndef DOS
static char *strupr(char *str);
#endif
int InitErrLogObjPersonal(char *PersonalPath, char *pcIdStr, int iNetId)
{
char fn[MAX_FN_LEN];
NetId = iNetId;
strncpy(IdStr, pcIdStr, 40); IdStr[40] = 0;
strcpy(path, PersonalPath);
buffer = (char *)malloc(MAX_BUFFER_LEN);
if (buffer == NULL) return(-2);
if (InitRemoteCommObj()!=0) return(-3);
strcpy(fn, path); strcat(fn, ConfigDataFileName);
if (ReadConfigFile(fn)!=0)
ProcessError(LOG_WARNING, "ERRORLOG reports error: Error open config file, default value is used");
strcpy(ErrorLogFileName, ERRORLOG_FILE_NAME);
return(0);
}
int InitErrLogObjPersonalWithName(char *PersonalPath, char *filename, char *pcIdStr, int iNetId)
{
char fn[MAX_FN_LEN];
NetId = iNetId;
strncpy(IdStr, pcIdStr, 40); IdStr[40] = 0;
strcpy(path, PersonalPath);
buffer = (char *)malloc(MAX_BUFFER_LEN);
if (buffer == NULL) return(-2);
if (InitRemoteCommObj()!=0) return(-3);
strcpy(fn, path); strcat(fn, ConfigDataFileName);
if (ReadConfigFile(fn)!=0)
ProcessError(LOG_WARNING, "ERRORLOG reports error: Error open config file, default value is used");
strcpy(ErrorLogFileName, "/log/");
strcat(ErrorLogFileName, filename);
return(0);
}
int InitErrLogObj(char *pcIdStr, int iNetId)
{
char fn[MAX_FN_LEN];
char *p;
NetId = iNetId;
strncpy(IdStr, pcIdStr, 40); IdStr[40] = 0;
p = getenv("HOME");
strcpy(path, p);
buffer = (char *)malloc(MAX_BUFFER_LEN);
if (buffer == NULL) return(-2);
if (InitRemoteCommObj()!=0) return(-3);
strcpy(fn, path); strcat(fn, ConfigDataFileName);
if (ReadConfigFile(fn)!=0)
ProcessError(LOG_WARNING, "ERRORLOG reports error: Error open config file, default value is used");
strcpy(ErrorLogFileName, ERRORLOG_FILE_NAME);
return(0);
}
int ProcessError(int iLogTyp, char *pcFmt, ...)
{
va_list vp;
int len;
char *p, *ptr;
int ret_code;
if (buffer == NULL) return(-2);
va_start(vp, pcFmt);
/* Special, if the pcFmt is NULL, it means the following prototype
int ProcessError(int iLogTyp, NULL, char *Descriptor, char *buffer, int len);
this format will ingore config, directly print to error log file, and
it will print with hex and ascii format.
*/
if (pcFmt == NULL)
{
p = va_arg(vp, char *);
ptr = va_arg(vp, char *);
len = va_arg(vp, int);
va_end(vp);
sprintf(buffer, "DUMP message : <%s>, see the errlog file\n", p);
if (TraceFlag[TRACE_SCREEN][iLogTyp])
if ((ret_code = ScreenLog(iLogTyp, buffer, len))!=0) return(-1);
if (TraceFlag[TRACE_REMOTE][iLogTyp])
{
RemoteDupLog(iLogTyp, p, ptr, len, 1);
}
return(FileLog(iLogTyp, p, ptr, len, 1));
}
vsprintf(buffer, pcFmt, vp);
len = strlen(buffer);
if (buffer[len-1] != '\n') strcat(buffer, "\n");
va_end(vp);
if (TraceFlag[TRACE_SCREEN][iLogTyp])
if ((ret_code = ScreenLog(iLogTyp, buffer, len))!=0) return(-1);
if (TraceFlag[TRACE_FILE][iLogTyp])
if (FileLog(iLogTyp, buffer, NULL, len, 0)!=0) return(-1);
if (TraceFlag[TRACE_REMOTE][iLogTyp])
if (RemoteDupLog(iLogTyp, buffer, NULL, len, 0)!=0) return(-1);
/* if (RemoteLog(iLogTyp, buffer, len)!=0) return(-1);*/
return(0);
}
int CloseErrLogObj(void)
{
free(buffer);
CloseRemoteCommObj();
return(0);
}
/**********************************************************************/
/* The following is used by the Errlog.c self */
/**********************************************************************/
static int ScreenLog(int typ, char *buffer, int len)
{
printf("\n<%s> reports a <%s> message:\n", IdStr, Message[typ]);
printf(buffer);
return(0);
}
static int FileLog(int typ, char *error_string, char *dump_buffer, int data_len, int fmt)
{
char fn[MAX_FN_LEN];
int filedes;
char buffer[100];
char temp_string[10];
int i, j;
int len;
struct tm *t;
time_t timer;
#ifndef DOS
struct flock flk;
#endif
timer = time(NULL);
t = localtime(&timer); t->tm_year += 1900; t->tm_mon ++;
strcpy(fn, path);
strcat(fn, ErrorLogFileName);
#ifdef DOS
filedes = open(fn, O_CREAT | O_TEXT | O_APPEND | O_WRONLY);
if (filedes == -1) return(errno);
#else
filedes = open(fn, O_CREAT | O_APPEND | O_WRONLY, PERM);
if (filedes == -1) return(-1);
fcntl(filedes, F_GETLK, &flk);
flk.l_type = F_WRLCK;
flk.l_whence = 0;
flk.l_start = 0;
flk.l_len = 0;
flk.l_pid = 0;
flk.l_pid = getpid();
fcntl(filedes, F_SETLKW, &flk);
#endif
/* print the information title */
sprintf(buffer, "\n\nPROCESS ID <%-40s> DATE <%04d-%02d-%02d>\n", IdStr, t->tm_year, t->tm_mon, t->tm_mday);
len = strlen(buffer);
len = write(filedes, buffer, len);
if (len == -1) return(-1);
sprintf(buffer, "MESSAGE TYPE <%-10s> MESSAGE LENGTH <%04d> TIME <%02d:%02d:%02d>\n", Message[typ], data_len, t->tm_hour, t->tm_min, t->tm_sec);
len = strlen(buffer);
write(filedes, buffer, len);
memset(buffer, SEPARATOR_CHAR, 78); buffer[78] = '\n'; buffer[79] = 0;
len = strlen(buffer);
write(filedes, buffer, len);
/* print the errlog content */
if (fmt == 0)
{
len = strlen(error_string);
write(filedes, error_string, len);
}
else
{
/* print DUMP message */
sprintf(buffer, "DUMP of <%s>\n", error_string);
len = strlen(buffer);
write(filedes, buffer, len);
strcpy(buffer, "\nDisplacement ----------------- Hex codes ------------------- ASCII value\n");
for (i=0; i<data_len; i++)
{
if (i % 16 == 0)
{
j = 0; buffer[78] = '\n'; buffer[79] = 0;
len = strlen(buffer);
write(filedes, buffer, len);
sprintf(buffer, " %04X(%04d) ", i, i);
memset(&buffer[11], ' ', 68);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -