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

📄 errlog.c

📁 unix 下用pro*c tuxedo 开发的东西
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * 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 + -