940 lines
26 KiB
C
940 lines
26 KiB
C
|
#include "convlog.h"
|
|||
|
#include <logconst.h>
|
|||
|
|
|||
|
#define MAX_MONTH_SIZE 16
|
|||
|
|
|||
|
char szJan[MAX_MONTH_SIZE];
|
|||
|
char szFeb[MAX_MONTH_SIZE];
|
|||
|
char szMar[MAX_MONTH_SIZE];
|
|||
|
char szApr[MAX_MONTH_SIZE];
|
|||
|
char szMay[MAX_MONTH_SIZE];
|
|||
|
char szJun[MAX_MONTH_SIZE];
|
|||
|
char szJul[MAX_MONTH_SIZE];
|
|||
|
char szAug[MAX_MONTH_SIZE];
|
|||
|
char szSep[MAX_MONTH_SIZE];
|
|||
|
char szOct[MAX_MONTH_SIZE];
|
|||
|
char szNov[MAX_MONTH_SIZE];
|
|||
|
char szDec[MAX_MONTH_SIZE];
|
|||
|
|
|||
|
//
|
|||
|
// extended logging
|
|||
|
//
|
|||
|
|
|||
|
DWORD dwHostNamePos = 0;
|
|||
|
DWORD dwUserNamePos = 0;
|
|||
|
DWORD dwDatePos = 0;
|
|||
|
DWORD dwTimePos = 0;
|
|||
|
DWORD dwMethodPos = 0;
|
|||
|
DWORD dwURIStemPos = 0;
|
|||
|
DWORD dwURIQueryPos = 0;
|
|||
|
DWORD dwHTTPStatusPos = 0;
|
|||
|
DWORD dwBytesSentPos = 0;
|
|||
|
DWORD dwBytesRecvPos = 0;
|
|||
|
DWORD dwServicePos = 0;
|
|||
|
DWORD dwVersionPos = 0;
|
|||
|
CHAR szGlobalDate[32] = {0};
|
|||
|
CHAR szGlobalTime[32] = {0};
|
|||
|
BOOL ExtendedFieldsDefined = FALSE;
|
|||
|
|
|||
|
BOOL
|
|||
|
InitDateStrings(
|
|||
|
VOID
|
|||
|
)
|
|||
|
{
|
|||
|
HINSTANCE hInst = GetModuleHandle(NULL);
|
|||
|
|
|||
|
if ( hInst == NULL ) {
|
|||
|
return(FALSE);
|
|||
|
}
|
|||
|
|
|||
|
LoadString(hInst, IDS_JAN, szJan, sizeof(szJan));
|
|||
|
LoadString(hInst, IDS_FEB, szFeb, sizeof(szFeb));
|
|||
|
LoadString(hInst, IDS_MAR, szMar, sizeof(szMar));
|
|||
|
LoadString(hInst, IDS_APR, szApr, sizeof(szApr));
|
|||
|
LoadString(hInst, IDS_MAY, szMay, sizeof(szMay));
|
|||
|
LoadString(hInst, IDS_JUN, szJun, sizeof(szJun));
|
|||
|
LoadString(hInst, IDS_JUL, szJul, sizeof(szJul));
|
|||
|
LoadString(hInst, IDS_AUG, szAug, sizeof(szAug));
|
|||
|
LoadString(hInst, IDS_SEP, szSep, sizeof(szSep));
|
|||
|
LoadString(hInst, IDS_OCT, szOct, sizeof(szOct));
|
|||
|
LoadString(hInst, IDS_NOV, szNov, sizeof(szNov));
|
|||
|
LoadString(hInst, IDS_DEC, szDec, sizeof(szDec));
|
|||
|
|
|||
|
return(TRUE);
|
|||
|
}
|
|||
|
|
|||
|
PCHAR
|
|||
|
FindChar(
|
|||
|
IN PCHAR cp,
|
|||
|
IN CHAR cTarget
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
This procedure increments a character pointer until it finds a comma or the
|
|||
|
NULL character. if it finds a comma, it replaces it with a NULL and increments
|
|||
|
the pointer. if it finds a NULL, it merely returns without changing the character.
|
|||
|
--*/
|
|||
|
{
|
|||
|
while ((*cp != cTarget) && (*cp != '\0'))
|
|||
|
cp++;
|
|||
|
|
|||
|
if (*cp == cTarget)
|
|||
|
{
|
|||
|
*cp = '\0';
|
|||
|
cp++;
|
|||
|
cp = SkipWhite(cp);
|
|||
|
}
|
|||
|
return (cp);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PCHAR
|
|||
|
FindMSINETLogDelimChar( IN PCHAR cp )
|
|||
|
|
|||
|
/*++
|
|||
|
This procedure increments a character pointer until it finds a comma+space or the
|
|||
|
NULL character. if it finds a comma+space, it replaces the comma with a NULL and increments
|
|||
|
the pointer past the space. if it finds a NULL, it merely returns without changing
|
|||
|
the character.
|
|||
|
--*/
|
|||
|
{
|
|||
|
while ( !(*cp == ',' && ISWHITE ( *(cp+1) )) && (*cp != '\0') && (*cp != '\r') && (*cp != '\n'))
|
|||
|
{
|
|||
|
cp++;
|
|||
|
}
|
|||
|
|
|||
|
if (*cp == ',')
|
|||
|
{
|
|||
|
*cp = '\0';
|
|||
|
cp++;
|
|||
|
cp = SkipWhite(cp);
|
|||
|
}
|
|||
|
else
|
|||
|
if ((*cp=='\r') || (*cp=='\n'))\
|
|||
|
{
|
|||
|
*cp = '\0';
|
|||
|
}
|
|||
|
|
|||
|
return (cp);
|
|||
|
}
|
|||
|
|
|||
|
char * SkipWhite (char *cp)
|
|||
|
{
|
|||
|
|
|||
|
while (ISWHITE (*cp))
|
|||
|
{
|
|||
|
cp++;
|
|||
|
}
|
|||
|
return (cp);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#if 0
|
|||
|
PCHAR
|
|||
|
ConvertDate(
|
|||
|
IN LPTSTR pszDate
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
Convert the date from "15/May/1995" to "5/15/95" format
|
|||
|
--*/
|
|||
|
{
|
|||
|
static char pszRetDate[100];
|
|||
|
char *cpCurrent = pszDate;
|
|||
|
|
|||
|
int nMonth=1;
|
|||
|
int nDay=1;
|
|||
|
int nYear=90;
|
|||
|
|
|||
|
nDay = atoi( cpCurrent );
|
|||
|
cpCurrent=FindChar(cpCurrent,'/');
|
|||
|
if ( strncmp(cpCurrent,szJan,3) == 0 )
|
|||
|
{
|
|||
|
nMonth = 1;
|
|||
|
} else if ( strncmp(cpCurrent,szFeb,3) == 0 )
|
|||
|
{
|
|||
|
nMonth = 2;
|
|||
|
} else if ( strncmp(cpCurrent,szMar,3) == 0 )
|
|||
|
{
|
|||
|
nMonth = 3;
|
|||
|
} else if ( strncmp(cpCurrent,szApr,3) == 0 )
|
|||
|
{
|
|||
|
nMonth = 4;
|
|||
|
} else if ( strncmp(cpCurrent,szMay,3) == 0 )
|
|||
|
{
|
|||
|
nMonth = 5;
|
|||
|
} else if ( strncmp(cpCurrent,szJun,3) == 0 )
|
|||
|
{
|
|||
|
nMonth = 6;
|
|||
|
} else if ( strncmp(cpCurrent,szJul,3) == 0 )
|
|||
|
{
|
|||
|
nMonth = 7;
|
|||
|
} else if ( strncmp(cpCurrent,szAug,3) == 0 )
|
|||
|
{
|
|||
|
nMonth = 8;
|
|||
|
} else if ( strncmp(cpCurrent,szSep,3) == 0 )
|
|||
|
{
|
|||
|
nMonth = 9;
|
|||
|
} else if ( strncmp(cpCurrent,szOct,3) == 0 )
|
|||
|
{
|
|||
|
nMonth = 10;
|
|||
|
} else if ( strncmp(cpCurrent,szNov,3) == 0 )
|
|||
|
{
|
|||
|
nMonth = 11;
|
|||
|
} else if ( strncmp(cpCurrent,szDec,3) == 0 )
|
|||
|
{
|
|||
|
nMonth = 12;
|
|||
|
}
|
|||
|
cpCurrent=FindChar(cpCurrent,'/');
|
|||
|
nYear = atoi( cpCurrent )%100;
|
|||
|
sprintf(pszRetDate,"%d/%d/%d",nMonth,nDay,nYear);
|
|||
|
return pszRetDate;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
/* #pragma INTRINSA suppress=all */
|
|||
|
DWORD
|
|||
|
GetLogLine (
|
|||
|
IN FILE *fpInFile,
|
|||
|
IN PCHAR szBuf,
|
|||
|
IN DWORD cbBuf,
|
|||
|
IN LPINLOGLINE lpLogLine
|
|||
|
)
|
|||
|
{
|
|||
|
BOOL bRetCode = GETLOG_ERROR;
|
|||
|
CHAR *cpCurrent;
|
|||
|
CHAR buf[8*1024];
|
|||
|
|
|||
|
static char szNULL[]="";
|
|||
|
static char szEmpty[]="-";
|
|||
|
static char szUnknownIP[] = "<UnknownIP>";
|
|||
|
static char szW3Svc[] = "W3Svc";
|
|||
|
static char szDefaultHTTPVersion[]="HTTP/1.0";
|
|||
|
|
|||
|
lpLogLine->szClientIP = szNULL;
|
|||
|
lpLogLine->szUserName = szNULL;
|
|||
|
lpLogLine->szDate = szNULL;
|
|||
|
lpLogLine->szTime = szNULL;
|
|||
|
lpLogLine->szService = szNULL;
|
|||
|
lpLogLine->szServerName = szNULL;
|
|||
|
lpLogLine->szServerIP = szNULL;
|
|||
|
lpLogLine->szProcTime = szNULL;
|
|||
|
lpLogLine->szBytesRec = szNULL;
|
|||
|
lpLogLine->szBytesSent = szNULL;
|
|||
|
lpLogLine->szServiceStatus = szNULL;
|
|||
|
lpLogLine->szWin32Status = szNULL;
|
|||
|
lpLogLine->szOperation = szNULL;
|
|||
|
lpLogLine->szTargetURL = szNULL;
|
|||
|
lpLogLine->szUserAgent = szNULL;
|
|||
|
lpLogLine->szReferer = szNULL;
|
|||
|
lpLogLine->szParameters = szNULL;
|
|||
|
lpLogLine->szVersion = szDefaultHTTPVersion;
|
|||
|
|
|||
|
if (NULL != fgets(szBuf, cbBuf, fpInFile)) {
|
|||
|
|
|||
|
szBuf = SkipWhite(szBuf);
|
|||
|
|
|||
|
if ((szBuf[0] != '\n') && ( szBuf[0] != '\0')) //is this an empty line?
|
|||
|
{
|
|||
|
bRetCode = GETLOG_SUCCESS;
|
|||
|
|
|||
|
//
|
|||
|
// set current char pointer to start of string
|
|||
|
//
|
|||
|
|
|||
|
cpCurrent = szBuf;
|
|||
|
|
|||
|
if ( LogFileFormat == LOGFILE_NCSA ) {
|
|||
|
|
|||
|
lpLogLine->szClientIP = szBuf;
|
|||
|
|
|||
|
cpCurrent = FindChar(cpCurrent, ' ');
|
|||
|
|
|||
|
lpLogLine->szClientIP = GetMachineName(lpLogLine->szClientIP);
|
|||
|
|
|||
|
sprintf( buf,"%s %s",lpLogLine->szClientIP,cpCurrent);
|
|||
|
strcpy( szBuf, buf);
|
|||
|
|
|||
|
//
|
|||
|
// After the strcpy the pointers cpCurrent and lpLogLine->szClientIP have
|
|||
|
// the potential to be miss alligned if the dns name is shorter or longer than the IP
|
|||
|
// address that it replaced. Simple fix reset the pointers to the beginning of the
|
|||
|
// string.
|
|||
|
//
|
|||
|
|
|||
|
lpLogLine->szClientIP = szBuf;
|
|||
|
cpCurrent = szBuf;
|
|||
|
|
|||
|
|
|||
|
while ((*cpCurrent != '\0') && (*cpCurrent != '[') ) {
|
|||
|
cpCurrent++;
|
|||
|
}
|
|||
|
|
|||
|
if ( *cpCurrent == '\0' ) {
|
|||
|
return(GETLOG_ERROR_PARSE_NCSA);
|
|||
|
}
|
|||
|
|
|||
|
} else if (LogFileFormat == LOGFILE_MSINET ) {
|
|||
|
|
|||
|
lpLogLine->szClientIP = szBuf;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
|
|||
|
if (DoDNSConversion) {
|
|||
|
lpLogLine->szClientIP = GetMachineName(
|
|||
|
lpLogLine->szClientIP
|
|||
|
);
|
|||
|
|
|||
|
if ( NoFormatConversion ) {
|
|||
|
sprintf( buf,"%s, %s",lpLogLine->szClientIP,cpCurrent);
|
|||
|
strcpy( szBuf, buf);
|
|||
|
return(GETLOG_SUCCESS);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
lpLogLine->szUserName = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szDate = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szTime = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szService = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szServerName = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szServerIP = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szProcTime = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szBytesRec = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szBytesSent = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szServiceStatus = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szWin32Status = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szOperation = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szTargetURL = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
lpLogLine->szParameters = cpCurrent;
|
|||
|
cpCurrent = FindMSINETLogDelimChar (cpCurrent);
|
|||
|
|
|||
|
if (lpLogLine->szClientIP[0] != '\0' &&
|
|||
|
lpLogLine->szUserName[0] != '\0' &&
|
|||
|
lpLogLine->szDate[0] != '\0' &&
|
|||
|
lpLogLine->szTime[0] != '\0' &&
|
|||
|
lpLogLine->szService[0] != '\0' &&
|
|||
|
lpLogLine->szServerName[0] != '\0' &&
|
|||
|
lpLogLine->szServerIP[0] != '\0' &&
|
|||
|
lpLogLine->szProcTime[0] != '\0' &&
|
|||
|
lpLogLine->szBytesRec[0] != '\0' &&
|
|||
|
lpLogLine->szBytesSent[0] != '\0' &&
|
|||
|
lpLogLine->szServiceStatus[0] != '\0' &&
|
|||
|
lpLogLine->szWin32Status[0] != '\0' &&
|
|||
|
lpLogLine->szOperation[0] != '\0' &&
|
|||
|
lpLogLine->szTargetURL[0] != '\0' &&
|
|||
|
lpLogLine->szParameters[0] != '\0'
|
|||
|
) {
|
|||
|
|
|||
|
bRetCode = GETLOG_SUCCESS;
|
|||
|
} else {
|
|||
|
return(GETLOG_ERROR_PARSE_MSINET);
|
|||
|
}
|
|||
|
|
|||
|
} else if ( LogFileFormat == LOGFILE_CUSTOM ) {
|
|||
|
|
|||
|
//
|
|||
|
// W3C Extended Logging
|
|||
|
//
|
|||
|
|
|||
|
if ( szBuf[0] == '#' ) {
|
|||
|
|
|||
|
PCHAR pszFields;
|
|||
|
cpCurrent = FindChar(cpCurrent, '#');
|
|||
|
bRetCode = GETLOG_SUCCESS;
|
|||
|
|
|||
|
if ( strncmp(cpCurrent, "Fields:", 7) == 0 ) {
|
|||
|
|
|||
|
DWORD pos;
|
|||
|
|
|||
|
//
|
|||
|
// init positions
|
|||
|
//
|
|||
|
|
|||
|
ExtendedFieldsDefined = TRUE;
|
|||
|
dwHostNamePos = 0;
|
|||
|
dwUserNamePos = 0;
|
|||
|
dwDatePos = 0;
|
|||
|
dwTimePos = 0;
|
|||
|
dwMethodPos = 0;
|
|||
|
dwURIStemPos = 0;
|
|||
|
dwURIQueryPos = 0;
|
|||
|
dwHTTPStatusPos = 0;
|
|||
|
dwBytesSentPos = 0;
|
|||
|
dwBytesRecvPos = 0;
|
|||
|
dwServicePos = 0;
|
|||
|
dwVersionPos = 0;
|
|||
|
|
|||
|
cpCurrent = FindChar(cpCurrent, ':');
|
|||
|
(VOID)FindChar( cpCurrent, '\n' );
|
|||
|
|
|||
|
for (pos = 1; *cpCurrent != '\0'; pos++) {
|
|||
|
|
|||
|
PCHAR pszField = cpCurrent;
|
|||
|
cpCurrent=FindChar(cpCurrent,' ');
|
|||
|
|
|||
|
if ( _stricmp( pszField, EXTLOG_CLIENT_IP_ID ) == 0 ) {
|
|||
|
dwHostNamePos = pos;
|
|||
|
} else if ( _stricmp( pszField, EXTLOG_USERNAME_ID ) == 0 ) {
|
|||
|
dwUserNamePos = pos;
|
|||
|
} else if ( _stricmp( pszField, EXTLOG_DATE_ID ) == 0 ) {
|
|||
|
dwDatePos = pos;
|
|||
|
} else if ( _stricmp( pszField, EXTLOG_TIME_ID ) == 0 ) {
|
|||
|
dwTimePos = pos;
|
|||
|
} else if ( _stricmp( pszField, EXTLOG_METHOD_ID ) == 0 ) {
|
|||
|
dwMethodPos = pos;
|
|||
|
} else if ( _stricmp( pszField, EXTLOG_URI_STEM_ID ) == 0 ) {
|
|||
|
dwURIStemPos = pos;
|
|||
|
} else if ( _stricmp( pszField, EXTLOG_URI_QUERY_ID ) == 0 ) {
|
|||
|
dwURIQueryPos = pos;
|
|||
|
} else if ( _stricmp( pszField, EXTLOG_HTTP_STATUS_ID ) == 0 ) {
|
|||
|
dwHTTPStatusPos = pos;
|
|||
|
} else if ( _stricmp( pszField, EXTLOG_BYTES_SENT_ID ) == 0 ) {
|
|||
|
dwBytesSentPos = pos;
|
|||
|
} else if ( _stricmp( pszField, EXTLOG_BYTES_RECV_ID ) == 0 ) {
|
|||
|
dwBytesRecvPos = pos;
|
|||
|
} else if ( _stricmp( pszField, EXTLOG_SITE_NAME_ID ) == 0 ) {
|
|||
|
dwServicePos = pos;
|
|||
|
} else if ( _stricmp( pszField, EXTLOG_PROTOCOL_VERSION_ID ) == 0 ) {
|
|||
|
dwVersionPos = pos;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if ( strncmp(cpCurrent, "Date:", 5) == 0 ) {
|
|||
|
|
|||
|
//
|
|||
|
// Grab the global date
|
|||
|
//
|
|||
|
|
|||
|
cpCurrent = FindChar(cpCurrent, ':');
|
|||
|
|
|||
|
CopyMemory(szGlobalDate,cpCurrent, sizeof("2000-01-01") - 1);
|
|||
|
szGlobalDate[10] = '\0';
|
|||
|
|
|||
|
//
|
|||
|
// And the global time
|
|||
|
//
|
|||
|
|
|||
|
cpCurrent = FindChar(cpCurrent, ' ');
|
|||
|
|
|||
|
CopyMemory(szGlobalTime,cpCurrent, sizeof("00:00:00") - 1);
|
|||
|
szGlobalTime[8] = '\0';
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
DWORD pos;
|
|||
|
PCHAR pszValue;
|
|||
|
|
|||
|
if ( !ExtendedFieldsDefined ) {
|
|||
|
return(GETLOG_ERROR_PARSE_EXTENDED);
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Need at least 1 valid entry in the log line other than date & time
|
|||
|
|
|||
|
if ( (dwHostNamePos == 0) &&
|
|||
|
(dwUserNamePos == 0) &&
|
|||
|
(dwMethodPos == 0) &&
|
|||
|
(dwURIStemPos == 0) &&
|
|||
|
(dwURIQueryPos == 0) &&
|
|||
|
(dwHTTPStatusPos == 0) &&
|
|||
|
(dwBytesSentPos == 0) &&
|
|||
|
(dwBytesRecvPos == 0) &&
|
|||
|
(dwServicePos == 0) &&
|
|||
|
(dwVersionPos == 0)
|
|||
|
)
|
|||
|
{
|
|||
|
return GETLOG_ERROR;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// loop through entries
|
|||
|
//
|
|||
|
|
|||
|
lpLogLine->szClientIP = szEmpty;
|
|||
|
lpLogLine->szUserName = szEmpty;
|
|||
|
lpLogLine->szDate = szEmpty;
|
|||
|
lpLogLine->szTime = szEmpty;
|
|||
|
lpLogLine->szOperation = szEmpty;
|
|||
|
lpLogLine->szTargetURL = szEmpty;
|
|||
|
lpLogLine->szParameters = szEmpty;
|
|||
|
lpLogLine->szServiceStatus = szEmpty;
|
|||
|
lpLogLine->szBytesSent = szEmpty;
|
|||
|
lpLogLine->szBytesRec = szEmpty;
|
|||
|
lpLogLine->szService = szW3Svc;
|
|||
|
lpLogLine->szVersion = szDefaultHTTPVersion;
|
|||
|
|
|||
|
(VOID)FindChar( cpCurrent, '\n' );
|
|||
|
for (pos = 1;
|
|||
|
*cpCurrent != '\0';
|
|||
|
pos++) {
|
|||
|
|
|||
|
pszValue = cpCurrent;
|
|||
|
cpCurrent = FindChar(cpCurrent,' ');
|
|||
|
|
|||
|
if ( pos == dwHostNamePos ) {
|
|||
|
lpLogLine->szClientIP = pszValue;
|
|||
|
if (DoDNSConversion) {
|
|||
|
lpLogLine->szClientIP = GetMachineName(
|
|||
|
lpLogLine->szClientIP
|
|||
|
);
|
|||
|
}
|
|||
|
} else if (pos == dwUserNamePos) {
|
|||
|
|
|||
|
lpLogLine->szUserName = pszValue;
|
|||
|
} else if (pos == dwDatePos) {
|
|||
|
|
|||
|
lpLogLine->szDate = pszValue;
|
|||
|
} else if (pos == dwTimePos) {
|
|||
|
|
|||
|
lpLogLine->szTime = pszValue;
|
|||
|
} else if (pos == dwMethodPos) {
|
|||
|
|
|||
|
lpLogLine->szOperation = pszValue;
|
|||
|
} else if (pos == dwURIStemPos) {
|
|||
|
|
|||
|
lpLogLine->szTargetURL = pszValue;
|
|||
|
} else if (pos == dwURIQueryPos) {
|
|||
|
|
|||
|
lpLogLine->szParameters = pszValue;
|
|||
|
} else if (pos == dwHTTPStatusPos) {
|
|||
|
|
|||
|
lpLogLine->szServiceStatus = pszValue;
|
|||
|
} else if (pos == dwBytesSentPos) {
|
|||
|
|
|||
|
lpLogLine->szBytesSent = pszValue;
|
|||
|
} else if (pos == dwBytesRecvPos) {
|
|||
|
|
|||
|
lpLogLine->szBytesRec = pszValue;
|
|||
|
} else if (pos == dwServicePos) {
|
|||
|
|
|||
|
lpLogLine->szService = pszValue;
|
|||
|
} else if (pos == dwVersionPos) {
|
|||
|
|
|||
|
lpLogLine->szVersion = pszValue;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if ( lpLogLine->szDate == szEmpty ) {
|
|||
|
lpLogLine->szDate = szGlobalDate;
|
|||
|
}
|
|||
|
|
|||
|
if ( lpLogLine->szTime == szEmpty ) {
|
|||
|
lpLogLine->szTime = szGlobalTime;
|
|||
|
}
|
|||
|
|
|||
|
bRetCode = GETLOG_SUCCESS;
|
|||
|
}
|
|||
|
}
|
|||
|
} // end if first char = NewLine
|
|||
|
} // end if fgets != NULL
|
|||
|
|
|||
|
return (bRetCode);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
WORD
|
|||
|
DateStringToDOSDate(
|
|||
|
IN PCHAR szDate
|
|||
|
)
|
|||
|
{
|
|||
|
char *szDay;
|
|||
|
char *szMonth;
|
|||
|
char *szYear;
|
|||
|
char *cpCurrent;
|
|||
|
char szTmpStr[20];
|
|||
|
int iYear;
|
|||
|
|
|||
|
if ( LogFileFormat == LOGFILE_CUSTOM ) {
|
|||
|
|
|||
|
strcpy (szTmpStr, szDate);
|
|||
|
cpCurrent = szTmpStr;
|
|||
|
|
|||
|
szYear = cpCurrent;
|
|||
|
cpCurrent = FindChar(cpCurrent,'-');
|
|||
|
|
|||
|
szMonth = cpCurrent;
|
|||
|
cpCurrent = FindChar(cpCurrent,'-');
|
|||
|
|
|||
|
szDay = cpCurrent;
|
|||
|
|
|||
|
iYear=atoi(szYear);
|
|||
|
if ( iYear > 1980 ) {
|
|||
|
iYear -= 1980;
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
strcpy (szTmpStr, szDate);
|
|||
|
cpCurrent = szTmpStr;
|
|||
|
|
|||
|
if ( dwDateFormat == DateFormatJapan ) {
|
|||
|
// YY/MM/DD
|
|||
|
szYear = cpCurrent;
|
|||
|
cpCurrent = FindChar (cpCurrent, '/');
|
|||
|
|
|||
|
szMonth = cpCurrent;
|
|||
|
cpCurrent = FindChar (cpCurrent, '/');
|
|||
|
|
|||
|
szDay = cpCurrent;
|
|||
|
} else if (dwDateFormat == DateFormatGermany ) {
|
|||
|
|
|||
|
// DD.MM.YY
|
|||
|
|
|||
|
szDay = cpCurrent;
|
|||
|
cpCurrent = FindChar (cpCurrent, '.');
|
|||
|
|
|||
|
szMonth = cpCurrent;
|
|||
|
cpCurrent = FindChar (cpCurrent, '.');
|
|||
|
|
|||
|
szYear = cpCurrent;
|
|||
|
|
|||
|
} else {
|
|||
|
// MM/DD/YY
|
|||
|
|
|||
|
szMonth = cpCurrent;
|
|||
|
cpCurrent = FindChar (cpCurrent, '/');
|
|||
|
|
|||
|
szDay = cpCurrent;
|
|||
|
cpCurrent = FindChar (cpCurrent, '/');
|
|||
|
|
|||
|
szYear = cpCurrent;
|
|||
|
}
|
|||
|
|
|||
|
iYear=atoi(szYear);
|
|||
|
|
|||
|
if ( iYear < 80 ) {
|
|||
|
iYear += 2000;
|
|||
|
}
|
|||
|
|
|||
|
if (iYear > 1980 ) {
|
|||
|
iYear = iYear - 1980;
|
|||
|
} else if (iYear >= 80 ) {
|
|||
|
iYear = iYear - 80;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return ((iYear << 9) | (atoi(szMonth) << 5) | atoi(szDay));
|
|||
|
|
|||
|
} // DateStringToDOSDate
|
|||
|
|
|||
|
|
|||
|
|
|||
|
WORD
|
|||
|
TimeStringToDOSTime(
|
|||
|
IN PCHAR szTime,
|
|||
|
IN LPWORD lpwSec
|
|||
|
)
|
|||
|
{
|
|||
|
char *cpCurrent;
|
|||
|
char *szHour;
|
|||
|
char *szMinute;
|
|||
|
char *szSecond;
|
|||
|
char szTmpStr[20];
|
|||
|
|
|||
|
strcpy (szTmpStr, szTime);
|
|||
|
cpCurrent = szTmpStr;
|
|||
|
|
|||
|
szHour = cpCurrent;
|
|||
|
cpCurrent = FindChar (cpCurrent, ':');
|
|||
|
|
|||
|
szMinute = cpCurrent;
|
|||
|
cpCurrent = FindChar (cpCurrent, ':');
|
|||
|
|
|||
|
szSecond = cpCurrent;
|
|||
|
*lpwSec = (WORD)atoi(szSecond);
|
|||
|
|
|||
|
return ( (atoi(szHour) << 11) | (atoi(szMinute) << 5) | (atoi(szSecond) / 2));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
char *
|
|||
|
AscMonth (
|
|||
|
IN WORD wMonth,
|
|||
|
IN char *szMonth
|
|||
|
)
|
|||
|
{
|
|||
|
switch (wMonth)
|
|||
|
{
|
|||
|
case 1:
|
|||
|
strncpy (szMonth, szJan, 3);
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
strncpy (szMonth, szFeb, 3);
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
strncpy (szMonth, szMar, 3);
|
|||
|
break;
|
|||
|
case 4:
|
|||
|
strncpy (szMonth, szApr, 3);
|
|||
|
break;
|
|||
|
case 5:
|
|||
|
strncpy (szMonth, szMay, 3);
|
|||
|
break;
|
|||
|
case 6:
|
|||
|
strncpy (szMonth, szJun, 3);
|
|||
|
break;
|
|||
|
case 7:
|
|||
|
strncpy (szMonth, szJul, 3);
|
|||
|
break;
|
|||
|
case 8:
|
|||
|
strncpy (szMonth, szAug, 3);
|
|||
|
break;
|
|||
|
case 9:
|
|||
|
strncpy (szMonth, szSep, 3);
|
|||
|
break;
|
|||
|
case 10:
|
|||
|
strncpy (szMonth, szOct, 3);
|
|||
|
break;
|
|||
|
case 11:
|
|||
|
strncpy (szMonth, szNov, 3);
|
|||
|
break;
|
|||
|
case 12:
|
|||
|
strncpy (szMonth, szDec, 3);
|
|||
|
break;
|
|||
|
} //end switch
|
|||
|
szMonth[3] = '\0';
|
|||
|
return (szMonth);
|
|||
|
} //end AscMonth
|
|||
|
|
|||
|
|
|||
|
|
|||
|
FILE *
|
|||
|
StartNewOutputLog (
|
|||
|
IN LPOUTFILESTATUS pOutFile,
|
|||
|
IN LPCSTR pszInFileName,
|
|||
|
IN PCHAR szDate
|
|||
|
)
|
|||
|
{
|
|||
|
BOOL bRet;
|
|||
|
DWORD dwErr;
|
|||
|
|
|||
|
if (pOutFile->fpOutFile != NULL ) {
|
|||
|
|
|||
|
fclose(pOutFile->fpOutFile);
|
|||
|
pOutFile->fpOutFile = NULL;
|
|||
|
|
|||
|
bRet = MoveFileEx(
|
|||
|
pOutFile->szTmpFileName,
|
|||
|
pOutFile->szOutFileName,
|
|||
|
MOVEFILE_COPY_ALLOWED);
|
|||
|
|
|||
|
if (!bRet) {
|
|||
|
|
|||
|
dwErr = GetLastError();
|
|||
|
switch (dwErr)
|
|||
|
{
|
|||
|
case ERROR_FILE_EXISTS:
|
|||
|
case ERROR_ALREADY_EXISTS:
|
|||
|
CombineFiles(
|
|||
|
pOutFile->szTmpFileName,
|
|||
|
pOutFile->szOutFileName);
|
|||
|
break;
|
|||
|
case ERROR_PATH_NOT_FOUND:
|
|||
|
break;
|
|||
|
default:
|
|||
|
printfids(IDS_FILE_ERR, dwErr);
|
|||
|
exit (1);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
printfids(IDS_FILE_CLOSE, pOutFile->szOutFileName);
|
|||
|
}
|
|||
|
|
|||
|
dwErr = GetTempPath(MAX_PATH, TempDir);
|
|||
|
|
|||
|
if (0 != dwErr) {
|
|||
|
GetTempFileName(TempDir, "mhi", 0, pOutFile->szTmpFileName);
|
|||
|
} else {
|
|||
|
GetTempFileName(".", "mhi", 0, pOutFile->szTmpFileName);
|
|||
|
}
|
|||
|
|
|||
|
pOutFile->fpOutFile = fopen(pOutFile->szTmpFileName, "w");
|
|||
|
|
|||
|
sprintf(pOutFile->szOutFileName,
|
|||
|
"%s%s%s",
|
|||
|
OutputDir,
|
|||
|
pszInFileName,
|
|||
|
DoDNSConversion? ".ncsa.dns" : ".ncsa"
|
|||
|
);
|
|||
|
|
|||
|
printfids (IDS_FILE_WRITE, pOutFile->szOutFileName);
|
|||
|
|
|||
|
return (pOutFile->fpOutFile);
|
|||
|
|
|||
|
} // StartNewOutputLog
|
|||
|
|
|||
|
|
|||
|
|
|||
|
FILE *
|
|||
|
StartNewOutputDumpLog (
|
|||
|
IN LPOUTFILESTATUS pOutFile,
|
|||
|
IN LPCSTR pszInputFileName,
|
|||
|
IN LPCSTR pszExt
|
|||
|
)
|
|||
|
{
|
|||
|
BOOL bRet;
|
|||
|
DWORD dwErr;
|
|||
|
|
|||
|
dwErr = GetTempPath(MAX_PATH, TempDir);
|
|||
|
|
|||
|
if (0 != dwErr) {
|
|||
|
GetTempFileName(TempDir, "mhi", 0, pOutFile->szTmpFileName);
|
|||
|
} else {
|
|||
|
GetTempFileName(".", "mhi", 0, pOutFile->szTmpFileName);
|
|||
|
}
|
|||
|
|
|||
|
pOutFile->fpOutFile = fopen(pOutFile->szTmpFileName, "w");
|
|||
|
|
|||
|
sprintf(pOutFile->szOutFileName,"%s%s%s",
|
|||
|
OutputDir, pszInputFileName,
|
|||
|
pszExt
|
|||
|
);
|
|||
|
|
|||
|
printfids (IDS_FILE_WRITE, pOutFile->szOutFileName);
|
|||
|
return (pOutFile->fpOutFile);
|
|||
|
|
|||
|
} // StartNewOutputDumpLog
|
|||
|
|
|||
|
|
|||
|
/* #pragma INTRINSA suppress=all */
|
|||
|
VOID
|
|||
|
CombineFiles(
|
|||
|
IN LPTSTR lpszNew,
|
|||
|
IN LPTSTR lpszExisting
|
|||
|
)
|
|||
|
{
|
|||
|
FILE *fpExisting;
|
|||
|
FILE *fpNew;
|
|||
|
char szLine[4096];
|
|||
|
|
|||
|
printfids(IDS_FILE_EXIST, lpszExisting);
|
|||
|
fpNew = fopen(lpszNew, "r");
|
|||
|
fpExisting = fopen(lpszExisting, "a");
|
|||
|
|
|||
|
fgets(szLine, sizeof(szLine), fpNew);
|
|||
|
// last line contains only EOF, but does not overwrite szLine.
|
|||
|
// It should not be written.
|
|||
|
while (!feof(fpNew))
|
|||
|
{
|
|||
|
fputs(szLine, fpExisting);
|
|||
|
fgets(szLine, sizeof(szLine), fpNew);
|
|||
|
}
|
|||
|
|
|||
|
if (fpNew) {
|
|||
|
fclose(fpNew);
|
|||
|
}
|
|||
|
|
|||
|
if (fpExisting) {
|
|||
|
fclose(fpExisting);
|
|||
|
}
|
|||
|
|
|||
|
DeleteFile(lpszNew);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
Usage(
|
|||
|
IN PCHAR szProg
|
|||
|
)
|
|||
|
{
|
|||
|
CHAR szTemp[MAX_PATH];
|
|||
|
|
|||
|
GetTempPath(MAX_PATH, szTemp);
|
|||
|
|
|||
|
printfids(IDS_HEADER1);
|
|||
|
printfids(IDS_HEADER2);
|
|||
|
printfids(IDS_HEADER3);
|
|||
|
printfids(IDS_HEADER4);
|
|||
|
|
|||
|
printfids(IDS_USAGE1, szProg);
|
|||
|
printfids(IDS_USAGE2);
|
|||
|
printfids(IDS_USAGE3);
|
|||
|
printfids(IDS_USAGE4);
|
|||
|
printfids(IDS_USAGE5);
|
|||
|
printfids(IDS_USAGE7);
|
|||
|
printfids(IDS_USAGE8);
|
|||
|
printfids(IDS_USAGE9);
|
|||
|
printfids(IDS_USAGE10);
|
|||
|
printfids(IDS_USAGE11);
|
|||
|
printfids(IDS_USAGE12);
|
|||
|
printfids(IDS_USAGE13);
|
|||
|
printfids(IDS_USAGE14);
|
|||
|
printfids(IDS_USAGE15);
|
|||
|
printfids(IDS_USAGE16);
|
|||
|
|
|||
|
printfids(IDS_SAMPLE0, szProg);
|
|||
|
printfids(IDS_SAMPLE1, szProg);
|
|||
|
printfids(IDS_SAMPLE2, szProg);
|
|||
|
printfids(IDS_SAMPLE3, szProg);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
printfids(
|
|||
|
IN DWORD ids,
|
|||
|
...
|
|||
|
)
|
|||
|
{
|
|||
|
CHAR szBuff[2048];
|
|||
|
CHAR szString[2048];
|
|||
|
WCHAR szOutput[2048];
|
|||
|
va_list argList;
|
|||
|
|
|||
|
//
|
|||
|
// Try and load the string
|
|||
|
//
|
|||
|
|
|||
|
if ( !LoadString( GetModuleHandle( NULL ),
|
|||
|
ids,
|
|||
|
szString,
|
|||
|
sizeof( szString ) ))
|
|||
|
{
|
|||
|
printf( "Error loading string ID %d\n",
|
|||
|
ids );
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
va_start( argList, ids );
|
|||
|
vsprintf( szBuff, szString, argList );
|
|||
|
va_end( argList );
|
|||
|
|
|||
|
MultiByteToWideChar( CP_ACP, 0, szBuff, -1, szOutput, sizeof(szOutput)/sizeof(WCHAR));
|
|||
|
|
|||
|
WideCharToMultiByte( GetConsoleOutputCP(), 0, szOutput, wcslen(szOutput)+1,
|
|||
|
szBuff, sizeof(szBuff), NULL, NULL);
|
|||
|
|
|||
|
printf(szBuff );
|
|||
|
}
|
|||
|
|