From 435ee58d404d221339f59766afa2541c83ec60fb Mon Sep 17 00:00:00 2001 From: pokamest Date: Tue, 1 Jun 2021 08:45:26 -0700 Subject: [PATCH] Macos fix: routes delete --- service/server/router_mac.cpp | 50 ++++++++++++++++++++++++++--------- service/server/router_mac.h | 1 + 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/service/server/router_mac.cpp b/service/server/router_mac.cpp index 8fd53cecf..a39e4883c 100644 --- a/service/server/router_mac.cpp +++ b/service/server/router_mac.cpp @@ -48,7 +48,6 @@ int RouterMac::routeAddList(const QString &gw, const QStringList &ips) int cnt = 0; for (const QString &ip: ips) { if (routeAdd(ip, gw)) cnt++; - //QThread::msleep(10); } return cnt; } @@ -62,27 +61,54 @@ bool RouterMac::clearSavedRoutes() // for (const QString &ip: m_addedRoutes) { // if (routeDelete(ip)) cnt++; // } -// return (cnt == m_addedRoutes.count()); + // return (cnt == m_addedRoutes.count()); } -bool RouterMac::routeDeleteList(const QString &gw, const QStringList &ips) +bool RouterMac::routeDelete(const QString &ipWithSubnet, const QString &gw) { + QString ip = Utils::ipAddressFromIpWithSubnet(ipWithSubnet); + QString mask = Utils::netMaskFromIpWithSubnet(ipWithSubnet); + + if (ip == "0.0.0.0") { qDebug().noquote() << "Warning, trying to remove default route, skipping: " << ip << gw; return true; } - // route delete ip gw - QProcess p; - p.setProcessChannelMode(QProcess::MergedChannels); + QString cmd; + if (mask == "255.255.255.255") { + cmd = QString("route delete -host %1 %2").arg(ip).arg(gw); + } + else { + cmd = QString("route delete -net %1 %2 %3").arg(ip).arg(gw).arg(mask); + } - p.start("route", QStringList() << "delete" << ip); - p.waitForFinished(); - // skipping gw - qDebug().noquote() << "routeDelete, skipping gw`: " << ip; - qDebug().noquote() << "OUTPUT routeDelete: " << p.readAll(); + QStringList parts = cmd.split(" "); - return p.exitCode() == 0; + int argc = parts.size(); + char **argv = new char*[argc]; + + for (int i = 0; i < argc; i++) { + argv[i] = new char[parts.at(i).toStdString().length() + 1]; + strcpy(argv[i], parts.at(i).toStdString().c_str()); + } + + mainRouteIface(argc, argv); + + for (int i = 0; i < argc; i++) { + delete [] argv[i]; + } + delete[] argv; + return true; +} + +bool RouterMac::routeDeleteList(const QString &gw, const QStringList &ips) +{ + int cnt = 0; + for (const QString &ip: ips) { + if (routeDelete(ip, gw)) cnt++; + } + return cnt; } void RouterMac::flushDns() diff --git a/service/server/router_mac.h b/service/server/router_mac.h index b11568f19..d6e965c57 100644 --- a/service/server/router_mac.h +++ b/service/server/router_mac.h @@ -21,6 +21,7 @@ public: bool routeAdd(const QString &ip, const QString &gw); int routeAddList(const QString &gw, const QStringList &ips); bool clearSavedRoutes(); + bool routeDelete(const QString &ip, const QString &gw); bool routeDeleteList(const QString &gw, const QStringList &ips); void flushDns();