From 89818ff63d9010d661ed18585c093f8b2868d407 Mon Sep 17 00:00:00 2001 From: Mykola Baibuz Date: Sun, 30 Nov 2025 18:49:16 -0800 Subject: [PATCH] fix: app freeze on quit (#1804) * fix: app freeze on quit * fix: typo in VpnConnection destructor * add trace info * add more trace info * set timelimit for flushDns * Refactor IpcClient::Interface access logic * cleanup unused variable * cleanup trace info * fix: remove second disconnect from VPN on app close * this object will be deleted at app close * Don't terminate VPN thread on Linux * Revert "Don't terminate VPN thread on Linux" This reverts commit 20e4ea2d4a2822a31959b1a4a87d350dfad7e52e. * disconnect all signals from vpnconnection on exit * add interruption request on vpnConnectionThread * use checktimer only for iOS * disconnect all signals from vpnconnection on exit * disconnect signals on exit before VPN disconnect * add disconnectSlots method * fix: add allow traffic rules on killswitch disable * wait for response from service before object destroy * change disconnect from vpn order * add delay for connection close * change disconnect method order * use stop method for protocol disconnecect * change disconnect method order * allow dns traffic after app close * delete tun on disconnect --------- Co-authored-by: vkamn --- client/amnezia_application.cpp | 12 ++++ client/core/ipcclient.cpp | 3 +- client/protocols/openvpnprotocol.cpp | 3 +- client/protocols/xrayprotocol.cpp | 16 ++++-- client/vpnconnection.cpp | 85 +++++++++++++++------------- client/vpnconnection.h | 2 + ipc/ipc_interface.rep | 6 +- ipc/ipcserver.cpp | 11 ++-- ipc/ipcserver.h | 6 +- service/server/killswitch.cpp | 11 ++++ service/server/router.cpp | 24 ++++---- service/server/router.h | 6 +- service/server/router_linux.cpp | 28 +++++---- service/server/router_linux.h | 6 +- service/server/router_mac.cpp | 4 +- service/server/router_mac.h | 2 +- service/server/router_win.cpp | 9 ++- service/server/router_win.h | 6 +- 18 files changed, 147 insertions(+), 93 deletions(-) diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 49bd3d883..823e80b35 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -55,8 +55,20 @@ AmneziaApplication::AmneziaApplication(int &argc, char *argv[]) : AMNEZIA_BASE_C AmneziaApplication::~AmneziaApplication() { + if (m_vpnConnection) { + QMetaObject::invokeMethod(m_vpnConnection.get(), "disconnectSlots", Qt::QueuedConnection); + QMetaObject::invokeMethod(m_vpnConnection.get(), "disconnectFromVpn", Qt::QueuedConnection); + QThread::msleep(2000); + } + + m_vpnConnectionThread.requestInterruption(); m_vpnConnectionThread.quit(); + if (!m_vpnConnectionThread.wait(3000)) { + m_vpnConnectionThread.terminate(); + m_vpnConnectionThread.wait(500); + } + if (m_engine) { QObject::disconnect(m_engine, 0, 0, 0); delete m_engine; diff --git a/client/core/ipcclient.cpp b/client/core/ipcclient.cpp index 69edcd159..0021f7942 100644 --- a/client/core/ipcclient.cpp +++ b/client/core/ipcclient.cpp @@ -85,8 +85,9 @@ bool IpcClient::init(IpcClient *instance) } qDebug() << "IpcClient::init succeed"; + instance->m_isSocketConnected = (Instance()->m_ipcClient->isReplicaValid() && Instance()->m_Tun2SocksClient->isReplicaValid()); - return (Instance()->m_ipcClient->isReplicaValid() && Instance()->m_Tun2SocksClient->isReplicaValid()); + return Instance()->isSocketConnected(); } QSharedPointer IpcClient::CreatePrivilegedProcess() diff --git a/client/protocols/openvpnprotocol.cpp b/client/protocols/openvpnprotocol.cpp index 0bbdbd079..87799a727 100644 --- a/client/protocols/openvpnprotocol.cpp +++ b/client/protocols/openvpnprotocol.cpp @@ -56,7 +56,8 @@ void OpenVpnProtocol::stop() } #if defined(Q_OS_WIN) || defined(Q_OS_LINUX) || defined(Q_OS_MACOS) - IpcClient::Interface()->disableKillSwitch(); + QRemoteObjectPendingReply disableKillSwitchResp = IpcClient::Interface()->disableKillSwitch(); + disableKillSwitchResp.waitForFinished(1000); #endif setConnectionState(Vpn::ConnectionState::Disconnected); diff --git a/client/protocols/xrayprotocol.cpp b/client/protocols/xrayprotocol.cpp index 4b369b80a..3807d9ba3 100755 --- a/client/protocols/xrayprotocol.cpp +++ b/client/protocols/xrayprotocol.cpp @@ -166,10 +166,17 @@ ErrorCode XrayProtocol::startTun2Sock() void XrayProtocol::stop() { -#if defined(Q_OS_WIN) || defined(Q_OS_LINUX) || defined(Q_OS_MACOS) - IpcClient::Interface()->disableKillSwitch(); - IpcClient::Interface()->StartRoutingIpv6(); - IpcClient::Interface()->restoreResolvers(); +#ifdef AMNEZIA_DESKTOP + QRemoteObjectPendingReply disableKillSwitchResp = IpcClient::Interface()->disableKillSwitch(); + disableKillSwitchResp.waitForFinished(1000); + QRemoteObjectPendingReply StartRoutingIpv6Resp = IpcClient::Interface()->StartRoutingIpv6(); + StartRoutingIpv6Resp.waitForFinished(1000); + QRemoteObjectPendingReply restoreResolvers = IpcClient::Interface()->restoreResolvers(); + restoreResolvers.waitForFinished(1000); +#if !defined(Q_OS_MACOS) + QRemoteObjectPendingReply deleteTunResp = IpcClient::Interface()->deleteTun("tun2"); + deleteTunResp.waitForFinished(1000); +#endif #endif qDebug() << "XrayProtocol::stop()"; m_xrayProcess.disconnect(); @@ -177,6 +184,7 @@ void XrayProtocol::stop() m_xrayProcess.waitForFinished(3000); if (m_t2sProcess) { m_t2sProcess->stop(); + QThread::msleep(200); } setConnectionState(Vpn::ConnectionState::Disconnected); diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index f1a6cee19..036d767ea 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -32,8 +32,8 @@ VpnConnection::VpnConnection(std::shared_ptr settings, QObject *parent) : QObject(parent), m_settings(settings), m_checkTimer(new QTimer(this)) { - m_checkTimer.setInterval(1000); #if defined(Q_OS_IOS) || defined(MACOS_NE) + m_checkTimer.setInterval(1000); connect(IosController::Instance(), &IosController::connectionStateChanged, this, &VpnConnection::onConnectionStateChanged); connect(IosController::Instance(), &IosController::bytesChanged, this, &VpnConnection::onBytesChanged); @@ -42,9 +42,6 @@ VpnConnection::VpnConnection(std::shared_ptr settings, QObject *parent VpnConnection::~VpnConnection() { -#if defined AMNEZIA_DESKTOP - disconnectFromVpn(); -#endif } void VpnConnection::onBytesChanged(quint64 receivedBytes, quint64 sentBytes) @@ -55,19 +52,7 @@ void VpnConnection::onBytesChanged(quint64 receivedBytes, quint64 sentBytes) void VpnConnection::onKillSwitchModeChanged(bool enabled) { #ifdef AMNEZIA_DESKTOP - if (!m_IpcClient) { - m_IpcClient = new IpcClient(this); - } - - if (!m_IpcClient->isSocketConnected()) { - if (!IpcClient::init(m_IpcClient)) { - qWarning() << "Error occurred when init IPC client"; - emit serviceIsNotReady(); - return; - } - } - - if (IpcClient::Interface()) { + if (InterfaceReady()) { qDebug() << "Set KillSwitch Strict mode enabled " << enabled; IpcClient::Interface()->refreshKillSwitch(enabled); } @@ -80,7 +65,7 @@ void VpnConnection::onConnectionStateChanged(Vpn::ConnectionState state) #ifdef AMNEZIA_DESKTOP auto container = m_settings->defaultContainer(m_settings->defaultServerIndex()); - if (IpcClient::Interface()) { + if (InterfaceReady()) { if (state == Vpn::ConnectionState::Connected) { IpcClient::Interface()->resetIpStack(); IpcClient::Interface()->flushDns(); @@ -212,14 +197,41 @@ void VpnConnection::deleteRoutes(const QStringList &ips) #endif } +bool VpnConnection::InterfaceReady() +{ +#ifdef AMNEZIA_DESKTOP + if (!m_IpcClient) { + m_IpcClient = new IpcClient(this); + } + + if (!m_IpcClient->isSocketConnected()) { + if (!IpcClient::init(m_IpcClient)) { + qWarning() << "Error occurred when init IPC client"; + emit serviceIsNotReady(); + return false; + } + } + + return IpcClient::Interface() != nullptr; +#endif + return true; +} + void VpnConnection::flushDns() { #ifdef AMNEZIA_DESKTOP - if (IpcClient::Interface()) + if (InterfaceReady()) IpcClient::Interface()->flushDns(); #endif } +void VpnConnection::disconnectSlots() +{ + if (m_vpnProtocol) { + m_vpnProtocol->disconnect(); + } +} + ErrorCode VpnConnection::lastError() const { #ifdef Q_OS_ANDROID @@ -240,20 +252,11 @@ void VpnConnection::connectToVpn(int serverIndex, const ServerCredentials &crede .arg(serverIndex) .arg(ContainerProps::containerToString(container)) << m_settings->routeMode(); -#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) && !defined(MACOS_NE) - if (!m_IpcClient) { - m_IpcClient = new IpcClient(this); - } - if (!m_IpcClient->isSocketConnected()) { - if (!IpcClient::init(m_IpcClient)) { - qWarning() << "Error occurred when init IPC client"; - emit serviceIsNotReady(); - emit connectionStateChanged(Vpn::ConnectionState::Error); - return; - } + if (!InterfaceReady()) { + emit connectionStateChanged(Vpn::ConnectionState::Error); + return; } -#endif m_remoteAddress = NetworkUtilities::getIPAddress(credentials.hostName); emit connectionStateChanged(Vpn::ConnectionState::Connecting); @@ -440,13 +443,18 @@ QString VpnConnection::bytesPerSecToText(quint64 bytes) void VpnConnection::disconnectFromVpn() { #ifdef AMNEZIA_DESKTOP - QString proto = m_settings->defaultContainerName(m_settings->defaultServerIndex()); - if (IpcClient::Interface()) { - IpcClient::Interface()->flushDns(); + if (InterfaceReady()) { + m_vpnProtocol.data()->stop(); + qDebug() << "Interface is ready!"; + + QRemoteObjectPendingReply flushDnsResp = IpcClient::Interface()->flushDns(); + flushDnsResp.waitForFinished(1000); + + qDebug() << "Flushed DNS"; // delete cached routes - QRemoteObjectPendingReply response = IpcClient::Interface()->clearSavedRoutes(); - response.waitForFinished(1000); + QRemoteObjectPendingReply clearSavedRoutesResp = IpcClient::Interface()->clearSavedRoutes(); + clearSavedRoutesResp.waitForFinished(1000); } #endif @@ -475,12 +483,13 @@ void VpnConnection::disconnectFromVpn() return; } -#ifndef Q_OS_ANDROID +#if !defined(Q_OS_ANDROID) && !defined(AMNEZIA_DESKTOP) if (m_vpnProtocol) { m_vpnProtocol->deleteLater(); } - m_vpnProtocol = nullptr; #endif + + m_vpnProtocol = nullptr; } Vpn::ConnectionState VpnConnection::connectionState() diff --git a/client/vpnconnection.h b/client/vpnconnection.h index cb5aaaf9c..9039b829d 100644 --- a/client/vpnconnection.h +++ b/client/vpnconnection.h @@ -56,6 +56,7 @@ public slots: void deleteRoutes(const QStringList &ips); void flushDns(); void onKillSwitchModeChanged(bool enabled); + void disconnectSlots(); signals: void bytesChanged(quint64 receivedBytes, quint64 sentBytes); @@ -95,6 +96,7 @@ private: void appendSplitTunnelingConfig(); void appendKillSwitchConfig(); + bool InterfaceReady(); }; #endif // VPNCONNECTION_H diff --git a/ipc/ipc_interface.rep b/ipc/ipc_interface.rep index d9eb3e0f7..b3d836002 100644 --- a/ipc/ipc_interface.rep +++ b/ipc/ipc_interface.rep @@ -12,7 +12,7 @@ class IpcInterface SLOT( int routeAddList(const QString &gw, const QStringList &ips) ); SLOT( bool clearSavedRoutes() ); SLOT( bool routeDeleteList(const QString &gw, const QStringList &ip) ); - SLOT( void flushDns() ); + SLOT( bool flushDns() ); SLOT( void resetIpStack() ); SLOT( bool checkAndInstallDriver() ); @@ -25,8 +25,8 @@ class IpcInterface SLOT( bool createTun(const QString &dev, const QString &subnet) ); SLOT( bool deleteTun(const QString &dev) ); - SLOT( void StartRoutingIpv6() ); - SLOT( void StopRoutingIpv6() ); + SLOT( bool StartRoutingIpv6() ); + SLOT( bool StopRoutingIpv6() ); SLOT( bool disableKillSwitch() ); SLOT( bool disableAllTraffic() ); diff --git a/ipc/ipcserver.cpp b/ipc/ipcserver.cpp index cb669c68e..61f688662 100644 --- a/ipc/ipcserver.cpp +++ b/ipc/ipcserver.cpp @@ -83,7 +83,7 @@ bool IpcServer::routeDeleteList(const QString &gw, const QStringList &ips) return Router::routeDeleteList(gw, ips); } -void IpcServer::flushDns() +bool IpcServer::flushDns() { #ifdef MZ_DEBUG qDebug() << "IpcServer::flushDns"; @@ -161,13 +161,14 @@ bool IpcServer::restoreResolvers() { return Router::restoreResolvers(); } -void IpcServer::StartRoutingIpv6() +bool IpcServer::StartRoutingIpv6() { - Router::StartRoutingIpv6(); + return Router::StartRoutingIpv6(); } -void IpcServer::StopRoutingIpv6() + +bool IpcServer::StopRoutingIpv6() { - Router::StopRoutingIpv6(); + return Router::StopRoutingIpv6(); } void IpcServer::setLogsEnabled(bool enabled) diff --git a/ipc/ipcserver.h b/ipc/ipcserver.h index bcc5733a9..1555072d2 100644 --- a/ipc/ipcserver.h +++ b/ipc/ipcserver.h @@ -23,7 +23,7 @@ public: virtual int routeAddList(const QString &gw, const QStringList &ips) override; virtual bool clearSavedRoutes() override; virtual bool routeDeleteList(const QString &gw, const QStringList &ips) override; - virtual void flushDns() override; + virtual bool flushDns() override; virtual void resetIpStack() override; virtual bool checkAndInstallDriver() override; virtual QStringList getTapList() override; @@ -32,8 +32,8 @@ public: virtual void setLogsEnabled(bool enabled) override; virtual bool createTun(const QString &dev, const QString &subnet) override; virtual bool deleteTun(const QString &dev) override; - virtual void StartRoutingIpv6() override; - virtual void StopRoutingIpv6() override; + virtual bool StartRoutingIpv6() override; + virtual bool StopRoutingIpv6() override; virtual bool disableAllTraffic() override; virtual bool addKillSwitchAllowedRange(QStringList ranges) override; virtual bool resetKillSwitchAllowedRange(QStringList ranges) override; diff --git a/service/server/killswitch.cpp b/service/server/killswitch.cpp index d0cba03a5..6f77d8b39 100644 --- a/service/server/killswitch.cpp +++ b/service/server/killswitch.cpp @@ -98,6 +98,17 @@ bool KillSwitch::disableKillSwitch() { LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("320.allowDNS"), false); LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("400.allowPIA"), false); } else { + LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("000.allowLoopback"), true); + LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("100.blockAll"), false); + LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("110.allowNets"), false); + LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("120.blockNets"), false); + LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("200.allowVPN"), false); + LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv6, QStringLiteral("250.blockIPv6"), false); + LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("290.allowDHCP"), true); + LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("300.allowLAN"), true); + LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("310.blockDNS"), false); + LinuxFirewall::setAnchorEnabled(LinuxFirewall::IPv4, QStringLiteral("320.allowDNS"), true); + LinuxFirewall::setAnchorEnabled(LinuxFirewall::Both, QStringLiteral("400.allowPIA"), false); LinuxFirewall::uninstall(); } #endif diff --git a/service/server/router.cpp b/service/server/router.cpp index be422f04c..24e82c0e5 100644 --- a/service/server/router.cpp +++ b/service/server/router.cpp @@ -42,14 +42,14 @@ int Router::routeDeleteList(const QString &gw, const QStringList &ips) #endif } -void Router::flushDns() +bool Router::flushDns() { #ifdef Q_OS_WIN - RouterWin::Instance().flushDns(); + return RouterWin::Instance().flushDns(); #elif defined (Q_OS_MAC) - RouterMac::Instance().flushDns(); + return RouterMac::Instance().flushDns(); #elif defined Q_OS_LINUX - RouterLinux::Instance().flushDns(); + return RouterLinux::Instance().flushDns(); #endif } @@ -111,25 +111,25 @@ bool Router::restoreResolvers() { #endif } -void Router::StopRoutingIpv6() +bool Router::StopRoutingIpv6() { #ifdef Q_OS_WIN - RouterWin::Instance().StopRoutingIpv6(); + return RouterWin::Instance().StopRoutingIpv6(); #elif defined (Q_OS_MAC) - // todo fixme + return true;// todo fixme #elif defined Q_OS_LINUX - RouterLinux::Instance().StopRoutingIpv6(); + return RouterLinux::Instance().StopRoutingIpv6(); #endif } -void Router::StartRoutingIpv6() +bool Router::StartRoutingIpv6() { #ifdef Q_OS_WIN - RouterWin::Instance().StartRoutingIpv6(); + return RouterWin::Instance().StartRoutingIpv6(); #elif defined (Q_OS_MAC) - // todo fixme + return true;// todo fixme #elif defined Q_OS_LINUX - RouterLinux::Instance().StartRoutingIpv6(); + return RouterLinux::Instance().StartRoutingIpv6(); #endif } diff --git a/service/server/router.h b/service/server/router.h index 2285cdcea..2b42f9dc9 100644 --- a/service/server/router.h +++ b/service/server/router.h @@ -19,12 +19,12 @@ public: static int routeAddList(const QString &gw, const QStringList &ips); static bool clearSavedRoutes(); static int routeDeleteList(const QString &gw, const QStringList &ips); - static void flushDns(); + static bool flushDns(); static void resetIpStack(); static bool createTun(const QString &dev, const QString &subnet); static bool deleteTun(const QString &dev); - static void StartRoutingIpv6(); - static void StopRoutingIpv6(); + static bool StartRoutingIpv6(); + static bool StopRoutingIpv6(); static bool updateResolvers(const QString& ifname, const QList& resolvers); static bool restoreResolvers(); }; diff --git a/service/server/router_linux.cpp b/service/server/router_linux.cpp index 7601265b0..3f8a7f6e9 100644 --- a/service/server/router_linux.cpp +++ b/service/server/router_linux.cpp @@ -160,7 +160,7 @@ bool RouterLinux::isServiceActive(const QString &serviceName) { return process.exitCode() == 0; } -void RouterLinux::flushDns() +bool RouterLinux::flushDns() { QProcess p; p.setProcessChannelMode(QProcess::MergedChannels); @@ -174,7 +174,7 @@ void RouterLinux::flushDns() p.start("systemctl", { "restart", "systemd-resolved" }); } else { qDebug() << "No suitable DNS manager found."; - return; + return false; } p.waitForFinished(); @@ -183,6 +183,8 @@ void RouterLinux::flushDns() qDebug().noquote() << "Flush dns completed"; else qDebug().noquote() << "OUTPUT systemctl restart nscd/systemd-resolved: " + output; + + return true; } bool RouterLinux::createTun(const QString &dev, const QString &subnet) { @@ -283,7 +285,7 @@ bool RouterLinux::restoreResolvers() { return m_dnsUtil->restoreResolvers(); } -void RouterLinux::StartRoutingIpv6() +bool RouterLinux::StartRoutingIpv6() { QProcess process; QStringList commands; @@ -293,12 +295,12 @@ void RouterLinux::StartRoutingIpv6() if (!process.waitForStarted(1000)) { qDebug().noquote() << "Could not start activate ipv6\n"; - return; + return false; } else if (!process.waitForFinished(2000)) { qDebug().noquote() << "Could not activate ipv6\n"; - return; + return false; } commands.clear(); @@ -307,19 +309,20 @@ void RouterLinux::StartRoutingIpv6() if (!process.waitForStarted(1000)) { qDebug().noquote() << "Could not start activate ipv6\n"; - return; + return false; } else if (!process.waitForFinished(2000)) { qDebug().noquote() << "Could not activate ipv6\n"; - return; + return false; } commands.clear(); qDebug().noquote() << "StartRoutingIpv6 OK"; + return true; } -void RouterLinux::StopRoutingIpv6() +bool RouterLinux::StopRoutingIpv6() { QProcess process; QStringList commands; @@ -329,12 +332,12 @@ void RouterLinux::StopRoutingIpv6() if (!process.waitForStarted(1000)) { qDebug().noquote() << "Could not start disable ipv6\n"; - return; + return false; } else if (!process.waitForFinished(2000)) { qDebug().noquote() << "Could not disable ipv6\n"; - return; + return false; } commands.clear(); @@ -343,14 +346,15 @@ void RouterLinux::StopRoutingIpv6() if (!process.waitForStarted(1000)) { qDebug().noquote() << "Could not start disable ipv6\n"; - return; + return false; } else if (!process.waitForFinished(2000)) { qDebug().noquote() << "Could not disable ipv6\n"; - return; + return false; } commands.clear(); qDebug().noquote() << "StopRoutingIpv6 OK"; + return true; } diff --git a/service/server/router_linux.h b/service/server/router_linux.h index a7bf534d0..c862135ce 100644 --- a/service/server/router_linux.h +++ b/service/server/router_linux.h @@ -30,11 +30,11 @@ public: bool routeDelete(const QString &ip, const QString &gw, const int &sock); bool routeDeleteList(const QString &gw, const QStringList &ips); QString getgatewayandiface(); - void flushDns(); + bool flushDns(); bool createTun(const QString &dev, const QString &subnet); bool deleteTun(const QString &dev); - void StartRoutingIpv6(); - void StopRoutingIpv6(); + bool StartRoutingIpv6(); + bool StopRoutingIpv6(); bool updateResolvers(const QString& ifname, const QList& resolvers); bool restoreResolvers(); public slots: diff --git a/service/server/router_mac.cpp b/service/server/router_mac.cpp index 056517b5f..f56e3f9f6 100644 --- a/service/server/router_mac.cpp +++ b/service/server/router_mac.cpp @@ -169,7 +169,7 @@ bool RouterMac::deleteTun(const QString &dev) return true; } -void RouterMac::flushDns() +bool RouterMac::flushDns() { // sudo killall -HUP mDNSResponder QProcess p; @@ -177,5 +177,7 @@ void RouterMac::flushDns() p.start("killall", QStringList() << "-HUP" << "mDNSResponder"); p.waitForFinished(); + qDebug().noquote() << "OUTPUT killall -HUP mDNSResponder: " + p.readAll(); + return true; } diff --git a/service/server/router_mac.h b/service/server/router_mac.h index 9289ce56c..72beb7ea8 100644 --- a/service/server/router_mac.h +++ b/service/server/router_mac.h @@ -29,7 +29,7 @@ public: bool clearSavedRoutes(); bool routeDelete(const QString &ip, const QString &gw); bool routeDeleteList(const QString &gw, const QStringList &ips); - void flushDns(); + bool flushDns(); bool createTun(const QString &dev, const QString &subnet); bool deleteTun(const QString &dev); bool updateResolvers(const QString& ifname, const QList& resolvers); diff --git a/service/server/router_win.cpp b/service/server/router_win.cpp index 849b8059a..d2975a88c 100644 --- a/service/server/router_win.cpp +++ b/service/server/router_win.cpp @@ -273,7 +273,7 @@ int RouterWin::routeDeleteList(const QString &gw, const QStringList &ips) return success_count; } -void RouterWin::flushDns() +bool RouterWin::flushDns() { QProcess p; p.setProcessChannelMode(QProcess::MergedChannels); @@ -281,6 +281,7 @@ void RouterWin::flushDns() p.start(command); p.waitForFinished(); + return true; //qDebug().noquote() << "OUTPUT ipconfig /flushdns: " + p.readAll(); } @@ -447,7 +448,7 @@ bool RouterWin::restoreResolvers() { return m_dnsUtil->restoreResolvers(); } -void RouterWin::StopRoutingIpv6() +bool RouterWin::StopRoutingIpv6() { { QProcess p; @@ -467,9 +468,10 @@ void RouterWin::StopRoutingIpv6() p.start(command); p.waitForFinished(); } + return true; } -void RouterWin::StartRoutingIpv6() +bool RouterWin::StartRoutingIpv6() { { QProcess p; @@ -489,5 +491,6 @@ void RouterWin::StartRoutingIpv6() p.start(command); p.waitForFinished(); } + return true; } diff --git a/service/server/router_win.h b/service/server/router_win.h index a137487e5..f46d2d17f 100644 --- a/service/server/router_win.h +++ b/service/server/router_win.h @@ -39,11 +39,11 @@ public: int routeAddList(const QString &gw, const QStringList &ips); bool clearSavedRoutes(); int routeDeleteList(const QString &gw, const QStringList &ips); - void flushDns(); + bool flushDns(); void resetIpStack(); - void StartRoutingIpv6(); - void StopRoutingIpv6(); + bool StartRoutingIpv6(); + bool StopRoutingIpv6(); void suspendWcmSvc(bool suspend); bool updateResolvers(const QString& ifname, const QList& resolvers);