kde-workspace/libs/ksysguard/lsofui/lsof.cpp
Ivailo Monev e72cd26f84 libs: clear the line buffer on each iteration in KLsofWidget::finished()
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
2022-10-28 04:08:43 +03:00

99 lines
2.3 KiB
C++

#include <QString>
#include <QProcess>
#include <klocale.h>
#include "lsof.h"
struct KLsofWidgetPrivate
{
qlonglong pid;
QProcess *process;
};
KLsofWidget::KLsofWidget(QWidget *parent)
: QTreeWidget(parent), d(new KLsofWidgetPrivate())
{
d->pid = -1;
setColumnCount(3);
setUniformRowHeights(true);
setRootIsDecorated(false);
setItemsExpandable(false);
setSortingEnabled(true);
setAllColumnsShowFocus(true);
setHeaderLabels(QStringList() << i18nc("Short for File Descriptor", "FD") << i18n("Type") << i18n("Object"));
d->process = new QProcess(this);
connect(d->process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(finished(int,QProcess::ExitStatus)));
}
KLsofWidget::~KLsofWidget()
{
delete d;
}
qlonglong KLsofWidget::pid() const
{
return d->pid;
}
void KLsofWidget::setPid(qlonglong pid)
{
d->pid = pid;
update();
}
bool KLsofWidget::update()
{
clear();
QStringList args;
d->process->waitForFinished();
args << "-Fftn";
if (d->pid > 0) {
args << ("-p" + QString::number(d->pid));
}
d->process->start("lsof", args);
return true;
}
void KLsofWidget::finished(int exitCode, QProcess::ExitStatus exitStatus)
{
Q_UNUSED(exitCode);
Q_UNUSED(exitStatus);
char buf[1024];
QTreeWidgetItem *process = NULL;
while (true) {
::memset(buf, '\0', sizeof(buf) * sizeof(char));
qint64 lineLength = d->process->readLine(buf, sizeof(buf));
if (lineLength <= 0) {
break;
}
if (buf[lineLength-1] == '\n') {
lineLength--;
}
switch(buf[0]) {
/* Process related stuff */
case 'f': {
process = new QTreeWidgetItem(this);
process->setText(0,QString::fromUtf8(buf+1, lineLength - 1));
break;
}
case 't': {
if (process)
process->setText(1,QString::fromUtf8(buf+1, lineLength - 1));
break;
}
case 'n': {
if (process)
process->setText(2,QString::fromUtf8(buf+1, lineLength - 1));
break;
}
default: {
break;
}
}
}
}
#include "moc_lsof.cpp"