Knowledge Base Nr: 00114 filter.cpp - http://www.swe-kaiser.de

Downloads:

Win32: konsolenapplikation filtert daten von stdin, bereitet sie auf und schreibt nach stdout.
es kann ein anfangs- und endestring angegeben werden. (z.b. windump ausgabe filtern

  
//folgende teilstrings im cfg-file werden ersetzt:
\r : 0x0d CR
\n 0x0a LF

//aufruf mit windump gibt alle header aus und unterdrückt ansonsten alles.
windump -i3 -t -s0 -q -X -w"-" tcp port 80 | filter.exe filter.cfg > headers.log

filter.cfg:
###############################################################

#http-header only:
[filter]
start=HTTP/1.0
end=\r\n\r\n
delimstart=\r\n####start####\r\nHTTP/1.0
delimend=\r\n####end####\r\n\r\n

#gmx mails extrahieren:
# start=class="mailprint">
# end=</td>\r\n</tr>\r\n</table>
# delimstart=\r\n####mail####\r\n
# delimend=\r\n########\r\n\r\n

###############################################################

//filter.cpp : liest von stdin und filtert nack kriterien in cfg-file

#include "stdafx.h"
#include <io.h>
#include <fcntl.h>

#include "filter.h"
#include "..\cpp_classes\NetSupport.h"
#include "..\cpp_classes\ProcessSupport.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

//konfig-file als kommandozeilenparameter
//-> g_proc mit new anlegen oder funktion zum setzen des cfg-files
//in kbase stellen als filter.cpp

using namespace std;

void replaceSpecials(char* szIn)
{
char szTmp[10];
CString str(szIn);

szTmp[0] = 0x0d; szTmp[1] = 0;
str.Replace("\\r", szTmp);

szTmp[0] = 0x0a; szTmp[1] = 0;
str.Replace("\\n", szTmp);

strcpy(szIn, str);
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
CProcessSupport* g_pProc = 0;

int nRetCode = 0;

if (argc<2)
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: filterfile nicht angegeben") << endl;
return -1;
}

g_pProc = new CProcessSupport(0, argv[1]);

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
//gmx spezifisch!
//const char* szSTART_OF_FILTER = "class=\"mailprint\"";
//const char* szEND_OF_FILTER = "</td>\r\n</tr>";

char szSTART_OF_FILTER[200] = "HTTP/1.0";
char szEND_OF_FILTER[200] = "Server:";
char szDELIMITERSTART[200] = "\n\n###########################\n";
char szDELIMITEREND[200] = "\n\n###########################\n";

g_pProc->ReadIniEntry("filter", "start", szSTART_OF_FILTER, sizeof(szSTART_OF_FILTER), szSTART_OF_FILTER);
g_pProc->ReadIniEntry("filter", "end", szEND_OF_FILTER, sizeof(szEND_OF_FILTER), szEND_OF_FILTER);
g_pProc->ReadIniEntry("filter", "delimstart", szDELIMITERSTART, sizeof(szDELIMITERSTART), szDELIMITERSTART);
g_pProc->ReadIniEntry("filter", "delimend", szDELIMITEREND, sizeof(szDELIMITEREND), szDELIMITEREND);

replaceSpecials(szSTART_OF_FILTER);
replaceSpecials(szEND_OF_FILTER);
replaceSpecials(szDELIMITERSTART);
replaceSpecials(szDELIMITEREND);

const MAX_BUFF = 40000;
char buffer[MAX_BUFF];

int fh = _fileno(stdin);

bool bDoLog = false;

int result = _setmode(_fileno( stdin ), _O_BINARY);

int nRead = read(fh, buffer, sizeof(buffer));
while (nRead>0)
{
buffer[nRead] = 0;
for (int n=0; n<nRead; n++)
{
if (!isascii(buffer[n]) || (buffer[n]==0)) //stringende 0 in telegramm - z.b. bei gmx vor mailtest
buffer[n] = ' ';
}

//printf("(%d) %s\n", nRead, buffer);

char* p = strstr(buffer, szSTART_OF_FILTER);
if (p != NULL)
{
strcpy(buffer, p);
bDoLog = true;
}
char* p2 = strstr(buffer, szEND_OF_FILTER);
if (p2)
*p2 = 0;

//type "e:\temp\Copy of windump.log" | .\parsewindumpcon.exe
if (bDoLog)
{
CString str(buffer);

str.Replace(szSTART_OF_FILTER, szDELIMITERSTART);

str.Replace("<br>\n", "\r\n");
CNetSupport::ConvertFromHTTP(str);

printf("%s", (const char*)str);
fflush(stdout);
}

if (p2 != NULL)
{
if (bDoLog)
{
printf(szDELIMITEREND);
fflush(stdout);
}
bDoLog = false;
}

nRead = read(fh, buffer, sizeof(buffer));
}
}

printf("\n\nFilter fertig!\n");
fflush(stdout);

if (g_pProc)
delete g_pProc;

return nRetCode;
}