summaryrefslogtreecommitdiff
path: root/libopie2
Side-by-side diff
Diffstat (limited to 'libopie2') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opienet/opcap.cpp47
-rw-r--r--libopie2/opienet/opcap.h4
2 files changed, 34 insertions, 17 deletions
diff --git a/libopie2/opienet/opcap.cpp b/libopie2/opienet/opcap.cpp
index 30f6208..04b1bb1 100644
--- a/libopie2/opienet/opcap.cpp
+++ b/libopie2/opienet/opcap.cpp
@@ -731,13 +731,13 @@ OWaveLanControlPacket::~OWaveLanControlPacket()
/*======================================================================================
* OPacketCapturer
*======================================================================================*/
OPacketCapturer::OPacketCapturer( QObject* parent, const char* name )
:QObject( parent, name ), _name( QString::null ), _open( false ),
- _pch( 0 ), _sn( 0 )
+ _pch( 0 ), _pcd( 0 ), _sn( 0 )
{
}
OPacketCapturer::~OPacketCapturer()
{
@@ -780,12 +780,17 @@ void OPacketCapturer::close()
{
if ( _sn )
{
_sn->disconnect( SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) );
delete _sn;
}
+ if ( _pcd )
+ {
+ pcap_dump_close( _pcd );
+ _pcd = 0;
+ }
pcap_close( _pch );
_open = false;
}
qDebug( "OPacketCapturer::close() --- dumping capturing statistics..." );
qDebug( "--------------------------------------------------" );
@@ -817,12 +822,14 @@ int OPacketCapturer::fileno() const
OPacket* OPacketCapturer::next()
{
packetheaderstruct header;
qDebug( "==> OPacketCapturer::next()" );
const unsigned char* pdata = pcap_next( _pch, &header );
qDebug( "<== OPacketCapturer::next()" );
+ if ( _pcd )
+ pcap_dump( (u_char*) _pcd, &header, pdata );
if ( header.len )
{
OPacket* p = new OPacket( dataLink(), header, pdata, 0 );
// packets shouldn't be inserted in the QObject child-parent hierarchy,
// because due to memory constraints they will be deleted as soon
@@ -837,13 +844,13 @@ OPacket* OPacketCapturer::next()
{
return 0;
}
}
-bool OPacketCapturer::open( const QString& name )
+bool OPacketCapturer::open( const QString& name, const QString& filename )
{
if ( _open )
{
if ( name == _name ) // ignore opening an already openend device
{
return true;
@@ -853,36 +860,44 @@ bool OPacketCapturer::open( const QString& name )
close();
}
}
_name = name;
+ // open libpcap
pcap_t* handle = pcap_open_live( const_cast<char*>( (const char*) name ), 1024, 0, 0, &_errbuf[0] );
- if ( handle )
+ if ( !handle )
{
- qDebug( "OPacketCapturer::open(): libpcap opened successfully." );
- _pch = handle;
- _open = true;
- _stats.clear();
+ qWarning( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf );
+ return false;
+ }
- // in case we have an application object, create a socket notifier
- if ( qApp )
- {
- _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read );
- connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) );
- }
+ qDebug( "OPacketCapturer::open(): libpcap [%s] opened successfully.", (const char*) name );
+ _pch = handle;
+ _open = true;
+ _stats.clear();
- return true;
+ // in case we have an application object, create a socket notifier
+ if ( qApp ) //TODO: I don't like this here...
+ {
+ _sn = new QSocketNotifier( fileno(), QSocketNotifier::Read );
+ connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) );
}
- else
+
+ // if requested, open a dump
+ pcap_dumper_t* dump = pcap_dump_open( _pch, const_cast<char*>( (const char*) filename ) );
+ if ( !dump )
{
- qDebug( "OPacketCapturer::open(): can't open libpcap with '%s': %s", (const char*) name, _errbuf );
+ qWarning( "OPacketCapturer::open(): can't open dump with '%s': %s", (const char*) filename, _errbuf );
return false;
}
+ qDebug( "OPacketCapturer::open(): dump [%s] opened successfully.", (const char*) filename );
+ _pcd = dump;
+ return true;
}
bool OPacketCapturer::open( const QFile& file )
{
QString name = file.name();
diff --git a/libopie2/opienet/opcap.h b/libopie2/opienet/opcap.h
index 6c3ac6d..99631ba 100644
--- a/libopie2/opienet/opcap.h
+++ b/libopie2/opienet/opcap.h
@@ -467,14 +467,15 @@ class OPacketCapturer : public QObject
* @returns the next @ref OPacket from the packet capturer.
* @note If blocking mode is true then this call might block.
*/
OPacket* next();
/**
* Open the packet capturer to capture packets in live-mode from @a interface.
+ * If a @a filename is given, all captured packets are output to a tcpdump-compatible capture file.
*/
- bool open( const QString& interface );
+ bool open( const QString& interface, const QString& filename = QString::null );
/**
* Open the packet capturer to capture packets in offline-mode from @a file.
*/
bool open( const QFile& file );
/**
* @returns true if the packet capturer is open
@@ -493,12 +494,13 @@ class OPacketCapturer : public QObject
void readyToReceive();
protected:
QString _name; // devicename
bool _open; // check this before doing pcap calls
pcap_t* _pch; // pcap library handle
+ pcap_dumper_t* _pcd; // pcap dumper handle
QSocketNotifier* _sn; // socket notifier for main loop
mutable char _errbuf[PCAP_ERRBUF_SIZE]; // holds error strings from libpcap
QMap<QString, int> _stats; // statistics;
};
#endif // OPCAP_H