From fd2bbf9a09aa7a13bd8a43db351b9153e5a4b7ab Mon Sep 17 00:00:00 2001 From: mickeyl Date: Sat, 01 May 2004 16:15:05 +0000 Subject: - be really paranoid about wireless extension versions for compile time vs. run time - register handlers for SIGSEGV and SIGBUG to emergency-close the capture file --- diff --git a/noncore/net/wellenreiter/ChangeLog b/noncore/net/wellenreiter/ChangeLog index fdc8aa7..b59f9f9 100644 --- a/noncore/net/wellenreiter/ChangeLog +++ b/noncore/net/wellenreiter/ChangeLog @@ -1,5 +1,8 @@ 2004-??-?? Michael Lauer + * Registered a signal handler. We're now trying to gracefully exit and emergency close capture files. + This should allow reproducing failures. + * Added sanity check for compile time vs. run time Wireless Extension versions. * Added sanity check isPresent(interface) before starting the engine. * Added a View submenu. Added actions to expand and collapse all items. * Switched to a (hopefully) more reliable method reading from gpsd. diff --git a/noncore/net/wellenreiter/TODO b/noncore/net/wellenreiter/TODO index 0640d23..f0a193d 100644 --- a/noncore/net/wellenreiter/TODO +++ b/noncore/net/wellenreiter/TODO @@ -22,7 +22,7 @@ - enable multiple packet sources - infrared - bluetooth - - usb? + - usb - define packet structure in a metalanguage and generate the actual parsing code (hmmm) @@ -36,7 +36,7 @@ - enable sniffing in wired networks -- fix autodetection (interface name) +- fix autodetection (the interface name is not selected correctly) - use ethtool IOCTLs (if present) @@ -73,5 +73,3 @@ # $DateGMT: 2004-02-07 N 41.1008009 W 8.3893034 ( Porceven ) BBS ( 00:a0:f8:41:91:63 ) 22:32:39 (GMT) [ 21 177 156 ] -- add SIGSEGV handler for emergency closing the capture file etc. - diff --git a/noncore/net/wellenreiter/gui/wellenreiter.cpp b/noncore/net/wellenreiter/gui/wellenreiter.cpp index 40cd105..12b3978 100644 --- a/noncore/net/wellenreiter/gui/wellenreiter.cpp +++ b/noncore/net/wellenreiter/gui/wellenreiter.cpp @@ -58,6 +58,9 @@ using namespace Opie::Ui; #include #include #include +#include + +Wellenreiter* Wellenreiter::instance = 0; Wellenreiter::Wellenreiter( QWidget* parent ) : WellenreiterBase( parent, 0, 0 ), @@ -87,22 +90,53 @@ Wellenreiter::Wellenreiter( QWidget* parent ) QTimer::singleShot( 1000, this, SLOT( initialTimer() ) ); + registerSignalHandler(); } Wellenreiter::~Wellenreiter() { delete pcap; + //unregisterSignalHandler(); } void Wellenreiter::initialTimer() { - odebug << "Wellenreiter::preloading manufacturer database..." << oendl; + odebug << "preloading manufacturer database..." << oendl; OManufacturerDB::instance(); } +void Wellenreiter::signalHandler( int sig ) +{ + oerr << "Aye! Received SIGSEGV or SIGBUS! Trying to exit gracefully..." << oendl; + if ( Wellenreiter::instance->sniffing ) + { + Wellenreiter::instance->pcap->close(); + Wellenreiter::instance->stopClicked(); + } + oerr << "Phew. Seemed to work." << oendl; + ::exit( -1 ); +} + + +void Wellenreiter::registerSignalHandler() +{ + Wellenreiter::instance = this; + struct sigaction action; + + action.sa_handler = Wellenreiter::signalHandler; + if (sigemptyset(&action.sa_mask)) + oerr << "sigemptyset() failure:" << strerror( errno ) << oendl; + if (sigaction(SIGSEGV, &action, NULL)) + oerr << "can't set up a signal handler for SIGSEGV:" << strerror( errno ) << oendl; + if (sigaction(SIGBUS, &action, NULL)) + oerr << "can't set up a signal handler for SIGBUS:" << strerror( errno ) << oendl; + odebug << "signal handlers setup." << oendl; +} + + void Wellenreiter::setConfigWindow( WellenreiterConfigWindow* cw ) { configwindow = cw; @@ -502,7 +536,7 @@ void Wellenreiter::startClicked() if ( ( interface == "" ) || ( cardtype == 0 ) ) { QMessageBox::information( this, "Wellenreiter II", - tr( "Your device is not\nproperly configured. Please reconfigure!" ) ); + tr( "No device configured.\nPlease reconfigure!" ) ); return; } @@ -532,6 +566,16 @@ void Wellenreiter::startClicked() tr( "Can't bring interface '%1' up:\n" ).arg( iface->name() ) + strerror( errno ) ); return; } + + // check if wireless extension version matches + if ( ONetwork::wirelessExtensionCompileVersion() != iface->wirelessExtensionDriverVersion() ) + { + QMessageBox::critical( this, "Wellenreiter II", tr( "

The Wireless Extension Versions
are not matching!

" + " Wellenreiter II : WE V%1
Interface driver: WE V%2" ) + .arg( QString::number( ONetwork::wirelessExtensionCompileVersion() ) ) + .arg( QString::number( iface->wirelessExtensionDriverVersion() ) ) ); + return; + } } // set monitor mode bool usePrism = configwindow->usePrismHeader(); diff --git a/noncore/net/wellenreiter/gui/wellenreiter.h b/noncore/net/wellenreiter/gui/wellenreiter.h index f609ef4..32e5690 100644 --- a/noncore/net/wellenreiter/gui/wellenreiter.h +++ b/noncore/net/wellenreiter/gui/wellenreiter.h @@ -20,6 +20,8 @@ #include #endif +#include + class QTimerEvent; class QPixmap; namespace Opie {namespace Net {class OPacket;}} @@ -54,6 +56,8 @@ class Wellenreiter : public WellenreiterBase { public: bool sniffing; + static Wellenreiter* instance; + static void signalHandler( int sig ); protected: virtual void timerEvent( QTimerEvent* ); @@ -86,6 +90,7 @@ class Wellenreiter : public WellenreiterBase { void doAction( const QString& action, const QString& protocol, Opie::Net::OPacket* p ); QObject* childIfToParse( Opie::Net::OPacket* p, const QString& protocol ); bool checkDumpPacket( Opie::Net::OPacket* p ); + void registerSignalHandler(); private: #ifdef QWS -- cgit v0.9.0.2