xref: /aosp_15_r20/external/cronet/base/process/process_iterator.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/process/process_iterator.h"
6*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker namespace base {
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
ProcessEntry()11*6777b538SAndroid Build Coastguard Worker ProcessEntry::ProcessEntry() : pid_(0), ppid_(0), gid_(0) {}
12*6777b538SAndroid Build Coastguard Worker ProcessEntry::ProcessEntry(const ProcessEntry& other) = default;
13*6777b538SAndroid Build Coastguard Worker ProcessEntry::~ProcessEntry() = default;
14*6777b538SAndroid Build Coastguard Worker #endif
15*6777b538SAndroid Build Coastguard Worker 
NextProcessEntry()16*6777b538SAndroid Build Coastguard Worker const ProcessEntry* ProcessIterator::NextProcessEntry() {
17*6777b538SAndroid Build Coastguard Worker   bool result = false;
18*6777b538SAndroid Build Coastguard Worker   do {
19*6777b538SAndroid Build Coastguard Worker     result = CheckForNextProcess();
20*6777b538SAndroid Build Coastguard Worker   } while (result && !IncludeEntry());
21*6777b538SAndroid Build Coastguard Worker   if (result)
22*6777b538SAndroid Build Coastguard Worker     return &entry_;
23*6777b538SAndroid Build Coastguard Worker   return nullptr;
24*6777b538SAndroid Build Coastguard Worker }
25*6777b538SAndroid Build Coastguard Worker 
Snapshot()26*6777b538SAndroid Build Coastguard Worker ProcessIterator::ProcessEntries ProcessIterator::Snapshot() {
27*6777b538SAndroid Build Coastguard Worker   ProcessEntries found;
28*6777b538SAndroid Build Coastguard Worker   while (const ProcessEntry* process_entry = NextProcessEntry()) {
29*6777b538SAndroid Build Coastguard Worker     found.push_back(*process_entry);
30*6777b538SAndroid Build Coastguard Worker   }
31*6777b538SAndroid Build Coastguard Worker   return found;
32*6777b538SAndroid Build Coastguard Worker }
33*6777b538SAndroid Build Coastguard Worker 
IncludeEntry()34*6777b538SAndroid Build Coastguard Worker bool ProcessIterator::IncludeEntry() {
35*6777b538SAndroid Build Coastguard Worker   return !filter_ || filter_->Includes(entry_);
36*6777b538SAndroid Build Coastguard Worker }
37*6777b538SAndroid Build Coastguard Worker 
NamedProcessIterator(const FilePath::StringType & executable_name,const ProcessFilter * filter,bool use_prefix_match)38*6777b538SAndroid Build Coastguard Worker NamedProcessIterator::NamedProcessIterator(
39*6777b538SAndroid Build Coastguard Worker     const FilePath::StringType& executable_name,
40*6777b538SAndroid Build Coastguard Worker     const ProcessFilter* filter,
41*6777b538SAndroid Build Coastguard Worker     bool use_prefix_match)
42*6777b538SAndroid Build Coastguard Worker     : ProcessIterator(filter),
43*6777b538SAndroid Build Coastguard Worker       executable_name_(executable_name),
44*6777b538SAndroid Build Coastguard Worker       use_prefix_match_(use_prefix_match) {
45*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
46*6777b538SAndroid Build Coastguard Worker   // On Android, the process name contains only the last 15 characters, which
47*6777b538SAndroid Build Coastguard Worker   // is in file /proc/<pid>/stat, the string between open parenthesis and close
48*6777b538SAndroid Build Coastguard Worker   // parenthesis. Please See ProcessIterator::CheckForNextProcess for details.
49*6777b538SAndroid Build Coastguard Worker   // Now if the length of input process name is greater than 15, only save the
50*6777b538SAndroid Build Coastguard Worker   // last 15 characters.
51*6777b538SAndroid Build Coastguard Worker   if (executable_name_.size() > 15) {
52*6777b538SAndroid Build Coastguard Worker     executable_name_ = FilePath::StringType(executable_name_,
53*6777b538SAndroid Build Coastguard Worker                                             executable_name_.size() - 15, 15);
54*6777b538SAndroid Build Coastguard Worker   }
55*6777b538SAndroid Build Coastguard Worker #endif
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker NamedProcessIterator::~NamedProcessIterator() = default;
59*6777b538SAndroid Build Coastguard Worker 
GetProcessCount(const FilePath::StringType & executable_name,const ProcessFilter * filter)60*6777b538SAndroid Build Coastguard Worker int GetProcessCount(const FilePath::StringType& executable_name,
61*6777b538SAndroid Build Coastguard Worker                     const ProcessFilter* filter) {
62*6777b538SAndroid Build Coastguard Worker   int count = 0;
63*6777b538SAndroid Build Coastguard Worker   NamedProcessIterator iter(executable_name, filter);
64*6777b538SAndroid Build Coastguard Worker   while (iter.NextProcessEntry())
65*6777b538SAndroid Build Coastguard Worker     ++count;
66*6777b538SAndroid Build Coastguard Worker   return count;
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker }  // namespace base
70