From c32a064349ddce1149afd8c524ac43f30cdddc80 Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Sun, 14 Feb 2016 17:01:12 +0000 Subject: Enumerate dial-in devices on FreeBSD BSD-like systems divide serial ports into dial-in (tty) and dial-out (cua) devices. QSPI did not return a list of dial-in devices, that now has been fixed in this patch. Change-Id: I593719429e3b6641012eb046851dd08b9dc829fb Reviewed-by: Sergey Belyashov Reviewed-by: Denis Shienkov --- src/serialport/qserialportinfo_freebsd.cpp | 38 +++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/serialport/qserialportinfo_freebsd.cpp b/src/serialport/qserialportinfo_freebsd.cpp index e65f09c..49612f1 100644 --- a/src/serialport/qserialportinfo_freebsd.cpp +++ b/src/serialport/qserialportinfo_freebsd.cpp @@ -47,13 +47,13 @@ QT_BEGIN_NAMESPACE -static QString deviceProperty(const QString &pnpinfo, const QByteArray &pattern) +static QString deviceProperty(const QString &source, const QByteArray &pattern) { - const int firstbound = pnpinfo.indexOf(QLatin1String(pattern)); + const int firstbound = source.indexOf(QLatin1String(pattern)); if (firstbound == -1) return QString(); - const int lastbound = pnpinfo.indexOf(QLatin1Char(' '), firstbound); - return pnpinfo.mid(firstbound + pattern.size(), lastbound - firstbound - pattern.size()); + const int lastbound = source.indexOf(QLatin1Char(' '), firstbound); + return source.mid(firstbound + pattern.size(), lastbound - firstbound - pattern.size()); } static QString deviceName(const QString &pnpinfo) @@ -202,8 +202,8 @@ static QList enumerateDesiredNodes(const QVector &mib) const NodeInfo node = nodeForOid(nextoid); if (!node.name.isEmpty()) { - if (node.name.endsWith("\%desc") - || node.name.endsWith("\%pnpinfo")) { + if (node.name.endsWith(QLatin1String("\%desc")) + || node.name.endsWith(QLatin1String("\%pnpinfo"))) { nodes.append(node); } } @@ -228,10 +228,11 @@ QList QSerialPortInfo::availablePorts() if (!(deviceDir.exists() && deviceDir.isReadable())) return QList(); - deviceDir.setNameFilters(QStringList() << QLatin1String("cua*")); + deviceDir.setNameFilters(QStringList() << QLatin1String("cua*") << QLatin1String("tty*")); deviceDir.setFilter(QDir::Files | QDir::System | QDir::NoSymLinks); - QList serialPortInfoList; + QList cuaCandidates; + QList ttyCandidates; foreach (const QString &portName, deviceDir.entryList()) { if (portName.endsWith(QLatin1String(".init")) @@ -304,7 +305,26 @@ QList QSerialPortInfo::availablePorts() break; } - serialPortInfoList.append(priv); + if (portName.startsWith(QLatin1String("cua"))) + cuaCandidates.append(priv); + else if (portName.startsWith(QLatin1String("tty"))) + ttyCandidates.append(priv); + } + + QList serialPortInfoList; + + foreach (const QSerialPortInfo &cuaCandidate, cuaCandidates) { + const QString cuaPortName = cuaCandidate.portName(); + const QString cuaToken = deviceProperty(cuaPortName, "cua"); + foreach (const QSerialPortInfo &ttyCandidate, ttyCandidates) { + const QString ttyPortName = ttyCandidate.portName(); + const QString ttyToken = deviceProperty(ttyPortName, "tty"); + if (cuaToken != ttyToken) + continue; + + serialPortInfoList.append(cuaCandidate); + serialPortInfoList.append(ttyCandidate); + } } return serialPortInfoList; -- cgit v1.2.1