Skip to content

Commit 4fccd4d

Browse files
committed
fix(deepin-os-release): Filter out RDRAND hardware random warnings to ensure clean output
This fix adds a pipe-based stderr filter using QThread, precisely discarding the known RDRAND warning lines while preserving all other stderr messages.
1 parent fe3f8ff commit 4fccd4d

1 file changed

Lines changed: 51 additions & 0 deletions

File tree

tools/deepin-os-release/main.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
//
33
// SPDX-License-Identifier: LGPL-3.0-or-later
44

5+
#define _GNU_SOURCE
6+
57
#include "dsysinfo.h"
68

79
#include <QCoreApplication>
@@ -11,9 +13,41 @@
1113
#include <QFile>
1214

1315
#include <stdio.h>
16+
#include <unistd.h>
17+
#include <cstring>
1418

1519
DCORE_USE_NAMESPACE
1620

21+
class StderrFilterThread : public QThread
22+
{
23+
public:
24+
explicit StderrFilterThread(int origStderr, int readFd, QObject *parent = nullptr)
25+
: QThread(parent), m_origStderr(origStderr), m_readFd(readFd) {}
26+
27+
protected:
28+
void run() override
29+
{
30+
FILE *readEnd = fdopen(m_readFd, "r");
31+
if (!readEnd) return;
32+
33+
char *line = nullptr;
34+
size_t len = 0;
35+
while (getline(&line, &len, readEnd) != -1) {
36+
if (strstr(line, "WARNING: CPU random generator seem to be failing") ||
37+
strstr(line, "WARNING: RDRND generated:")) {
38+
continue; // 丢弃该行
39+
}
40+
write(m_origStderr, line, strlen(line));
41+
}
42+
free(line);
43+
fclose(readEnd);
44+
}
45+
46+
private:
47+
int m_origStderr;
48+
int m_readFd;
49+
};
50+
1751
bool distributionInfoValid() {
1852
return QFile::exists(DSysInfo::distributionInfoPath());
1953
}
@@ -27,6 +61,16 @@ void printDistributionOrgInfo(DSysInfo::OrgType type) {
2761

2862
int main(int argc, char *argv[])
2963
{
64+
// 设置过滤器
65+
int origStderr = dup(STDERR_FILENO);
66+
int pipefd[2];
67+
pipe(pipefd);
68+
dup2(pipefd[1], STDERR_FILENO);
69+
close(pipefd[1]);
70+
71+
StderrFilterThread *filterThread = new StderrFilterThread(origStderr, pipefd[0]);
72+
filterThread->start();
73+
3074
QCoreApplication app(argc, argv);
3175
Q_UNUSED(app)
3276

@@ -123,5 +167,12 @@ int main(int argc, char *argv[])
123167
}
124168
}
125169

170+
// 清理
171+
dup2(origStderr, STDERR_FILENO); // 恢复 stderr
172+
close(origStderr);
173+
174+
filterThread->wait();
175+
delete filterThread;
176+
126177
return 0;
127178
}

0 commit comments

Comments
 (0)