1cfca06d7SDimitry Andric //===-- ProcessInfo.cpp ---------------------------------------------------===//
25f29bb8aSDimitry Andric //
35f29bb8aSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f29bb8aSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55f29bb8aSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f29bb8aSDimitry Andric //
75f29bb8aSDimitry Andric //===----------------------------------------------------------------------===//
85f29bb8aSDimitry Andric
95f29bb8aSDimitry Andric #include "lldb/Utility/ProcessInfo.h"
105f29bb8aSDimitry Andric
115f29bb8aSDimitry Andric #include "lldb/Utility/ArchSpec.h"
127fa27ce4SDimitry Andric #include "lldb/Utility/ScriptedMetadata.h"
135f29bb8aSDimitry Andric #include "lldb/Utility/Stream.h"
145f29bb8aSDimitry Andric #include "lldb/Utility/StreamString.h"
155f29bb8aSDimitry Andric #include "lldb/Utility/UserIDResolver.h"
165f29bb8aSDimitry Andric #include "llvm/ADT/SmallString.h"
175f29bb8aSDimitry Andric
185f29bb8aSDimitry Andric #include <climits>
19e3b55780SDimitry Andric #include <optional>
205f29bb8aSDimitry Andric
215f29bb8aSDimitry Andric using namespace lldb;
225f29bb8aSDimitry Andric using namespace lldb_private;
235f29bb8aSDimitry Andric
ProcessInfo()245f29bb8aSDimitry Andric ProcessInfo::ProcessInfo()
257fa27ce4SDimitry Andric : m_executable(), m_arguments(), m_environment(), m_arch(), m_listener_sp(),
267fa27ce4SDimitry Andric m_hijack_listener_sp(), m_shadow_listener_sp() {}
275f29bb8aSDimitry Andric
ProcessInfo(const char * name,const ArchSpec & arch,lldb::pid_t pid)285f29bb8aSDimitry Andric ProcessInfo::ProcessInfo(const char *name, const ArchSpec &arch,
295f29bb8aSDimitry Andric lldb::pid_t pid)
30145449b1SDimitry Andric : m_executable(name), m_arguments(), m_environment(), m_arch(arch),
317fa27ce4SDimitry Andric m_pid(pid), m_listener_sp(), m_hijack_listener_sp(),
327fa27ce4SDimitry Andric m_shadow_listener_sp() {}
335f29bb8aSDimitry Andric
Clear()345f29bb8aSDimitry Andric void ProcessInfo::Clear() {
355f29bb8aSDimitry Andric m_executable.Clear();
365f29bb8aSDimitry Andric m_arguments.Clear();
375f29bb8aSDimitry Andric m_environment.clear();
385f29bb8aSDimitry Andric m_uid = UINT32_MAX;
395f29bb8aSDimitry Andric m_gid = UINT32_MAX;
405f29bb8aSDimitry Andric m_arch.Clear();
415f29bb8aSDimitry Andric m_pid = LLDB_INVALID_PROCESS_ID;
427fa27ce4SDimitry Andric m_scripted_metadata_sp.reset();
435f29bb8aSDimitry Andric }
445f29bb8aSDimitry Andric
GetName() const455f29bb8aSDimitry Andric const char *ProcessInfo::GetName() const {
465f29bb8aSDimitry Andric return m_executable.GetFilename().GetCString();
475f29bb8aSDimitry Andric }
485f29bb8aSDimitry Andric
GetNameAsStringRef() const49ead24645SDimitry Andric llvm::StringRef ProcessInfo::GetNameAsStringRef() const {
50ead24645SDimitry Andric return m_executable.GetFilename().GetStringRef();
515f29bb8aSDimitry Andric }
525f29bb8aSDimitry Andric
Dump(Stream & s,Platform * platform) const535f29bb8aSDimitry Andric void ProcessInfo::Dump(Stream &s, Platform *platform) const {
545f29bb8aSDimitry Andric s << "Executable: " << GetName() << "\n";
555f29bb8aSDimitry Andric s << "Triple: ";
56706b4fc4SDimitry Andric m_arch.DumpTriple(s.AsRawOstream());
575f29bb8aSDimitry Andric s << "\n";
585f29bb8aSDimitry Andric
595f29bb8aSDimitry Andric s << "Arguments:\n";
605f29bb8aSDimitry Andric m_arguments.Dump(s);
615f29bb8aSDimitry Andric
625f29bb8aSDimitry Andric s.Format("Environment:\n{0}", m_environment);
635f29bb8aSDimitry Andric }
645f29bb8aSDimitry Andric
SetExecutableFile(const FileSpec & exe_file,bool add_exe_file_as_first_arg)655f29bb8aSDimitry Andric void ProcessInfo::SetExecutableFile(const FileSpec &exe_file,
665f29bb8aSDimitry Andric bool add_exe_file_as_first_arg) {
675f29bb8aSDimitry Andric if (exe_file) {
685f29bb8aSDimitry Andric m_executable = exe_file;
695f29bb8aSDimitry Andric if (add_exe_file_as_first_arg) {
705f29bb8aSDimitry Andric llvm::SmallString<128> filename;
715f29bb8aSDimitry Andric exe_file.GetPath(filename);
725f29bb8aSDimitry Andric if (!filename.empty())
735f29bb8aSDimitry Andric m_arguments.InsertArgumentAtIndex(0, filename);
745f29bb8aSDimitry Andric }
755f29bb8aSDimitry Andric } else {
765f29bb8aSDimitry Andric m_executable.Clear();
775f29bb8aSDimitry Andric }
785f29bb8aSDimitry Andric }
795f29bb8aSDimitry Andric
GetArg0() const805f29bb8aSDimitry Andric llvm::StringRef ProcessInfo::GetArg0() const { return m_arg0; }
815f29bb8aSDimitry Andric
SetArg0(llvm::StringRef arg)82cfca06d7SDimitry Andric void ProcessInfo::SetArg0(llvm::StringRef arg) { m_arg0 = std::string(arg); }
835f29bb8aSDimitry Andric
SetArguments(char const ** argv,bool first_arg_is_executable)845f29bb8aSDimitry Andric void ProcessInfo::SetArguments(char const **argv,
855f29bb8aSDimitry Andric bool first_arg_is_executable) {
865f29bb8aSDimitry Andric m_arguments.SetArguments(argv);
875f29bb8aSDimitry Andric
885f29bb8aSDimitry Andric // Is the first argument the executable?
895f29bb8aSDimitry Andric if (first_arg_is_executable) {
905f29bb8aSDimitry Andric const char *first_arg = m_arguments.GetArgumentAtIndex(0);
915f29bb8aSDimitry Andric if (first_arg) {
925f29bb8aSDimitry Andric // Yes the first argument is an executable, set it as the executable in
935f29bb8aSDimitry Andric // the launch options. Don't resolve the file path as the path could be a
945f29bb8aSDimitry Andric // remote platform path
955f29bb8aSDimitry Andric m_executable.SetFile(first_arg, FileSpec::Style::native);
965f29bb8aSDimitry Andric }
975f29bb8aSDimitry Andric }
985f29bb8aSDimitry Andric }
995f29bb8aSDimitry Andric
SetArguments(const Args & args,bool first_arg_is_executable)1005f29bb8aSDimitry Andric void ProcessInfo::SetArguments(const Args &args, bool first_arg_is_executable) {
1015f29bb8aSDimitry Andric // Copy all arguments
1025f29bb8aSDimitry Andric m_arguments = args;
1035f29bb8aSDimitry Andric
1045f29bb8aSDimitry Andric // Is the first argument the executable?
1055f29bb8aSDimitry Andric if (first_arg_is_executable) {
1065f29bb8aSDimitry Andric const char *first_arg = m_arguments.GetArgumentAtIndex(0);
1075f29bb8aSDimitry Andric if (first_arg) {
1085f29bb8aSDimitry Andric // Yes the first argument is an executable, set it as the executable in
1095f29bb8aSDimitry Andric // the launch options. Don't resolve the file path as the path could be a
1105f29bb8aSDimitry Andric // remote platform path
1115f29bb8aSDimitry Andric m_executable.SetFile(first_arg, FileSpec::Style::native);
1125f29bb8aSDimitry Andric }
1135f29bb8aSDimitry Andric }
1145f29bb8aSDimitry Andric }
1155f29bb8aSDimitry Andric
IsScriptedProcess() const1167fa27ce4SDimitry Andric bool ProcessInfo::IsScriptedProcess() const {
1177fa27ce4SDimitry Andric return m_scripted_metadata_sp && *m_scripted_metadata_sp;
1187fa27ce4SDimitry Andric }
1197fa27ce4SDimitry Andric
Dump(Stream & s,UserIDResolver & resolver) const1205f29bb8aSDimitry Andric void ProcessInstanceInfo::Dump(Stream &s, UserIDResolver &resolver) const {
1215f29bb8aSDimitry Andric if (m_pid != LLDB_INVALID_PROCESS_ID)
1225f29bb8aSDimitry Andric s.Printf(" pid = %" PRIu64 "\n", m_pid);
1235f29bb8aSDimitry Andric
124ac9a064cSDimitry Andric if (ParentProcessIDIsValid())
125ac9a064cSDimitry Andric s.Printf(" parent = %" PRIu64 "\n", GetParentProcessID());
1265f29bb8aSDimitry Andric
1275f29bb8aSDimitry Andric if (m_executable) {
1285f29bb8aSDimitry Andric s.Printf(" name = %s\n", m_executable.GetFilename().GetCString());
1295f29bb8aSDimitry Andric s.PutCString(" file = ");
130706b4fc4SDimitry Andric m_executable.Dump(s.AsRawOstream());
1315f29bb8aSDimitry Andric s.EOL();
1325f29bb8aSDimitry Andric }
1335f29bb8aSDimitry Andric const uint32_t argc = m_arguments.GetArgumentCount();
1345f29bb8aSDimitry Andric if (argc > 0) {
1355f29bb8aSDimitry Andric for (uint32_t i = 0; i < argc; i++) {
1365f29bb8aSDimitry Andric const char *arg = m_arguments.GetArgumentAtIndex(i);
1375f29bb8aSDimitry Andric if (i < 10)
1385f29bb8aSDimitry Andric s.Printf(" arg[%u] = %s\n", i, arg);
1395f29bb8aSDimitry Andric else
1405f29bb8aSDimitry Andric s.Printf("arg[%u] = %s\n", i, arg);
1415f29bb8aSDimitry Andric }
1425f29bb8aSDimitry Andric }
1435f29bb8aSDimitry Andric
1445f29bb8aSDimitry Andric s.Format("{0}", m_environment);
1455f29bb8aSDimitry Andric
1465f29bb8aSDimitry Andric if (m_arch.IsValid()) {
1475f29bb8aSDimitry Andric s.Printf(" arch = ");
148706b4fc4SDimitry Andric m_arch.DumpTriple(s.AsRawOstream());
1495f29bb8aSDimitry Andric s.EOL();
1505f29bb8aSDimitry Andric }
1515f29bb8aSDimitry Andric
1525f29bb8aSDimitry Andric if (UserIDIsValid()) {
1535f29bb8aSDimitry Andric s.Format(" uid = {0,-5} ({1})\n", GetUserID(),
154145449b1SDimitry Andric resolver.GetUserName(GetUserID()).value_or(""));
1555f29bb8aSDimitry Andric }
1565f29bb8aSDimitry Andric if (GroupIDIsValid()) {
1575f29bb8aSDimitry Andric s.Format(" gid = {0,-5} ({1})\n", GetGroupID(),
158145449b1SDimitry Andric resolver.GetGroupName(GetGroupID()).value_or(""));
1595f29bb8aSDimitry Andric }
1605f29bb8aSDimitry Andric if (EffectiveUserIDIsValid()) {
1615f29bb8aSDimitry Andric s.Format(" euid = {0,-5} ({1})\n", GetEffectiveUserID(),
162145449b1SDimitry Andric resolver.GetUserName(GetEffectiveUserID()).value_or(""));
1635f29bb8aSDimitry Andric }
1645f29bb8aSDimitry Andric if (EffectiveGroupIDIsValid()) {
1655f29bb8aSDimitry Andric s.Format(" egid = {0,-5} ({1})\n", GetEffectiveGroupID(),
166145449b1SDimitry Andric resolver.GetGroupName(GetEffectiveGroupID()).value_or(""));
1675f29bb8aSDimitry Andric }
1685f29bb8aSDimitry Andric }
1695f29bb8aSDimitry Andric
DumpTableHeader(Stream & s,bool show_args,bool verbose)1705f29bb8aSDimitry Andric void ProcessInstanceInfo::DumpTableHeader(Stream &s, bool show_args,
1715f29bb8aSDimitry Andric bool verbose) {
1725f29bb8aSDimitry Andric const char *label;
1735f29bb8aSDimitry Andric if (show_args || verbose)
1745f29bb8aSDimitry Andric label = "ARGUMENTS";
1755f29bb8aSDimitry Andric else
1765f29bb8aSDimitry Andric label = "NAME";
1775f29bb8aSDimitry Andric
1785f29bb8aSDimitry Andric if (verbose) {
1795f29bb8aSDimitry Andric s.Printf("PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE "
1805f29bb8aSDimitry Andric " %s\n",
1815f29bb8aSDimitry Andric label);
182ead24645SDimitry Andric s.PutCString(
183ead24645SDimitry Andric "====== ====== ========== ========== ========== ========== "
184ead24645SDimitry Andric "============================== ============================\n");
1855f29bb8aSDimitry Andric } else {
186ead24645SDimitry Andric s.Printf("PID PARENT USER TRIPLE %s\n",
187ead24645SDimitry Andric label);
188ead24645SDimitry Andric s.PutCString("====== ====== ========== ============================== "
1895f29bb8aSDimitry Andric "============================\n");
1905f29bb8aSDimitry Andric }
1915f29bb8aSDimitry Andric }
1925f29bb8aSDimitry Andric
DumpAsTableRow(Stream & s,UserIDResolver & resolver,bool show_args,bool verbose) const1935f29bb8aSDimitry Andric void ProcessInstanceInfo::DumpAsTableRow(Stream &s, UserIDResolver &resolver,
1945f29bb8aSDimitry Andric bool show_args, bool verbose) const {
1955f29bb8aSDimitry Andric if (m_pid != LLDB_INVALID_PROCESS_ID) {
196ac9a064cSDimitry Andric s.Printf("%-6" PRIu64 " %-6" PRIu64 " ", m_pid,
197ac9a064cSDimitry Andric (ParentProcessIDIsValid()) ? GetParentProcessID() : 0);
1985f29bb8aSDimitry Andric
1995f29bb8aSDimitry Andric StreamString arch_strm;
2005f29bb8aSDimitry Andric if (m_arch.IsValid())
201706b4fc4SDimitry Andric m_arch.DumpTriple(arch_strm.AsRawOstream());
2025f29bb8aSDimitry Andric
203ead24645SDimitry Andric auto print = [&](bool (ProcessInstanceInfo::*isValid)() const,
204ead24645SDimitry Andric uint32_t (ProcessInstanceInfo::*getID)() const,
205e3b55780SDimitry Andric std::optional<llvm::StringRef> (UserIDResolver::*getName)(
2065f29bb8aSDimitry Andric UserIDResolver::id_t id)) {
207ead24645SDimitry Andric const char *format = "{0,-10} ";
208ead24645SDimitry Andric if (!(this->*isValid)()) {
209ead24645SDimitry Andric s.Format(format, "");
210ead24645SDimitry Andric return;
211ead24645SDimitry Andric }
212ead24645SDimitry Andric uint32_t id = (this->*getID)();
213ead24645SDimitry Andric if (auto name = (resolver.*getName)(id))
214ead24645SDimitry Andric s.Format(format, *name);
2155f29bb8aSDimitry Andric else
216ead24645SDimitry Andric s.Format(format, id);
2175f29bb8aSDimitry Andric };
2185f29bb8aSDimitry Andric if (verbose) {
219ead24645SDimitry Andric print(&ProcessInstanceInfo::UserIDIsValid,
220ead24645SDimitry Andric &ProcessInstanceInfo::GetUserID, &UserIDResolver::GetUserName);
221ead24645SDimitry Andric print(&ProcessInstanceInfo::GroupIDIsValid,
222ead24645SDimitry Andric &ProcessInstanceInfo::GetGroupID, &UserIDResolver::GetGroupName);
223ead24645SDimitry Andric print(&ProcessInstanceInfo::EffectiveUserIDIsValid,
224ead24645SDimitry Andric &ProcessInstanceInfo::GetEffectiveUserID,
225ead24645SDimitry Andric &UserIDResolver::GetUserName);
226ead24645SDimitry Andric print(&ProcessInstanceInfo::EffectiveGroupIDIsValid,
227ead24645SDimitry Andric &ProcessInstanceInfo::GetEffectiveGroupID,
228ead24645SDimitry Andric &UserIDResolver::GetGroupName);
2295f29bb8aSDimitry Andric
230ead24645SDimitry Andric s.Printf("%-30s ", arch_strm.GetData());
2315f29bb8aSDimitry Andric } else {
232ead24645SDimitry Andric print(&ProcessInstanceInfo::EffectiveUserIDIsValid,
233ead24645SDimitry Andric &ProcessInstanceInfo::GetEffectiveUserID,
234ead24645SDimitry Andric &UserIDResolver::GetUserName);
235ead24645SDimitry Andric s.Printf("%-30s ", arch_strm.GetData());
2365f29bb8aSDimitry Andric }
2375f29bb8aSDimitry Andric
2385f29bb8aSDimitry Andric if (verbose || show_args) {
239ead24645SDimitry Andric s.PutCString(m_arg0);
2405f29bb8aSDimitry Andric const uint32_t argc = m_arguments.GetArgumentCount();
2415f29bb8aSDimitry Andric for (uint32_t i = 0; i < argc; i++) {
2425f29bb8aSDimitry Andric s.PutChar(' ');
2435f29bb8aSDimitry Andric s.PutCString(m_arguments.GetArgumentAtIndex(i));
2445f29bb8aSDimitry Andric }
2455f29bb8aSDimitry Andric } else {
2465f29bb8aSDimitry Andric s.PutCString(GetName());
2475f29bb8aSDimitry Andric }
2485f29bb8aSDimitry Andric
2495f29bb8aSDimitry Andric s.EOL();
2505f29bb8aSDimitry Andric }
2515f29bb8aSDimitry Andric }
2525f29bb8aSDimitry Andric
ArchitectureMatches(const ArchSpec & arch_spec) const253ead24645SDimitry Andric bool ProcessInstanceInfoMatch::ArchitectureMatches(
254ead24645SDimitry Andric const ArchSpec &arch_spec) const {
255ead24645SDimitry Andric return !m_match_info.GetArchitecture().IsValid() ||
256ead24645SDimitry Andric m_match_info.GetArchitecture().IsCompatibleMatch(arch_spec);
257ead24645SDimitry Andric }
258ead24645SDimitry Andric
NameMatches(const char * process_name) const2595f29bb8aSDimitry Andric bool ProcessInstanceInfoMatch::NameMatches(const char *process_name) const {
260ead24645SDimitry Andric if (m_name_match_type == NameMatch::Ignore)
2615f29bb8aSDimitry Andric return true;
2625f29bb8aSDimitry Andric const char *match_name = m_match_info.GetName();
2635f29bb8aSDimitry Andric if (!match_name)
2645f29bb8aSDimitry Andric return true;
2655f29bb8aSDimitry Andric
2665f29bb8aSDimitry Andric return lldb_private::NameMatches(process_name, m_name_match_type, match_name);
2675f29bb8aSDimitry Andric }
2685f29bb8aSDimitry Andric
ProcessIDsMatch(const ProcessInstanceInfo & proc_info) const269ead24645SDimitry Andric bool ProcessInstanceInfoMatch::ProcessIDsMatch(
2705f29bb8aSDimitry Andric const ProcessInstanceInfo &proc_info) const {
2715f29bb8aSDimitry Andric if (m_match_info.ProcessIDIsValid() &&
2725f29bb8aSDimitry Andric m_match_info.GetProcessID() != proc_info.GetProcessID())
2735f29bb8aSDimitry Andric return false;
2745f29bb8aSDimitry Andric
2755f29bb8aSDimitry Andric if (m_match_info.ParentProcessIDIsValid() &&
2765f29bb8aSDimitry Andric m_match_info.GetParentProcessID() != proc_info.GetParentProcessID())
2775f29bb8aSDimitry Andric return false;
278ead24645SDimitry Andric return true;
279ead24645SDimitry Andric }
2805f29bb8aSDimitry Andric
UserIDsMatch(const ProcessInstanceInfo & proc_info) const281ead24645SDimitry Andric bool ProcessInstanceInfoMatch::UserIDsMatch(
282ead24645SDimitry Andric const ProcessInstanceInfo &proc_info) const {
2835f29bb8aSDimitry Andric if (m_match_info.UserIDIsValid() &&
2845f29bb8aSDimitry Andric m_match_info.GetUserID() != proc_info.GetUserID())
2855f29bb8aSDimitry Andric return false;
2865f29bb8aSDimitry Andric
2875f29bb8aSDimitry Andric if (m_match_info.GroupIDIsValid() &&
2885f29bb8aSDimitry Andric m_match_info.GetGroupID() != proc_info.GetGroupID())
2895f29bb8aSDimitry Andric return false;
2905f29bb8aSDimitry Andric
2915f29bb8aSDimitry Andric if (m_match_info.EffectiveUserIDIsValid() &&
2925f29bb8aSDimitry Andric m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID())
2935f29bb8aSDimitry Andric return false;
2945f29bb8aSDimitry Andric
2955f29bb8aSDimitry Andric if (m_match_info.EffectiveGroupIDIsValid() &&
2965f29bb8aSDimitry Andric m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID())
2975f29bb8aSDimitry Andric return false;
2985f29bb8aSDimitry Andric return true;
2995f29bb8aSDimitry Andric }
Matches(const ProcessInstanceInfo & proc_info) const300ead24645SDimitry Andric bool ProcessInstanceInfoMatch::Matches(
301ead24645SDimitry Andric const ProcessInstanceInfo &proc_info) const {
302ead24645SDimitry Andric return ArchitectureMatches(proc_info.GetArchitecture()) &&
303ead24645SDimitry Andric ProcessIDsMatch(proc_info) && UserIDsMatch(proc_info) &&
304ead24645SDimitry Andric NameMatches(proc_info.GetName());
305ead24645SDimitry Andric }
3065f29bb8aSDimitry Andric
MatchAllProcesses() const3075f29bb8aSDimitry Andric bool ProcessInstanceInfoMatch::MatchAllProcesses() const {
3085f29bb8aSDimitry Andric if (m_name_match_type != NameMatch::Ignore)
3095f29bb8aSDimitry Andric return false;
3105f29bb8aSDimitry Andric
3115f29bb8aSDimitry Andric if (m_match_info.ProcessIDIsValid())
3125f29bb8aSDimitry Andric return false;
3135f29bb8aSDimitry Andric
3145f29bb8aSDimitry Andric if (m_match_info.ParentProcessIDIsValid())
3155f29bb8aSDimitry Andric return false;
3165f29bb8aSDimitry Andric
3175f29bb8aSDimitry Andric if (m_match_info.UserIDIsValid())
3185f29bb8aSDimitry Andric return false;
3195f29bb8aSDimitry Andric
3205f29bb8aSDimitry Andric if (m_match_info.GroupIDIsValid())
3215f29bb8aSDimitry Andric return false;
3225f29bb8aSDimitry Andric
3235f29bb8aSDimitry Andric if (m_match_info.EffectiveUserIDIsValid())
3245f29bb8aSDimitry Andric return false;
3255f29bb8aSDimitry Andric
3265f29bb8aSDimitry Andric if (m_match_info.EffectiveGroupIDIsValid())
3275f29bb8aSDimitry Andric return false;
3285f29bb8aSDimitry Andric
3295f29bb8aSDimitry Andric if (m_match_info.GetArchitecture().IsValid())
3305f29bb8aSDimitry Andric return false;
3315f29bb8aSDimitry Andric
3325f29bb8aSDimitry Andric if (m_match_all_users)
3335f29bb8aSDimitry Andric return false;
3345f29bb8aSDimitry Andric
3355f29bb8aSDimitry Andric return true;
3365f29bb8aSDimitry Andric }
3375f29bb8aSDimitry Andric
Clear()3385f29bb8aSDimitry Andric void ProcessInstanceInfoMatch::Clear() {
3395f29bb8aSDimitry Andric m_match_info.Clear();
3405f29bb8aSDimitry Andric m_name_match_type = NameMatch::Ignore;
3415f29bb8aSDimitry Andric m_match_all_users = false;
3425f29bb8aSDimitry Andric }
343