xref: /src/contrib/llvm-project/lldb/source/Utility/ProcessInfo.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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