#define INCL_BASE #define INCL_DOSMISC #define INCL_LOGGING #define INCL_UNI #define INCL_OS2SERVER_UNI #ifdef INCL_ULS_UNI #undef INCL_ULS_UNI #endif #include <stddef.h> /* C library of standard defines */ #include <stdlib.h> /* C library of standard routines */ #include <string.h> /* C library for string operations */ #include <stdio.h> /* C library for standard I/O */ #include <ctype.h> /* C library for character operations*/ #include <os2.h> /* for all dos api calls */ #include <os2u.h> /* for all dos unicode api calls */ #include <basemid.h> /* Base msgid definitions */ #include <unidef.h> /* Unicode support */ #include <lfdef.h> /* Logging Framework support */ #define QUERY_SIZE 1000 #define BUFFER_SIZE 8192 BOOL SetupDone = FALSE; /* Unicode setup performed flag */ ULONG CpList[8]; /* List of code page info. */ ULONG CpSize; /* Length of code page list. */ UniChar code_page[10]; /* Code page for current OS/2 process*/ UniChar locale[128]; /* Locale name */ UconvObject convert_object; /* Unicode conversion object */ LocaleObject locale_object; /* Locale object */ /*--------------------------------------------------------------------------*/ /* FUNCTION PROTOTYPES */ /*--------------------------------------------------------------------------*/ /* Unicode support */ /*--------------------------------------------------------------------------*/ APIRET ConvertToUni(UniChar *UniString, char *CharString, int UniLength); APIRET ConvertFromUni(UniChar *UniString, char *CharString, int CharLength); APIRET SetupUni(void); int main(int argc, char *argv[]) { BYTE FmtBuffer[BUFFER_SIZE], ReadBuffer[BUFFER_SIZE]; char *pInsert; char DetailStr[256]; char CvtDetailStr[256]; ULONG i = 0, ulDetailCount = 0, ulUniFilesize = 0, ulDetailLen = 0, ulReadBufferLen = BUFFER_SIZE, ulFormatBufferSize = BUFFER_SIZE; APIRET rc = NO_ERROR; UniChar UniFilename[128]; LOFREQUESTTRACE OpenPkt; LCFREQUESTTRACE ClosePkt; LFEREQUESTTRACE FormatPkt; LREREQUESTTRACE ReadPkt; PLFEDETAIL2 pDet2; PFILTERBLOCK pFilterBlock; /* Pointer to start of filters */ if (argc == 1) { printf("Trace inferred filename required\n"); return(1); } /**************************************************************************/ /* Open the file */ /**************************************************************************/ ConvertToUni(UniFilename, argv[1], 128); ulUniFilesize = UniStrlen(UniFilename); OpenPkt.packet_size = sizeof(LOFREQUESTTRACE); OpenPkt.packet_revision_number = WPOS_RELEASE_1; OpenPkt.filename_length = &ulUniFilesize; OpenPkt.filename = UniFilename; OpenPkt.FileHandle = NULLHANDLE; rc = LogOpenFile(EVENT_TRACE_SERVICE, &OpenPkt); if (rc != NO_ERROR) { printf("LogOpenFile RC(%d)\n", rc); exit(rc); } ClosePkt.packet_size = sizeof(LCFREQUESTTRACE); ClosePkt.packet_revision_number = WPOS_RELEASE_1; ClosePkt.FileHandle = OpenPkt.FileHandle; FormatPkt.number_of_detail_records = &ulDetailCount; FormatPkt.packet_size = sizeof(FormatPkt); FormatPkt.packet_revision_number = WPOS_RELEASE_1; FormatPkt.log_entry_buffer = &ReadBuffer; FormatPkt.string_buffer_length = &ulFormatBufferSize; FormatPkt.string_buffer = (UniChar *) &FmtBuffer; FormatPkt.pathname_table_size = 0; FormatPkt.pathname_table = NULL; FormatPkt.flags = TRACE_ENTRY_DATA; pFilterBlock = NULL; ReadPkt.packet_size = sizeof(LREREQUESTTRACE); ReadPkt.packet_revision_number = WPOS_RELEASE_1; ReadPkt.flags = TRACE_READ_SINGLE_RECORD; ReadPkt.pFilter = pFilterBlock; ReadPkt.pLogEntryBuffer = (UniChar *) ReadBuffer; ReadPkt.pLogEntryBufferLength = &ulReadBufferLen; ReadPkt.FileHandle = OpenPkt.FileHandle; ReadPkt.entry_ID = TRACE_NEWEST_ENTRY; do { /************************************************************************/ /* Read in one buffer. */ /************************************************************************/ ulReadBufferLen = BUFFER_SIZE; rc = LogReadEntry(EVENT_TRACE_SERVICE, &ReadPkt); if ((rc != NO_ERROR) && (rc != INVALID_LF_AT_END_OF_LOG)) { printf("LogReadEntry RC(%d)\n", rc); } /************************************************************************/ /* Loop through the buffer to format one entry at a time */ /************************************************************************/ else if ((rc != INVALID_LF_AT_END_OF_LOG) && (ulReadBufferLen > 0)) { /**********************************************************************/ /* Format the data */ /**********************************************************************/ ulFormatBufferSize = BUFFER_SIZE; FormatPkt.log_entry_buffer = (PULONG) &ReadBuffer; rc = LogFormatEntry(EVENT_TRACE_SERVICE, &FormatPkt); if (rc != NO_ERROR) { printf("LogFormatEntry RC(%d)\n", rc); /********************************************************************/ /* Close the log file */ /********************************************************************/ rc = LogCloseFile(EVENT_TRACE_SERVICE, &ClosePkt); if (rc != NO_ERROR) { printf("LogCloseFile RC(%d)\n", rc); } exit(rc); } pDet2 = (PLFEDETAIL2) FmtBuffer; pInsert = (char *) pDet2 + sizeof(LFEDETAIL2); for (i = 0; i < ulDetailCount; ++i) { memset(DetailStr, 0, sizeof(DetailStr)); ulDetailLen = pDet2->length-sizeof(LFEDETAIL2); memcpy(DetailStr, pInsert, ulDetailLen); switch (pDet2->type) { case TRACE_ENTRY_TIME_TYPE: printf("Timestamp = %s\n", DetailStr); break; case TRACE_ENTRY_ID_TYPE: printf("Entry number = %s\n", DetailStr); break; case TRACE_ENTRY_PERSONALITY_TYPE: printf("Personality type = %s\n", DetailStr); break; case TRACE_ENTRY_MK_TASK_TYPE: printf("Microkernel task type = %s\n", DetailStr); break; case TRACE_ENTRY_MK_THREAD_TYPE: printf("Microkernel thread type = %s\n", DetailStr); break; case TRACE_ENTRY_OS2_PROCESS_TYPE: printf("OS/2 process type = %s\n", DetailStr); break; case TRACE_ENTRY_OS2_THREAD_TYPE: printf("OS/2 thread type = %s\n", DetailStr); break; case TRACE_ENTRY_MODULE_PATHNAME_TYPE: printf("Module pathname = %s\n", DetailStr); break; case TRACE_ENTRY_DATA_TYPE_TYPE: printf("Entry data type = %s\n", DetailStr); break; case BUFFER1_TYPE: if (ulDetailLen > 0) printf("Entry data = %s\n", DetailStr); break; case TRACE_ENTRY_MAJOR_CODE_TYPE: printf("Major code = %s\n", DetailStr); break; case TRACE_ENTRY_MINOR_CODE_TYPE: printf("Minor code = %s\n", DetailStr); break; default: printf(">> DEFAULT = %s\n", DetailStr); break; } /* switch */ pDet2 = (PLFEDETAIL2) ((char *)pDet2 + pDet2->length); pInsert = (char *)pDet2 + sizeof(LFEDETAIL2); } /* Detail loop */ printf("\n"); } /* Buffer has data */ } while ((rc == NO_ERROR)); /**************************************************************************/ /* Close the log file */ /**************************************************************************/ rc = LogCloseFile(EVENT_TRACE_SERVICE, &ClosePkt); if (rc != NO_ERROR) { printf("LogCloseFile RC(%d)\n", rc); exit(rc); } UniFreeLocaleObject(locale_object); UniFreeUconvObject(convert_object); exit(0); } /* main */ /********************** START OF SPECIFICATION ******************************/ /* Name: ConvertToUni */ /* */ /* Purpose: Convert a char string to unicode string. */ /* */ /* Returns: RC from API's */ /* */ /* Parameters: */ /* UniChar* Pointer to converted unicode string */ /* char* Pointer to string to convert */ /* int length of Unicode buffer in UniChars */ /* */ /********************* END OF SPECIFICATION *********************************/ APIRET ConvertToUni(UniChar *UniString, char *CharString, int UniLength) { APIRET rc = NO_ERROR; char* pinbuf; UniChar* puni; size_t inbytes, unichars, noni; if (SetupDone == FALSE) { rc = SetupUni(); /* Setup local and convert objects */ } if (rc == NO_ERROR) { /************************************************************************/ /* UniUconvToUcs will change the pointers given to it, so send in */ /* temporary pointers */ /************************************************************************/ inbytes = strlen(CharString) + 1; unichars = UniLength; pinbuf = CharString; puni = UniString; memset(puni, 0, unichars * sizeof(UniChar)); rc = UniUconvToUcs(convert_object, (void *)&pinbuf, &inbytes, &puni, &unichars, &noni); } return(rc); } /* ConvertToUni */ /********************** START OF SPECIFICATION ******************************/ /* Name: ConvertFromUni */ /* */ /* Purpose: Convert a unicode string to char string. */ /* */ /* Returns: 0 successfull conversion */ /* 1 conversion failed */ /* */ /* Parameters: */ /* UniChar* UniString; Pointer to string to convert */ /* char* CharString; Pointer to converted string */ /* int CharLength; length of the char buffer */ /* */ /********************* END OF SPECIFICATION *********************************/ APIRET ConvertFromUni(UniChar *UniString, char *CharString, int CharLength) { APIRET rc = NO_ERROR; char* poutbuf; UniChar* puni; size_t unichars, chars, noni; if (SetupDone == FALSE) { rc = SetupUni(); /* Setup local and convert objects */ } if (rc == NO_ERROR) { /************************************************************************/ /* UniUconvFromUcs will change the pointers given to it, so send in */ /* temporary pointers */ /************************************************************************/ unichars = UniStrlen(UniString); chars = CharLength; poutbuf = CharString; puni = UniString; memset(poutbuf, 0, chars); /* Zero output buffer and null term */ rc = UniUconvFromUcs(convert_object, /* Conversion Object */ &puni, /* Uni Input Buffer addr */ &unichars, /* Bytes left in ucsbuf */ (void *)&poutbuf, /* Output Buffer address */ &chars, /* Bytes left in outbuf */ &noni); /* nonident conversions */ } return(rc); } /* ConvertFromUni */ /********************** START OF SPECIFICATION ******************************/ /* Name: SetupUni */ /* */ /* Purpose: Setup local and convert objects for unicode conversions */ /* */ /* Returns: RC from API's used */ /* */ /* Parameters: none */ /* */ /********************* END OF SPECIFICATION *********************************/ APIRET SetupUni(void) { APIRET rc = NO_ERROR; rc = UniCreateLocaleObject(UNI_UCS_STRING_POINTER, L"", &locale_object); /**************************************************************************/ /* Get the value of LC_MESSAGES to determine which language */ /**************************************************************************/ rc = UniQueryLocaleObject(locale_object, LC_MESSAGES, UNI_UCS_STRING_POINTER, (PVOID)&locale); if (rc != NO_ERROR) return(rc); UniStrcpy(code_page, L"IBM-850"); rc = UniCreateUconvObject(code_page, &convert_object); if (rc != NO_ERROR) return(rc); SetupDone = TRUE; return(rc); } /* SetupUni */