363 lines
11 KiB
C
363 lines
11 KiB
C
/************************************************************************/
|
|
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
|
/************************************************************************/
|
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
|
/* 1993-2007, All Rights Reserved */
|
|
/* */
|
|
/* MODULE NAME : sloghex.c */
|
|
/* PRODUCT(S) : SLOG */
|
|
/* */
|
|
/* MODULE DESCRIPTION : */
|
|
/* */
|
|
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
|
/* */
|
|
/* MODIFICATION LOG : */
|
|
/* Date Who Rev Comments */
|
|
/* -------- --- ------ ------------------------------------------- */
|
|
/* 01/15/07 EJV 15 Chg S_LOCK_RESOURCES to S_LOCK_UTIL_RESOURCES*/
|
|
/* 08/18/06 JRB 14 Chk _slog_remote_fun along with other ptrs. */
|
|
/* 05/23/05 EJV 13 doSlog corr: replaced LOG_IPC_EN with */
|
|
/* LOG_IPC_LISTEN_EN || LOG_IPC_CALL_EN */
|
|
/* 11/05/04 EJV 12 Added check for LOG_IPC_EN. */
|
|
/* 05/18/04 MDE 11 Removed LOG_IPC_SUPPORT #ifdef's */
|
|
/* 03/11/04 GLB 10 Remove "thisFileName" */
|
|
/* 02/17/03 JRB 09 Del system includes (using sysincs.h). */
|
|
/* 03/27/01 MDE 08 Added _slogStr */
|
|
/* 09/13/99 MDE 07 Added SD_CONST modifiers */
|
|
/* 11/11/98 DSF 06 Minor changes to _slog_dyn_log_fun */
|
|
/* 10/09/98 MDE 05 Put back center space per JB request */
|
|
/* 10/08/98 MDE 04 Migrated to updated SLOG interface */
|
|
/* 04/07/98 MDE 03 Minor warning cleanup */
|
|
/* 10/06/97 DSF 02 Added thisFileName */
|
|
/* 05/28/97 DSF 01 Added IPC logging capability */
|
|
/* 04/02/97 DTL 7.00 MMSEASE 7.0 release. See MODL70.DOC for */
|
|
/* history. */
|
|
/************************************************************************/
|
|
|
|
#include "glbtypes.h"
|
|
#include "sysincs.h"
|
|
#include "glbsem.h"
|
|
#include "slog.h"
|
|
|
|
#define cvt_nibble(a) ((ST_UCHAR) ((a) > 9 ? (a) + 'A' - 10 : (a) + '0'))
|
|
#define DEBUG_BUF_LEN 100
|
|
|
|
#define CHAR_PER_LINE 75
|
|
|
|
/************************************************************************/
|
|
/* slogHex */
|
|
/* Main HEX logging function, typically called via macro */
|
|
/* Create the HEX strings && pass to memory & file logging */
|
|
/* functions if enabled */
|
|
/************************************************************************/
|
|
|
|
ST_VOID slogHex (LOG_CTRL *lc,
|
|
SD_CONST ST_INT logType,
|
|
SD_CONST ST_CHAR *SD_CONST fileName,
|
|
SD_CONST ST_INT lineNum,
|
|
SD_CONST ST_INT numBytes,
|
|
SD_CONST ST_VOID *hexData)
|
|
{
|
|
_slogHex (lc, numBytes, hexData);
|
|
}
|
|
|
|
|
|
ST_VOID _slogHex (LOG_CTRL *lc,
|
|
ST_INT numBytes,
|
|
SD_CONST ST_VOID *hexData)
|
|
{
|
|
ST_INT i;
|
|
ST_INT ascii_index;
|
|
ST_INT hex_index;
|
|
ST_CHAR debug_buf[DEBUG_BUF_LEN+1]; /* output buffer */
|
|
ST_INT curlen;
|
|
ST_UCHAR ch;
|
|
ST_UCHAR hex;
|
|
ST_LONG addr;
|
|
ST_UINT filCtrlSave;
|
|
ST_UINT memCtrlSave;
|
|
ST_UCHAR *buf;
|
|
|
|
S_GS_INIT ();
|
|
S_LOCK_UTIL_RESOURCES ();
|
|
|
|
addr = 0;
|
|
|
|
/* Make the compiler happy */
|
|
buf = (ST_UCHAR *) hexData;
|
|
|
|
/* Make sure the LOG_CTRL pointer is not NULL */
|
|
if (!lc)
|
|
{
|
|
S_UNLOCK_UTIL_RESOURCES ();
|
|
return;
|
|
}
|
|
|
|
/* Check to see if any logging is enabled AND dynamic user logging */
|
|
/* function pointer not set */
|
|
if (!(lc->logCtrl & (LOG_FILE_EN | LOG_MEM_EN | LOG_IPC_EN)) &&
|
|
!slog_dyn_log_fun && !_slog_dyn_log_fun &&
|
|
!slog_remote_fun && !_slog_remote_fun)
|
|
{
|
|
S_UNLOCK_UTIL_RESOURCES ();
|
|
return;
|
|
}
|
|
|
|
/* Remember the state of the wipe/wrap/header enable flags */
|
|
/* so that we can restore them later */
|
|
|
|
filCtrlSave = lc->fc.ctrl & (FIL_CTRL_WIPE_EN |
|
|
FIL_CTRL_WRAP_EN |
|
|
FIL_CTRL_MSG_HDR_EN);
|
|
|
|
memCtrlSave = lc->mc.ctrl & MEM_CTRL_MSG_HDR_EN;
|
|
|
|
/* No hdr or wipe during a hex dump (allow wrap for first line if req'd)*/
|
|
lc->fc.ctrl &= ~(FIL_CTRL_WIPE_EN | FIL_CTRL_MSG_HDR_EN);
|
|
lc->mc.ctrl &= ~MEM_CTRL_MSG_HDR_EN;
|
|
|
|
/* Also turn on HEX flag bit for memory logging */
|
|
lc->mc.ctrl |= MEM_CTRL_HEX_LOG;
|
|
|
|
/* OK, now start the dump, line by line */
|
|
while (numBytes)
|
|
{
|
|
curlen = min(numBytes,16); /* # char's in current line */
|
|
for (i = 0; i < DEBUG_BUF_LEN; ++i)
|
|
debug_buf[i] = ' ';
|
|
sprintf (debug_buf,"%05lX ",addr);/* data offset */
|
|
hex_index = 7; /* where to put hex data */
|
|
ascii_index = 57; /* where to put ascii conversion */
|
|
debug_buf[ascii_index++] = '*';
|
|
|
|
for (i = 0; i < curlen; i++) /* for each byte in this line */
|
|
{
|
|
ch = *buf++; /* get next character */
|
|
|
|
hex = (ch >> 4) & (ST_UCHAR) 0x0f;/* write HEX chars for the byte */
|
|
hex = cvt_nibble(hex);
|
|
debug_buf[hex_index++] = hex;
|
|
hex = ch & (ST_UCHAR) 0x0f;
|
|
hex = cvt_nibble(hex);
|
|
debug_buf[hex_index++] = hex;
|
|
++hex_index; /* space between bytes */
|
|
if (i == 7)
|
|
++hex_index;
|
|
|
|
if (isprint(ch)) /* print ASCII portion */
|
|
debug_buf[ascii_index] = ch;
|
|
else
|
|
debug_buf[ascii_index] = '.'; /* just put a '.' there */
|
|
ascii_index++;
|
|
}
|
|
|
|
debug_buf[ascii_index++] = '*';
|
|
debug_buf[ascii_index++] = 0;
|
|
|
|
addr += 16; /* prepare for next line */
|
|
numBytes -= curlen;
|
|
|
|
/* debug_buf now contains the hex/ascii line to be logged */
|
|
|
|
/* for the last line to be logged, turn wipe back on */
|
|
if (!numBytes)
|
|
{
|
|
lc->fc.ctrl |= (filCtrlSave & FIL_CTRL_WIPE_EN);
|
|
}
|
|
|
|
if (lc->logCtrl & LOG_FILE_EN) /* File Logging enabled */
|
|
{
|
|
slogFile (lc, SLOG_CONT, NULL, NULL, 0, strlen(debug_buf), debug_buf);
|
|
}
|
|
|
|
if (lc->logCtrl & LOG_MEM_EN) /* Memory Logging enabled */
|
|
{
|
|
slogMem (lc, SLOG_CONT, NULL, NULL, 0, strlen(debug_buf), debug_buf);
|
|
}
|
|
|
|
if ((lc->logCtrl & LOG_IPC_LISTEN_EN) || (lc->logCtrl & LOG_IPC_CALL_EN))
|
|
/* IPC Logging enabled (listen, calling, or both modes) */
|
|
{
|
|
slogIpc (lc, SLOG_CONT, NULL, NULL, 0, strlen(debug_buf), debug_buf);
|
|
}
|
|
|
|
/* If the user has set up a dynamic log display function, call it */
|
|
if (slog_dyn_log_fun)
|
|
{
|
|
(*slog_dyn_log_fun)(lc, SLOG_CONT, NULL, 0,
|
|
strlen(debug_buf), debug_buf);
|
|
}
|
|
if (_slog_dyn_log_fun)
|
|
{
|
|
(*_slog_dyn_log_fun)(lc, slogTimeText, SLOG_CONT, NULL, NULL, 0,
|
|
strlen(debug_buf), debug_buf);
|
|
}
|
|
|
|
/* If the user has set up a remote logging function, call it */
|
|
if (slog_remote_fun)
|
|
{
|
|
(*slog_remote_fun)(slogRemoteFlags, lc, SLOG_CONT,
|
|
NULL, 0,
|
|
strlen(debug_buf), debug_buf);
|
|
}
|
|
if (_slog_remote_fun)
|
|
{
|
|
(*_slog_remote_fun)(slogRemoteFlags, lc, SLOG_CONT, NULL,
|
|
NULL, 0,
|
|
strlen(debug_buf), debug_buf);
|
|
}
|
|
|
|
/* Don't want to wrap the file in the middle of a hex dump */
|
|
lc->fc.ctrl &= ~FIL_CTRL_WRAP_EN;
|
|
}
|
|
|
|
/* All done, restore the flag state bits */
|
|
|
|
lc->fc.ctrl |= filCtrlSave;
|
|
lc->mc.ctrl |= memCtrlSave;
|
|
lc->mc.ctrl &= ~MEM_CTRL_HEX_LOG;
|
|
|
|
S_UNLOCK_UTIL_RESOURCES ();
|
|
}
|
|
|
|
|
|
/************************************************************************/
|
|
/* slogStr */
|
|
/************************************************************************/
|
|
|
|
ST_VOID _slogStr (LOG_CTRL *lc, ST_CHAR *strData)
|
|
{
|
|
ST_INT i;
|
|
ST_INT ascii_index;
|
|
ST_CHAR debug_buf[DEBUG_BUF_LEN+1]; /* output buffer */
|
|
ST_INT curlen;
|
|
ST_UCHAR ch;
|
|
ST_UINT filCtrlSave;
|
|
ST_UINT memCtrlSave;
|
|
ST_INT numBytes;
|
|
|
|
S_GS_INIT ();
|
|
S_LOCK_UTIL_RESOURCES ();
|
|
|
|
/* Make sure the LOG_CTRL pointer is not NULL */
|
|
if (!lc)
|
|
{
|
|
S_UNLOCK_UTIL_RESOURCES ();
|
|
return;
|
|
}
|
|
|
|
/* Check to see if any logging is enabled AND dynamic user logging */
|
|
/* function pointer not set */
|
|
if (!(lc->logCtrl & (LOG_FILE_EN | LOG_MEM_EN | LOG_IPC_EN)) &&
|
|
!slog_dyn_log_fun && !_slog_dyn_log_fun &&
|
|
!slog_remote_fun && !_slog_remote_fun)
|
|
{
|
|
S_UNLOCK_UTIL_RESOURCES ();
|
|
return;
|
|
}
|
|
|
|
/* Remember the state of the wipe/wrap/header enable flags */
|
|
/* so that we can restore them later */
|
|
|
|
filCtrlSave = lc->fc.ctrl & (FIL_CTRL_WIPE_EN |
|
|
FIL_CTRL_WRAP_EN |
|
|
FIL_CTRL_MSG_HDR_EN);
|
|
|
|
memCtrlSave = lc->mc.ctrl & MEM_CTRL_MSG_HDR_EN;
|
|
|
|
/* No hdr or wipe during a hex dump (allow wrap for first line if req'd)*/
|
|
lc->fc.ctrl &= ~(FIL_CTRL_WIPE_EN | FIL_CTRL_MSG_HDR_EN);
|
|
lc->mc.ctrl &= ~MEM_CTRL_MSG_HDR_EN;
|
|
|
|
/* OK, now start the dump, line by line */
|
|
|
|
numBytes = strlen (strData);
|
|
while (numBytes)
|
|
{
|
|
curlen = min (numBytes,CHAR_PER_LINE); /* # char's in current line */
|
|
ascii_index = 0; /* where to put ascii conversion */
|
|
for (i = 0; i < curlen; i++) /* for each byte in this line */
|
|
{
|
|
ch = *strData++; /* get next character */
|
|
if (isprint(ch)) /* print ASCII portion */
|
|
debug_buf[ascii_index] = ch;
|
|
else if (ch == '\n')
|
|
{
|
|
debug_buf[ascii_index] = ch;
|
|
++i;
|
|
break;
|
|
} /* end of this line */
|
|
else if (ch == '\t')
|
|
debug_buf[ascii_index] = ch;
|
|
else
|
|
debug_buf[ascii_index] = '.'; /* just put a '.' there */
|
|
ascii_index++;
|
|
}
|
|
debug_buf[ascii_index++] = 0;
|
|
|
|
numBytes -= i;
|
|
|
|
/* debug_buf now contains the ascii line to be logged */
|
|
/* for the last line to be logged, turn wipe back on */
|
|
if (!numBytes)
|
|
{
|
|
lc->fc.ctrl |= (filCtrlSave & FIL_CTRL_WIPE_EN);
|
|
}
|
|
|
|
if (lc->logCtrl & LOG_FILE_EN) /* File Logging enabled */
|
|
{
|
|
slogFile (lc, SLOG_CONT, NULL, NULL, 0, strlen(debug_buf), debug_buf);
|
|
}
|
|
|
|
if (lc->logCtrl & LOG_MEM_EN) /* Memory Logging enabled */
|
|
{
|
|
slogMem (lc, SLOG_CONT, NULL, NULL, 0, strlen(debug_buf), debug_buf);
|
|
}
|
|
|
|
if ((lc->logCtrl & LOG_IPC_LISTEN_EN) || (lc->logCtrl & LOG_IPC_CALL_EN))
|
|
/* IPC Logging enabled (listen, calling, or both modes) */
|
|
{
|
|
slogIpc (lc, SLOG_CONT, NULL, NULL, 0, strlen(debug_buf), debug_buf);
|
|
}
|
|
|
|
/* If the user has set up a dynamic log display function, call it */
|
|
if (slog_dyn_log_fun)
|
|
{
|
|
(*slog_dyn_log_fun)(lc, SLOG_CONT, NULL, 0,
|
|
strlen(debug_buf), debug_buf);
|
|
}
|
|
if (_slog_dyn_log_fun)
|
|
{
|
|
(*_slog_dyn_log_fun)(lc, slogTimeText, SLOG_CONT, NULL, NULL, 0,
|
|
strlen(debug_buf), debug_buf);
|
|
}
|
|
|
|
/* If the user has set up a remote logging function, call it */
|
|
if (slog_remote_fun)
|
|
{
|
|
(*slog_remote_fun)(slogRemoteFlags, lc, SLOG_CONT,
|
|
NULL, 0,
|
|
strlen(debug_buf), debug_buf);
|
|
}
|
|
if (_slog_remote_fun)
|
|
{
|
|
(*_slog_remote_fun)(slogRemoteFlags, lc, SLOG_CONT, NULL,
|
|
NULL, 0,
|
|
strlen(debug_buf), debug_buf);
|
|
}
|
|
|
|
/* Don't want to wrap the file in the middle of a hex dump */
|
|
lc->fc.ctrl &= ~FIL_CTRL_WRAP_EN;
|
|
}
|
|
|
|
/* All done, restore the flag state bits */
|
|
|
|
lc->fc.ctrl |= filCtrlSave;
|
|
lc->mc.ctrl |= memCtrlSave;
|
|
lc->mc.ctrl &= ~MEM_CTRL_HEX_LOG;
|
|
|
|
S_UNLOCK_UTIL_RESOURCES ();
|
|
}
|
|
|
|
|