From 1642e42a37090de01f8a9956a139cba95ae44fe7 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Mon, 2 Feb 2015 12:29:02 +0100 Subject: Fix failure handling when backend processes fail Make sure that m_backendState is updated accordingly if backend initialization and/or termination fails. Change-Id: I28b6dbb3ecbefb14edbc9ffe5d4497b8ddc37946 Reviewed-by: Laszlo Agocs --- src/wifi/qwificontroller.cpp | 30 ++++++++++++++++-------------- src/wifi/qwificontroller_p.h | 2 +- src/wifi/qwifimanager.cpp | 3 +-- 3 files changed, 18 insertions(+), 17 deletions(-) (limited to 'src/wifi') diff --git a/src/wifi/qwificontroller.cpp b/src/wifi/qwificontroller.cpp index ea49764..2c6baac 100644 --- a/src/wifi/qwificontroller.cpp +++ b/src/wifi/qwificontroller.cpp @@ -272,12 +272,12 @@ void QWifiController::initializeBackend() { qCDebug(B2QT_WIFI) << "initializing wifi backend"; emit backendStateChanged(QWifiManager::Initializing); - + bool initFailed = false; #ifdef Q_OS_ANDROID_NO_SDK qCDebug(B2QT_WIFI) << "initialize driver"; if (!(is_wifi_driver_loaded() || wifi_load_driver() == 0)) { qCWarning(B2QT_WIFI) << "failed to load a driver"; - return; + initFailed = true; } #else qCDebug(B2QT_WIFI) << "run ifconfig (up)"; @@ -286,16 +286,19 @@ void QWifiController::initializeBackend() ifconfig.waitForFinished(); if (ifconfig.exitStatus() != QProcess::NormalExit && ifconfig.exitCode() != 0) { qCWarning(B2QT_WIFI) << "failed to bring up wifi interface!"; - return; + initFailed = true; } #endif - resetSupplicantSocket(); - startWifiEventThread(); - qCDebug(B2QT_WIFI) << "wifi backend started successfully"; - emit backendStateChanged(QWifiManager::Running); + if (!initFailed && resetSupplicantSocket()) { + startWifiEventThread(); + qCDebug(B2QT_WIFI) << "wifi backend started successfully"; + emit backendStateChanged(QWifiManager::Running); + } else { + emit backendStateChanged(QWifiManager::NotRunning); + } } -void QWifiController::resetSupplicantSocket() const +bool QWifiController::resetSupplicantSocket() const { qCDebug(B2QT_WIFI) << "reset supplicant socket"; // close down the previous connection to supplicant if @@ -306,19 +309,20 @@ void QWifiController::resetSupplicantSocket() const qCDebug(B2QT_WIFI) << "start supplicant"; if (q_wifi_start_supplicant() != 0) { qCWarning(B2QT_WIFI) << "failed to start a supplicant!"; - return; + return false; } #ifdef Q_OS_ANDROID_NO_SDK if (wait_for_property("init.svc.wpa_supplicant", "running", 5) < 0) { qCWarning(B2QT_WIFI) << "timed out waiting for supplicant to start!"; - return; + return false; } #endif qCDebug(B2QT_WIFI) << "connect to supplicant"; if (q_wifi_connect_to_supplicant(m_interface) != 0) { qCWarning(B2QT_WIFI) << "failed to connect to a supplicant!"; - return; + return false; } + return true; } void QWifiController::terminateBackend() @@ -334,10 +338,8 @@ void QWifiController::terminateBackend() QProcess ifconfig; ifconfig.start(QStringLiteral("ifconfig"), QStringList() << QLatin1String(m_interface) << QStringLiteral("down")); ifconfig.waitForFinished(); - if (ifconfig.exitStatus() != QProcess::NormalExit && ifconfig.exitCode() != 0) { + if (ifconfig.exitStatus() != QProcess::NormalExit && ifconfig.exitCode() != 0) qCWarning(B2QT_WIFI) << "failed to bring down wifi interface!"; - return; - } #endif stopDhcp(); qCDebug(B2QT_WIFI) << "wifi backend stopped successfully"; diff --git a/src/wifi/qwificontroller_p.h b/src/wifi/qwificontroller_p.h index 230b7c8..d79e1c2 100644 --- a/src/wifi/qwificontroller_p.h +++ b/src/wifi/qwificontroller_p.h @@ -83,7 +83,7 @@ public: void startWifiEventThread(); void acquireIPAddress(); void stopDhcp() const; - void resetSupplicantSocket() const; + bool resetSupplicantSocket() const; signals: void backendStateChanged(QWifiManager::BackendState backendState); diff --git a/src/wifi/qwifimanager.cpp b/src/wifi/qwifimanager.cpp index e971fd1..bc236f2 100644 --- a/src/wifi/qwifimanager.cpp +++ b/src/wifi/qwifimanager.cpp @@ -147,8 +147,7 @@ void QWifiManagerPrivate::updateWifiState() if (ps.readAll().contains("wpa_supplicant")) supplicantRunning = true; #endif - if (supplicantRunning) { - m_wifiController->resetSupplicantSocket(); + if (supplicantRunning && m_wifiController->resetSupplicantSocket()) { m_wifiController->startWifiEventThread(); m_backendState = QWifiManager::Running; } -- cgit v1.2.3