diff --git a/server/drone.pro b/server/drone.pro index 4aa591d..484bdd5 100644 --- a/server/drone.pro +++ b/server/drone.pro @@ -59,6 +59,7 @@ SOURCES += \ bsdport.cpp \ linuxhostdevice.cpp \ linuxport.cpp \ + linuxutils.cpp \ params.cpp \ winhostdevice.cpp \ winpcapport.cpp diff --git a/server/linuxport.cpp b/server/linuxport.cpp index c4f25fb..3da8c56 100644 --- a/server/linuxport.cpp +++ b/server/linuxport.cpp @@ -20,6 +20,7 @@ along with this program. If not, see #include "linuxport.h" #include "interfaceinfo.h" +#include "linuxutils.h" #ifdef Q_OS_LINUX @@ -243,11 +244,13 @@ void LinuxPort::populateInterfaceInfo() return; } + interfaceInfo_ = new InterfaceInfo; + interfaceInfo_->speed = sysfsAttrib(name(), "speed").toDouble(); + interfaceInfo_->mtu = rtnl_link_get_mtu(link); + int ifIndex = rtnl_link_get_ifindex(link); rtnl_link_put(link); - interfaceInfo_ = new InterfaceInfo; - // FIXME: speed, mtu interfaceInfo_->mac = mac; // diff --git a/server/linuxutils.cpp b/server/linuxutils.cpp new file mode 100644 index 0000000..38a8bfb --- /dev/null +++ b/server/linuxutils.cpp @@ -0,0 +1,65 @@ +/* +Copyright (C) 2021 Srivats P. + +This file is part of "Ostinato" + +This is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +#include "linuxutils.h" + +#include +#include + +// Reads a text file (size < 4K) and returns content as a string +// A terminating \n will be removed +// There's no way to distinguish an empty file and error while reading +QString readTextFile(QString fileName) +{ + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning("Can't read %s", qUtf8Printable(fileName)); + return QString(); + } + + if (file.size() > 4096) { + qWarning("Can't read %s - too large (%lld)", + qUtf8Printable(fileName), file.size()); + return QString(); + } + + QTextStream in(&file); + QString text = in.readAll(); + file.close(); + + if (text.endsWith('\n')) + text.chop(1); + + return text; +} + +// Reads value from /sys/class/net// +// and returns as string +// XXX: reading from sysfs is discouraged +QString sysfsAttrib(const char *device, const char *attribPath) +{ + return readTextFile(QString("/sys/class/net/%1/%2") + .arg(device).arg(attribPath)); +} + +// Convenience overload +QString sysfsAttrib(QString device, const char *attribPath) +{ + return sysfsAttrib(qPrintable(device), attribPath); +} diff --git a/server/linuxutils.h b/server/linuxutils.h new file mode 100644 index 0000000..7665a61 --- /dev/null +++ b/server/linuxutils.h @@ -0,0 +1,29 @@ +/* +Copyright (C) 2021 Srivats P. + +This file is part of "Ostinato" + +This is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +#ifndef _LINUX_UTILS_H +#define _LINUX_UTILS_H + +#include + +QString readTextFile(QString fileName); +QString sysfsAttrib(const char *device, const char *attribPath); +QString sysfsAttrib(QString device, const char *attribPath); + +#endif