kiran-cc-daemon/0026-fix-systeminfo-fix-std-regex-can-not-run-in-gcc-vers.patch

122 lines
4.1 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 762c2907fb52dfdebec779c33883a6589d458c0d Mon Sep 17 00:00:00 2001
From: yangfeng <yangfeng@kylinsec.com.cn>
Date: Thu, 5 Sep 2024 14:13:56 +0800
Subject: [PATCH 26/27] fix(systeminfo): fix std::regex can not run in gcc
version < 4.9
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 修复gcc4.9以下不支持std::regex问题
Related #48386
---
plugins/systeminfo/systeminfo-hardware.cpp | 69 +++++++++-------------
1 file changed, 28 insertions(+), 41 deletions(-)
diff --git a/plugins/systeminfo/systeminfo-hardware.cpp b/plugins/systeminfo/systeminfo-hardware.cpp
index 706a10d..e494e52 100644
--- a/plugins/systeminfo/systeminfo-hardware.cpp
+++ b/plugins/systeminfo/systeminfo-hardware.cpp
@@ -15,11 +15,11 @@
#include "plugins/systeminfo/systeminfo-hardware.h"
#include <gio/gunixinputstream.h>
+#include <glib.h>
#include <glibtop/mem.h>
#include <gudev/gudev.h>
#include <cinttypes>
#include <fstream>
-#include <regex>
namespace Kiran
{
@@ -254,57 +254,44 @@ DiskInfoVec SystemInfoHardware::get_disks_info()
}
auto lines = StrUtils::split_lines(cmd_output);
+ GRegex* pattern = g_regex_new(R"(NAME=\"([^\"]*)\" TYPE=\"([^\"]*)\" SIZE=\"(\d+)\" MODEL=\"([^\"]*)\" VENDOR=\"([^\"]*)\")", G_REGEX_MULTILINE, (GRegexMatchFlags)0, NULL);
for (auto& line : lines)
{
- std::regex pattern(R"(NAME=\"([^\"]*)\" TYPE=\"([^\"]*)\" SIZE=\"(\d+)\" MODEL=\"([^\"]*)\" VENDOR=\"([^\"]*)\")");
- std::smatch matches;
- if (std::regex_search(line, matches, pattern))
+ GMatchInfo* match_info;
+ if (g_regex_match(pattern, line.c_str(), (GRegexMatchFlags)0, &match_info))
{
- if (matches[2].str() != "disk")
+ const gchar* name = g_match_info_fetch(match_info, 1);
+ const gchar* type = g_match_info_fetch(match_info, 2);
+ const gchar* size = g_match_info_fetch(match_info, 3);
+ const gchar* model = g_match_info_fetch(match_info, 4);
+ const gchar* vendor = g_match_info_fetch(match_info, 5);
+
+ if (strcmp(type, "disk") == 0 &&
+ (name && strlen(name) > 0) &&
+ (size && strlen(size) > 0) &&
+ ((model && strlen(model) > 0) || (vendor && strlen(vendor) > 0)))
{
- continue;
+ DiskInfo disk_info;
+ disk_info.name = name;
+ disk_info.size = atoll(size);
+ disk_info.model = (strlen(model) ? model : name);
+ disk_info.vendor = (strlen(vendor) ? vendor : name);
+ disks_info.push_back(disk_info);
}
- int matched_count = 0;
- for (size_t i = 1; i < matches.size(); ++i)
- {
- if (matches[i].str().size() > 0)
- {
- matched_count++;
- }
- }
- // model和vendor只要有一个不为空则认为合法所以只要能读到4个变量即可
- if (matched_count < 4)
- {
- continue;
- }
- DiskInfo disk_info;
- if (matches[1].str().size() > 0)
- {
- disk_info.name = matches[1].str();
- }
- if (matches[3].str().size() > 0)
- {
- disk_info.size = std::stoll(matches[3].str());
- }
- if (matches[4].str().size() > 0)
- {
- disk_info.model = matches[4].str();
- }
- else
- {
- disk_info.model = disk_info.name;
- }
- if (matches[5].str().size() > 0)
- {
- disk_info.vendor = matches[5].str();
- }
+ if (name) g_free((gchar*)name);
+ if (type) g_free((gchar*)type);
+ if (size) g_free((gchar*)size);
+ if (model) g_free((gchar*)model);
+ if (vendor) g_free((gchar*)vendor);
- disks_info.push_back(disk_info);
+ g_match_info_free(match_info);
}
}
+ g_regex_unref(pattern);
+
return disks_info;
}
--
2.27.0