summaryrefslogtreecommitdiff
path: root/libopie2
Side-by-side diff
Diffstat (limited to 'libopie2') (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opienet/opcap.cpp40
-rw-r--r--libopie2/opienet/opcap.h21
2 files changed, 47 insertions, 14 deletions
diff --git a/libopie2/opienet/opcap.cpp b/libopie2/opienet/opcap.cpp
index bef9182..1de7124 100644
--- a/libopie2/opienet/opcap.cpp
+++ b/libopie2/opienet/opcap.cpp
@@ -863,8 +863,19 @@ bool OPacketCapturer::blocking() const
return !b;
}
+void OPacketCapturer::closeDumpFile()
+{
+ if ( _pcd )
+ {
+ pcap_dump_close( _pcd );
+ _pcd = 0;
+ }
+ pcap_close( _pch );
+}
+
+
void OPacketCapturer::close()
{
if ( _open )
{
@@ -872,14 +883,9 @@ void OPacketCapturer::close()
{
_sn->disconnect( SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) );
delete _sn;
}
- if ( _pcd )
- {
- pcap_dump_close( _pcd );
- _pcd = 0;
- }
- pcap_close( _pch );
+ closeDumpFile();
_open = false;
}
qDebug( "OPacketCapturer::close() --- dumping capturing statistics..." );
@@ -896,8 +902,19 @@ int OPacketCapturer::dataLink() const
return pcap_datalink( _pch );
}
+void OPacketCapturer::dump( OPacket* p )
+{
+ if ( !_pcd )
+ {
+ qWarning( "OPacketCapturer::dump() - cannot dump without open capture file!" );
+ return;
+ }
+ pcap_dump( (u_char*) _pcd, &p->_hdr, p->_data );
+}
+
+
int OPacketCapturer::fileno() const
{
if ( _open )
{
@@ -914,10 +931,8 @@ 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 ( pdata && header.len )
{
OPacket* p = new OPacket( dataLink(), header, pdata, 0 );
@@ -937,9 +952,9 @@ OPacket* OPacketCapturer::next()
}
}
-bool OPacketCapturer::open( const QString& name, const QString& filename )
+bool OPacketCapturer::open( const QString& name )
{
if ( _open )
{
if ( name == _name ) // ignore opening an already openend device
@@ -974,9 +989,14 @@ bool OPacketCapturer::open( const QString& name, const QString& filename )
_sn = new QSocketNotifier( fileno(), QSocketNotifier::Read );
connect( _sn, SIGNAL( activated(int) ), this, SLOT( readyToReceive() ) );
}
- // if requested, open a dump
+ return true;
+}
+
+
+bool OPacketCapturer::openDumpFile( const QString& filename )
+{
pcap_dumper_t* dump = pcap_dump_open( _pch, const_cast<char*>( (const char*) filename ) );
if ( !dump )
{
qWarning( "OPacketCapturer::open(): can't open dump with '%s': %s", (const char*) filename, _errbuf );
diff --git a/libopie2/opienet/opcap.h b/libopie2/opienet/opcap.h
index ad5b07c..9119972 100644
--- a/libopie2/opienet/opcap.h
+++ b/libopie2/opienet/opcap.h
@@ -114,8 +114,10 @@ class QSocketNotifier;
class OPacket : public QObject
{
Q_OBJECT
+ friend class OPacketCapturer;
+
public:
OPacket( int datalink, packetheaderstruct, const unsigned char*, QObject* parent );
virtual ~OPacket();
@@ -523,26 +525,34 @@ class OPacketCapturer : public QObject
* Destructor.
*/
~OPacketCapturer();
/**
- * Setting the packet capturer to use blocking IO calls can be useful when
+ * Set the packet capturer to use blocking or non-blocking IO. This can be useful when
* not using the socket notifier, e.g. without an application object.
*/
void setBlocking( bool );
/**
* @returns true if the packet capturer uses blocking IO calls.
*/
bool blocking() const;
/**
- * Closes the packet capturer. This is automatically done in the destructor.
+ * Close the packet capturer. This is automatically done in the destructor.
*/
void close();
/**
+ * Close the output capture file.
+ */
+ void closeDumpFile();
+ /**
* @returns the data link type.
* @see <pcap.h> for possible values.
*/
int dataLink() const;
/**
+ * Dump a packet to the output capture file.
+ */
+ void dump( OPacket* );
+ /**
* @returns the file descriptor of the packet capturer. This is only useful, if
* not using the socket notifier, e.g. without an application object.
*/
int fileno() const;
@@ -552,16 +562,19 @@ class OPacketCapturer : public QObject
*/
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, const QString& filename = QString::null );
+ bool open( const QString& interface );
/**
* Open the packet capturer to capture packets in offline-mode from @a file.
*/
bool open( const QFile& file );
/**
+ * Open a prerecorded tcpdump compatible capture file for use with @ref dump()
+ */
+ bool openDumpFile( const QString& filename );
+ /**
* @returns true if the packet capturer is open
*/
bool isOpen() const;
/**