From c1c0f357da40fe5607b0af484255fbf3b51aae7f Mon Sep 17 00:00:00 2001
From: Fawzi Mohamed <fawzi.mohamed@nokia.com>
Date: Mon, 23 Apr 2012 18:31:53 +0200
Subject: [PATCH] zeroconf: daemon killall on windows (and linux)

Change-Id: Ibbc960d9caf26fb8ff56d37209fe5011931ed3b5
Reviewed-by: Christian Kandeler <christian.kandeler@nokia.com>
---
 src/libs/zeroconf/embeddedLib.cpp | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/src/libs/zeroconf/embeddedLib.cpp b/src/libs/zeroconf/embeddedLib.cpp
index 310c25e909..1e2c3ffe4d 100644
--- a/src/libs/zeroconf/embeddedLib.cpp
+++ b/src/libs/zeroconf/embeddedLib.cpp
@@ -34,11 +34,12 @@
 
 #include "servicebrowser_p.h"
 
+#include <QCoreApplication>
+#include <QDebug>
+#include <QFileInfo>
 #include <QString>
 #include <QStringList>
 #include <QProcess>
-#include <QCoreApplication>
-#include <QDebug>
 
 #ifdef Q_OS_LINUX
 #define EMBEDDED_LIB
@@ -87,6 +88,28 @@ public:
     bool tryStartDaemon()
     {
         if (!daemonPath.isEmpty()) {
+            QFileInfo dPath(daemonPath);
+            QProcess killall;
+            bool killAllFailed = false;
+#ifdef Q_OS_WIN
+            QString cmd = QLating1String("taskill /im ") + dPath.fileName()
+                    + QLatin1String(" /f /t");
+#else
+            QString cmd = QLatin1String("killall ") + dPath.fileName()
+                    + QLatin1String(" 2> /dev/null");
+#endif
+            killall.start(cmd);
+            if (!killall.waitForStarted()) {
+                killAllFailed = true;
+            } else {
+                killall.closeWriteChannel();
+                killall.waitForFinished();
+            }
+            if (killAllFailed) {
+                this->setError(false,ZConfLib::tr("zeroconf failed to kill other daemons with '%1'").arg(cmd));
+                if (DEBUG_ZEROCONF)
+                    qDebug() << name() << " had an error trying to kill other daemons with " << cmd;
+            }
             if (QProcess::startDetached(daemonPath)) {
                 QThread::yieldCurrentThread();
                 // sleep a bit?
-- 
GitLab