summaryrefslogtreecommitdiffstats
path: root/src/tools
diff options
context:
space:
mode:
authorAndrew Stanley-Jones <andrew.stanley-jones@nokia.com>2012-06-19 16:35:29 +1000
committerQt by Nokia <qt-info@nokia.com>2012-06-20 07:44:33 +0200
commit19a2a628a64a7f924411d7b43854ab053d01cd7e (patch)
treee844c407dcd40156078ad0c26ba7856bb4beb511 /src/tools
parent761640c36a3127be7993f669b7206bdd37125d8d (diff)
Fix sfwlisten
If sfwlisten listens on several interfaces it could crash since the QUdpSocket was delete. Change-Id: I0a91a98477b70fa01ac2493a5f7ac1915498bc73 Reviewed-by: Zsolt Simon <zsolt.simon@nokia.com> Reviewed-by: Lincoln Ramsay <lincoln.ramsay@nokia.com>
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/sfwlisten/main.cpp128
1 files changed, 67 insertions, 61 deletions
diff --git a/src/tools/sfwlisten/main.cpp b/src/tools/sfwlisten/main.cpp
index 87a91efe..a4a4ddeb 100644
--- a/src/tools/sfwlisten/main.cpp
+++ b/src/tools/sfwlisten/main.cpp
@@ -70,7 +70,7 @@ public slots:
private:
QString intfFilter;
QTimer socketCheck;
- QUdpSocket *socket;
+ QList<QUdpSocket *> sockets;
};
SFWReceiver::SFWReceiver(const QString &intfFilter) : intfFilter(intfFilter)
@@ -93,7 +93,7 @@ void SFWReceiver::makeSockets()
|| intf.name().startsWith("tun") || intf.name().startsWith("tap"))
continue;
- socket = new QUdpSocket(this);
+ QUdpSocket *socket = new QUdpSocket(this);
printf("Trying interface %s ...", qPrintable(intf.name()));
if (!socket->bind(QHostAddress::AnyIPv4, 10520, QUdpSocket::ShareAddress)) {
printf("Couldn't bind: %s\n", qPrintable(socket->errorString()));
@@ -108,6 +108,7 @@ void SFWReceiver::makeSockets()
}
printf("ok\n");
+ sockets.append(socket);
if (!gotone) {
connect(socket, SIGNAL(readyRead()),
this, SLOT(socketReadyRead()));
@@ -128,94 +129,99 @@ void SFWReceiver::socketVerify()
{
QList<QNetworkInterface> intfs = QNetworkInterface::allInterfaces();
bool gotone = false;
- QString name = socket->multicastInterface().name();
- foreach (const QNetworkInterface &intf, intfs) {
- if (intf.name() == name) {
- gotone = true;
- break;
+ foreach (QUdpSocket *socket, sockets) {
+ QString name = socket->multicastInterface().name();
+
+ foreach (const QNetworkInterface &intf, intfs) {
+ if (intf.name() == name) {
+ gotone = true;
+ break;
+ }
}
- }
- if (!gotone) {
- printf("Interface down...\n");
- delete socket;
- socket = 0;
- makeSockets();
+ if (!gotone) {
+ printf("Interface down...\n");
+ delete socket;
+ sockets.removeAll(socket);
+ makeSockets();
+ }
}
}
void SFWReceiver::socketReadyRead()
{
- QString intf = socket->multicastInterface().name();
-
- while (socket->hasPendingDatagrams()) {
- QByteArray dgram;
- dgram.resize(socket->pendingDatagramSize());
- socket->readDatagram(dgram.data(), dgram.size());
-
- QBuffer buff(&dgram);
- buff.open(QIODevice::ReadOnly);
- QDataStream ds(&buff);
-
- quint8 hour,minute,second;
- quint16 msec;
- ds >> hour;
- ds >> minute;
- ds >> second;
- ds >> msec;
-
- qint32 pid;
- ds >> pid;
-
- char *str;
- uint len;
-
- ds.readBytes(str, len);
- QByteArray appName(str, len);
- delete[] str;
-
- QTime t = QTime::currentTime();
- printf("{%4s} %2d:%02d:%02d.%03d ", qPrintable(intf), hour, minute,
- second, msec);
- printf("[%5d/%10s] ", pid, appName.constData());
- while (!ds.atEnd()) {
+ foreach (QUdpSocket *socket, sockets) {
+ QString intf = socket->multicastInterface().name();
+
+ while (socket->hasPendingDatagrams()) {
+ QByteArray dgram;
+ dgram.resize(socket->pendingDatagramSize());
+ socket->readDatagram(dgram.data(), dgram.size());
+
+ QBuffer buff(&dgram);
+ buff.open(QIODevice::ReadOnly);
+ QDataStream ds(&buff);
+
+ quint8 hour,minute,second;
+ quint16 msec;
+ ds >> hour;
+ ds >> minute;
+ ds >> second;
+ ds >> msec;
+
+ qint32 pid;
+ ds >> pid;
+
+ char *str;
+ uint len;
+
ds.readBytes(str, len);
- QByteArray termName(str, len);
+ QByteArray appName(str, len);
delete[] str;
- printf("{%s, ", termName.constData());
-
- qint8 type;
- ds >> type;
- DataType dt = static_cast<DataType>(type);
- switch (dt) {
- case Int32Type:
+ QTime t = QTime::currentTime();
+ printf("{%4s} %2d:%02d:%02d.%03d ", qPrintable(intf), hour, minute,
+ second, msec);
+ printf("[%5d/%10s] ", pid, appName.constData());
+ while (!ds.atEnd()) {
+ ds.readBytes(str, len);
+ QByteArray termName(str, len);
+ delete[] str;
+
+ printf("{%s, ", termName.constData());
+
+ qint8 type;
+ ds >> type;
+ DataType dt = static_cast<DataType>(type);
+ switch (dt) {
+ case Int32Type:
{
qint32 data;
ds >> data;
printf("%d} ", data);
}
- break;
- case FloatType:
+ break;
+ case FloatType:
{
float data;
ds >> data;
printf("%.4f} ", data);
}
- break;
- case StringType:
+ break;
+ case StringType:
{
ds.readBytes(str, len);
QByteArray ba(str, len);
ba.truncate(35);
printf("'%s'} ", ba.constData());
}
- break;
+ break;
+ }
}
- }
- printf("\n");
+ printf("\n");
+ }
}
}