From e0694c52d9f83db3a48d043c78e6573f729dba71 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 31 Mar 2023 14:07:57 +0200 Subject: [PATCH] RemoteLinux: Allow parsing used ports from cat output We used to run {filePath("sed"), {"-e 's/.*: [[:xdigit:]]*:\\([[:xdigit:]]\\{4\\}\\).*/\\1/g' /proc/net/tcp*"} on the device side but doesn't pass quoting on double-remote setups. Chicken out by using a simpler for now command. Change-Id: I7794f803d185bd4b6b717d85c01cc250cc66f1eb Reviewed-by: Christian Stenger Reviewed-by: --- src/libs/utils/port.cpp | 32 +++++++++++++++++++++++++ src/libs/utils/port.h | 1 + src/plugins/remotelinux/linuxdevice.cpp | 14 +++++++---- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/libs/utils/port.cpp b/src/libs/utils/port.cpp index 3f9166a1a9d..ceab772b620 100644 --- a/src/libs/utils/port.cpp +++ b/src/libs/utils/port.cpp @@ -6,6 +6,8 @@ #include "qtcassert.h" #include "stringutils.h" +#include + #include /*! \class Utils::Port @@ -51,6 +53,36 @@ QList Port::parseFromSedOutput(const QByteArray &output) return ports; } +QList Port::parseFromCatOutput(const QByteArray &output) +{ + // Parse something like + // sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode + // : 00000000:2717 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1001 0 3995881 1 0000000000000000 100 0 0 10 0 + // : 00000000:2716 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1001 0 3594482 1 0000000000000000 100 0 0 10 0 + const QRegularExpression re(".*: [[:xdigit:]]*:([[:xdigit:]]{4}).*"); + + QList ports; + const QStringList lines = QString::fromLocal8Bit(output).split('\n'); + for (const QString &line : lines) { + const QRegularExpressionMatch match = re.match(line); + if (!match.hasMatch()) + continue; + const QString portString = match.captured(1); + if (portString.size() != 4) + continue; + bool ok; + const Port port(portString.toInt(&ok, 16)); + if (ok) { + if (!ports.contains(port)) + ports << port; + } else { + qWarning("%s: Unexpected string '%s' is not a port.", + Q_FUNC_INFO, qPrintable(portString)); + } + } + return ports; +} + QList Port::parseFromNetstatOutput(const QByteArray &output) { QList ports; diff --git a/src/libs/utils/port.h b/src/libs/utils/port.h index 851b41ceaf4..3202ac5f18f 100644 --- a/src/libs/utils/port.h +++ b/src/libs/utils/port.h @@ -25,6 +25,7 @@ public: QString toString() const { return QString::number(m_port); } static QList parseFromSedOutput(const QByteArray &output); + static QList parseFromCatOutput(const QByteArray &output); static QList parseFromNetstatOutput(const QByteArray &output); friend bool operator<(const Port &p1, const Port &p2) { return p1.number() < p2.number(); } diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 615ac56f4c7..d986ee88dd8 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -1048,13 +1048,17 @@ PortsGatheringMethod LinuxDevice::portsGatheringMethod() const Q_UNUSED(protocol) - // /proc/net/tcp* covers /proc/net/tcp and /proc/net/tcp6 - return {filePath("sed"), - "-e 's/.*: [[:xdigit:]]*:\\([[:xdigit:]]\\{4\\}\\).*/\\1/g' /proc/net/tcp*", - CommandLine::Raw}; + // We used to have + // // /proc/net/tcp* covers /proc/net/tcp and /proc/net/tcp6 + // return {filePath("sed"), + // "-e 's/.*: [[:xdigit:]]*:\\([[:xdigit:]]\\{4\\}\\).*/\\1/g' /proc/net/tcp*", + // + // here, but that doesn't pass quoting on double-remote setups. + // Chicken out by using a simpler command. + return {filePath("cat"), {"/proc/net/tcp*"}}; }, - &Port::parseFromSedOutput + &Port::parseFromCatOutput }; }